diff options
author | V.Krishn <vkrishn4@gmail.com> | 2019-12-03 23:27:25 +0530 |
---|---|---|
committer | V.Krishn <vkrishn4@gmail.com> | 2019-12-03 23:27:25 +0530 |
commit | 5f6a441f259d2e309986fc6efb8bac7f2b11d04b (patch) | |
tree | 611b89de1d716339aa4356197bc9602534009b83 /client_shared.c | |
parent | 4b088614689ca526dab0ef1e3d77c66e663bfa94 (diff) | |
download | mqtt-dirpub-5f6a441f259d2e309986fc6efb8bac7f2b11d04b.tar.bz2 |
update to mosquitto-v1.6
Diffstat (limited to 'client_shared.c')
-rw-r--r-- | client_shared.c | 431 |
1 files changed, 309 insertions, 122 deletions
diff --git a/client_shared.c b/client_shared.c index 7c9bd52..4338d37 100644 --- a/client_shared.c +++ b/client_shared.c @@ -34,6 +34,7 @@ Contributors: #endif #include <mosquitto.h> +#include <mqtt_protocol.h> #include "client_shared.h" #ifdef WITH_SOCKS @@ -42,7 +43,7 @@ static int mosquitto__parse_socks_url(struct mosq_config *cfg, char *url); static int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, char *argv[]); -static int check_format(struct mosq_config *cfg, const char *str) +static int check_format(const char *str) { int i; int len; @@ -122,7 +123,7 @@ static int check_format(struct mosq_config *cfg, const char *str) } -void init_config(struct mosq_config *cfg) +void init_config(struct mosq_config *cfg, int pub_or_sub) { memset(cfg, 0, sizeof(*cfg)); cfg->port = -1; @@ -130,8 +131,15 @@ void init_config(struct mosq_config *cfg) cfg->keepalive = 60; cfg->clean_session = true; cfg->eol = true; - cfg->protocol_version = MQTT_PROTOCOL_V311; - + cfg->repeat_count = 1; + cfg->repeat_delay.tv_sec = 0; + cfg->repeat_delay.tv_usec = 0; + if(pub_or_sub == CLIENT_RR){ + cfg->protocol_version = MQTT_PROTOCOL_V5; + cfg->msg_count = 1; + }else{ + cfg->protocol_version = MQTT_PROTOCOL_V311; + } cfg->isfmask = false; cfg->overwrite = false; } @@ -151,13 +159,18 @@ void client_config_cleanup(struct mosq_config *cfg) free(cfg->will_topic); free(cfg->will_payload); free(cfg->format); + free(cfg->response_topic); #ifdef WITH_TLS free(cfg->cafile); free(cfg->capath); free(cfg->certfile); free(cfg->keyfile); free(cfg->ciphers); + free(cfg->tls_alpn); free(cfg->tls_version); + free(cfg->tls_engine); + free(cfg->tls_engine_kpass_sha1); + free(cfg->keyform); # ifdef FINAL_WITH_TLS_PSK free(cfg->psk); free(cfg->psk_identity); @@ -186,6 +199,12 @@ void client_config_cleanup(struct mosq_config *cfg) free(cfg->socks5_username); free(cfg->socks5_password); #endif + mosquitto_property_free_all(&cfg->connect_props); + mosquitto_property_free_all(&cfg->publish_props); + mosquitto_property_free_all(&cfg->subscribe_props); + mosquitto_property_free_all(&cfg->unsubscribe_props); + mosquitto_property_free_all(&cfg->disconnect_props); + mosquitto_property_free_all(&cfg->will_props); //free(cfg->ffmask); //free(cfg->ftoken); @@ -209,7 +228,7 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * #endif args[0] = NULL; - init_config(cfg); + init_config(cfg, pub_or_sub); /* Default config file */ #ifndef WIN32 @@ -223,8 +242,10 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } if(pub_or_sub == CLIENT_PUB){ snprintf(loc, len, "%s/mosquitto_pub", env); - }else{ + }else if(pub_or_sub == CLIENT_SUB){ snprintf(loc, len, "%s/mosquitto_sub", env); + }else{ + snprintf(loc, len, "%s/mosquitto_rr", env); } loc[len-1] = '\0'; }else{ @@ -238,8 +259,10 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } if(pub_or_sub == CLIENT_PUB){ snprintf(loc, len, "%s/.config/mosquitto_pub", env); - }else{ + }else if(pub_or_sub == CLIENT_SUB){ snprintf(loc, len, "%s/.config/mosquitto_sub", env); + }else{ + snprintf(loc, len, "%s/.config/mosquitto_rr", env); } loc[len-1] = '\0'; }else{ @@ -258,8 +281,10 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } if(pub_or_sub == CLIENT_PUB){ snprintf(loc, len, "%s\\mosquitto_pub.conf", env); - }else{ + }else if(pub_or_sub == CLIENT_SUB){ snprintf(loc, len, "%s\\mosquitto_sub.conf", env); + }else{ + snprintf(loc, len, "%s\\mosquitto_rr.conf", env); } loc[len-1] = '\0'; }else{ @@ -316,7 +341,15 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } #ifdef WITH_TLS if((cfg->certfile && !cfg->keyfile) || (cfg->keyfile && !cfg->certfile)){ - fprintf(stderr, "Error: Both certfile and keyfile must be provided if one of them is.\n"); + fprintf(stderr, "Error: Both certfile and keyfile must be provided if one of them is set.\n"); + return 1; + } + if((cfg->keyform && !cfg->keyfile)){ + fprintf(stderr, "Error: If keyform is set, keyfile must be also specified.\n"); + return 1; + } + if((cfg->tls_engine_kpass_sha1 && (!cfg->keyform || !cfg->tls_engine))){ + fprintf(stderr, "Error: when using tls-engine-kpass-sha1, both tls-engine and keyform must also be provided.\n"); return 1; } #endif @@ -344,24 +377,66 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } if(!cfg->host){ - cfg->host = "localhost"; + cfg->host = strdup("localhost"); + if(!cfg->host){ + if(!cfg->quiet) fprintf(stderr, "Error: Out of memory.\n"); + return 1; + } } + + rc = mosquitto_property_check_all(CMD_CONNECT, cfg->connect_props); + if(rc){ + if(!cfg->quiet) fprintf(stderr, "Error in CONNECT properties: %s\n", mosquitto_strerror(rc)); + return 1; + } + rc = mosquitto_property_check_all(CMD_PUBLISH, cfg->publish_props); + if(rc){ + if(!cfg->quiet) fprintf(stderr, "Error in PUBLISH properties: %s\n", mosquitto_strerror(rc)); + return 1; + } + rc = mosquitto_property_check_all(CMD_SUBSCRIBE, cfg->subscribe_props); + if(rc){ + if(!cfg->quiet) fprintf(stderr, "Error in SUBSCRIBE properties: %s\n", mosquitto_strerror(rc)); + return 1; + } + rc = mosquitto_property_check_all(CMD_UNSUBSCRIBE, cfg->unsubscribe_props); + if(rc){ + if(!cfg->quiet) fprintf(stderr, "Error in UNSUBSCRIBE properties: %s\n", mosquitto_strerror(rc)); + return 1; + } + rc = mosquitto_property_check_all(CMD_DISCONNECT, cfg->disconnect_props); + if(rc){ + if(!cfg->quiet) fprintf(stderr, "Error in DISCONNECT properties: %s\n", mosquitto_strerror(rc)); + return 1; + } + rc = mosquitto_property_check_all(CMD_WILL, cfg->will_props); + if(rc){ + if(!cfg->quiet) fprintf(stderr, "Error in Will properties: %s\n", mosquitto_strerror(rc)); + return 1; + } + return MOSQ_ERR_SUCCESS; } -int cfg_add_topic(struct mosq_config *cfg, int pub_or_sub, char *topic, const char *arg) +int cfg_add_topic(struct mosq_config *cfg, int type, char *topic, const char *arg) { if(mosquitto_validate_utf8(topic, strlen(topic))){ fprintf(stderr, "Error: Malformed UTF-8 in %s argument.\n\n", arg); return 1; } - if(pub_or_sub == CLIENT_PUB){ + if(type == CLIENT_PUB || type == CLIENT_RR){ if(mosquitto_pub_topic_check(topic) == MOSQ_ERR_INVAL){ fprintf(stderr, "Error: Invalid publish topic '%s', does it contain '+' or '#'?\n", topic); return 1; } cfg->topic = strdup(topic); - } else { + }else if(type == CLIENT_RESPONSE_TOPIC){ + if(mosquitto_pub_topic_check(topic) == MOSQ_ERR_INVAL){ + fprintf(stderr, "Error: Invalid response topic '%s', does it contain '+' or '#'?\n", topic); + return 1; + } + cfg->response_topic = strdup(topic); + }else{ if(mosquitto_sub_topic_check(topic) == MOSQ_ERR_INVAL){ fprintf(stderr, "Error: Invalid subscription topic '%s', are all '+' and '#' wildcards correct?\n", topic); return 1; @@ -381,21 +456,10 @@ int cfg_add_topic(struct mosq_config *cfg, int pub_or_sub, char *topic, const ch int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, char *argv[]) { int i; + float f; for(i=1; i<argc; i++){ - if(!strcmp(argv[i], "-p") || !strcmp(argv[i], "--port")){ - if(i==argc-1){ - fprintf(stderr, "Error: -p argument given but no port specified.\n\n"); - return 1; - }else{ - cfg->port = atoi(argv[i+1]); - if(cfg->port<1 || cfg->port>65535){ - fprintf(stderr, "Error: Invalid port given: %d\n", cfg->port); - return 1; - } - } - i++; - }else if(!strcmp(argv[i], "-A")){ + if(!strcmp(argv[i], "-A")){ if(i==argc-1){ fprintf(stderr, "Error: -A argument given but no address specified.\n\n"); return 1; @@ -459,7 +523,7 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c i++; #endif }else if(!strcmp(argv[i], "-C")){ - if(pub_or_sub == CLIENT_PUB){ + if(pub_or_sub != CLIENT_SUB){ goto unknown_option; }else{ if(i==argc-1){ @@ -474,24 +538,34 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c } i++; } - }else if(!strcmp(argv[i], "-W")){ - if(pub_or_sub == CLIENT_PUB){ + }else if(!strcmp(argv[i], "-c") || !strcmp(argv[i], "--disable-clean-session")){ + cfg->clean_session = false; + }else if(!strcmp(argv[i], "-d") || !strcmp(argv[i], "--debug")){ + cfg->debug = true; + }else if(!strcmp(argv[i], "-D") || !strcmp(argv[i], "--property")){ + i++; + if(cfg_parse_property(cfg, argc, argv, &i)){ + return 1; + } + cfg->protocol_version = MQTT_PROTOCOL_V5; + }else if(!strcmp(argv[i], "-e")){ + if(pub_or_sub != CLIENT_RR){ goto unknown_option; + } + if(i==argc-1){ + fprintf(stderr, "Error: -e argument given but no response topic specified.\n\n"); + return 1; }else{ - if(i==argc-1){ - fprintf(stderr, "Error: -W argument given but no timeout specified.\n\n"); + if(cfg_add_topic(cfg, CLIENT_RESPONSE_TOPIC, argv[i+1], "-e")){ return 1; - }else{ - cfg->timeout = atoi(argv[i+1]); - if(cfg->timeout < 1){ - fprintf(stderr, "Error: Invalid timeout \"%d\".\n\n", cfg->msg_count); - return 1; - } } - i++; } - }else if(!strcmp(argv[i], "-d") || !strcmp(argv[i], "--debug")){ - cfg->debug = true; + i++; + }else if(!strcmp(argv[i], "-E")){ + if(pub_or_sub != CLIENT_SUB){ + goto unknown_option; + } + cfg->exit_after_sub = true; }else if(!strcmp(argv[i], "-f") || !strcmp(argv[i], "--file")){ if(pub_or_sub == CLIENT_SUB){ goto unknown_option; @@ -524,7 +598,7 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c fprintf(stderr, "Error: Out of memory.\n"); return 1; } - if(check_format(cfg, cfg->format)){ + if(check_format(cfg->format)){ return 1; } } @@ -588,6 +662,14 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c cfg->keyfile = strdup(argv[i+1]); } i++; + }else if(!strcmp(argv[i], "--keyform")){ + if(i==argc-1){ + fprintf(stderr, "Error: --keyform argument given but no keyform specified.\n\n"); + return 1; + }else{ + cfg->keyform = strdup(argv[i+1]); + } + i++; #endif }else if(!strcmp(argv[i], "-L") || !strcmp(argv[i], "--url")){ if(i==argc-1){ @@ -635,7 +717,7 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c } i++; }else if(!strcmp(argv[i], "-l") || !strcmp(argv[i], "--stdin-line")){ - if(pub_or_sub == CLIENT_SUB){ + if(pub_or_sub != CLIENT_PUB){ goto unknown_option; } if(cfg->pub_mode != MSGMODE_NONE){ @@ -678,21 +760,31 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c }else{ cfg->pub_mode = MSGMODE_NULL; } - }else if(!strcmp(argv[i], "-V") || !strcmp(argv[i], "--protocol-version")){ + }else if(!strcmp(argv[i], "-N")){ + if(pub_or_sub == CLIENT_PUB){ + goto unknown_option; + } + cfg->eol = false; + }else if(!strcmp(argv[i], "-p") || !strcmp(argv[i], "--port")){ if(i==argc-1){ - fprintf(stderr, "Error: --protocol-version argument given but no version specified.\n\n"); + fprintf(stderr, "Error: -p argument given but no port specified.\n\n"); return 1; }else{ - if(!strcmp(argv[i+1], "mqttv31")){ - cfg->protocol_version = MQTT_PROTOCOL_V31; - }else if(!strcmp(argv[i+1], "mqttv311")){ - cfg->protocol_version = MQTT_PROTOCOL_V311; - }else{ - fprintf(stderr, "Error: Invalid protocol version argument given.\n\n"); + cfg->port = atoi(argv[i+1]); + if(cfg->port<1 || cfg->port>65535){ + fprintf(stderr, "Error: Invalid port given: %d\n", cfg->port); return 1; } - i++; } + i++; + }else if(!strcmp(argv[i], "-P") || !strcmp(argv[i], "--pw")){ + if(i==argc-1){ + fprintf(stderr, "Error: -P argument given but no password specified.\n\n"); + return 1; + }else{ + cfg->password = strdup(argv[i+1]); + } + i++; #ifdef WITH_SOCKS }else if(!strcmp(argv[i], "--proxy")){ if(i==argc-1){ @@ -738,14 +830,63 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c }else if(!strcmp(argv[i], "--quiet")){ cfg->quiet = true; }else if(!strcmp(argv[i], "-r") || !strcmp(argv[i], "--retain")){ - if(pub_or_sub == CLIENT_SUB){ + if(pub_or_sub != CLIENT_PUB){ goto unknown_option; } cfg->retain = 1; - }else if(!strcmp(argv[i], "--retained-only")){ + }else if(!strcmp(argv[i], "-R")){ if(pub_or_sub == CLIENT_PUB){ goto unknown_option; } + cfg->no_retain = true; + cfg->sub_opts |= MQTT_SUB_OPT_SEND_RETAIN_NEVER; + }else if(!strcmp(argv[i], "--remove-retained")){ + if(pub_or_sub != CLIENT_SUB){ + goto unknown_option; + } + cfg->remove_retained = true; + }else if(!strcmp(argv[i], "--repeat")){ + if(pub_or_sub != CLIENT_PUB){ + goto unknown_option; + } + if(i==argc-1){ + fprintf(stderr, "Error: --repeat argument given but no count specified.\n\n"); + return 1; + }else{ + cfg->repeat_count = atoi(argv[i+1]); + if(cfg->repeat_count < 1){ + fprintf(stderr, "Error: --repeat argument must be >0.\n\n"); + return 1; + } + } + i++; + }else if(!strcmp(argv[i], "--repeat-delay")){ + if(pub_or_sub != CLIENT_PUB){ + goto unknown_option; + } + if(i==argc-1){ + fprintf(stderr, "Error: --repeat-delay argument given but no time specified.\n\n"); + return 1; + }else{ + f = atof(argv[i+1]); + if(f < 0.0f){ + fprintf(stderr, "Error: --repeat-delay argument must be >=0.0.\n\n"); + return 1; + } + f *= 1.0e6; + cfg->repeat_delay.tv_sec = (int)f/1e6; + cfg->repeat_delay.tv_usec = (int)f%1000000; + } + i++; + }else if(!strcmp(argv[i], "--retain-as-published")){ + if(pub_or_sub == CLIENT_PUB){ + goto unknown_option; + } + cfg->sub_opts |= MQTT_SUB_OPT_RETAIN_AS_PUBLISHED; + }else if(!strcmp(argv[i], "--retained-only")){ + if(pub_or_sub != CLIENT_SUB){ + goto unknown_option; + } cfg->retained_only = true; }else if(!strcmp(argv[i], "-s") || !strcmp(argv[i], "--stdin-file")){ if(pub_or_sub == CLIENT_SUB){ @@ -771,7 +912,7 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c i++; } }else if(!strcmp(argv[i], "-T") || !strcmp(argv[i], "--filter-out")){ - if(pub_or_sub == CLIENT_PUB){ + if(pub_or_sub != CLIENT_SUB){ goto unknown_option; } if(i==argc-1){ @@ -795,8 +936,42 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c cfg->filter_outs[cfg->filter_out_count-1] = strdup(argv[i+1]); } i++; +#ifdef WITH_TLS + }else if(!strcmp(argv[i], "--tls-alpn")){ + if(i==argc-1){ + fprintf(stderr, "Error: --tls-alpn argument given but no protocol specified.\n\n"); + return 1; + }else{ + cfg->tls_alpn = strdup(argv[i+1]); + } + i++; + }else if(!strcmp(argv[i], "--tls-engine")){ + if(i==argc-1){ + fprintf(stderr, "Error: --tls-engine argument given but no engine_id specified.\n\n"); + return 1; + }else{ + cfg->tls_engine = strdup(argv[i+1]); + } + i++; + }else if(!strcmp(argv[i], "--tls-engine-kpass-sha1")){ + if(i==argc-1){ + fprintf(stderr, "Error: --tls-engine-kpass-sha1 argument given but no kpass sha1 specified.\n\n"); + return 1; + }else{ + cfg->tls_engine_kpass_sha1 = strdup(argv[i+1]); + } + i++; + }else if(!strcmp(argv[i], "--tls-version")){ + if(i==argc-1){ + fprintf(stderr, "Error: --tls-version argument given but no version specified.\n\n"); + return 1; + }else{ + cfg->tls_version = strdup(argv[i+1]); + } + i++; +#endif }else if(!strcmp(argv[i], "-U") || !strcmp(argv[i], "--unsubscribe")){ - if(pub_or_sub == CLIENT_PUB){ + if(pub_or_sub != CLIENT_SUB){ goto unknown_option; } if(i==argc-1){ @@ -820,16 +995,6 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c cfg->unsub_topics[cfg->unsub_topic_count-1] = strdup(argv[i+1]); } i++; -#ifdef WITH_TLS - }else if(!strcmp(argv[i], "--tls-version")){ - if(i==argc-1){ - fprintf(stderr, "Error: --tls-version argument given but no version specified.\n\n"); - return 1; - }else{ - cfg->tls_version = strdup(argv[i+1]); - } - i++; -#endif }else if(!strcmp(argv[i], "-u") || !strcmp(argv[i], "--username")){ if(i==argc-1){ fprintf(stderr, "Error: -u argument given but no username specified.\n\n"); @@ -838,14 +1003,44 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c cfg->username = strdup(argv[i+1]); } i++; - }else if(!strcmp(argv[i], "-P") || !strcmp(argv[i], "--pw")){ + }else if(!strcmp(argv[i], "-V") || !strcmp(argv[i], "--protocol-version")){ if(i==argc-1){ - fprintf(stderr, "Error: -P argument given but no password specified.\n\n"); + fprintf(stderr, "Error: --protocol-version argument given but no version specified.\n\n"); return 1; }else{ - cfg->password = strdup(argv[i+1]); + if(!strcmp(argv[i+1], "mqttv31") || !strcmp(argv[i+1], "31")){ + cfg->protocol_version = MQTT_PROTOCOL_V31; + }else if(!strcmp(argv[i+1], "mqttv311") || !strcmp(argv[i+1], "311")){ + cfg->protocol_version = MQTT_PROTOCOL_V311; + }else if(!strcmp(argv[i+1], "mqttv5") || !strcmp(argv[i+1], "5")){ + cfg->protocol_version = MQTT_PROTOCOL_V5; + }else{ + fprintf(stderr, "Error: Invalid protocol version argument given.\n\n"); + return 1; + } + i++; + } + }else if(!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")){ + if(pub_or_sub == CLIENT_PUB){ + goto unknown_option; + } + cfg->verbose = 1; + }else if(!strcmp(argv[i], "-W")){ + if(pub_or_sub == CLIENT_PUB){ + goto unknown_option; + }else{ + if(i==argc-1){ + fprintf(stderr, "Error: -W argument given but no timeout specified.\n\n"); + return 1; + }else{ + cfg->timeout = atoi(argv[i+1]); + if(cfg->timeout < 1){ + fprintf(stderr, "Error: Invalid timeout \"%d\".\n\n", cfg->msg_count); + return 1; + } + } + i++; } - i++; }else if(!strcmp(argv[i], "--will-payload")){ if(i==argc-1){ fprintf(stderr, "Error: --will-payload argument given but no will payload specified.\n\n"); @@ -885,23 +1080,6 @@ int client_config_line_proc(struct mosq_config *cfg, int pub_or_sub, int argc, c cfg->will_topic = strdup(argv[i+1]); } i++; - }else if(!strcmp(argv[i], "-c") || !strcmp(argv[i], "--disable-clean-session")){ - cfg->clean_session = false; - }else if(!strcmp(argv[i], "-N")){ - if(pub_or_sub == CLIENT_PUB){ - goto unknown_option; - } - cfg->eol = false; - }else if(!strcmp(argv[i], "-R")){ - if(pub_or_sub == CLIENT_PUB){ - goto unknown_option; - } - cfg->no_retain = true; - }else if(!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")){ - if(pub_or_sub == CLIENT_PUB){ - goto unknown_option; - } - cfg->verbose = 1; }else{ goto unknown_option; } @@ -916,36 +1094,65 @@ unknown_option: int client_opts_set(struct mosquitto *mosq, struct mosq_config *cfg) { -#ifdef WITH_SOCKS +#if defined(WITH_TLS) || defined(WITH_SOCKS) int rc; #endif - if(cfg->will_topic && mosquitto_will_set(mosq, cfg->will_topic, + mosquitto_int_option(mosq, MOSQ_OPT_PROTOCOL_VERSION, cfg->protocol_version); + + if(cfg->will_topic && mosquitto_will_set_v5(mosq, cfg->will_topic, cfg->will_payloadlen, cfg->will_payload, cfg->will_qos, - cfg->will_retain)){ + cfg->will_retain, cfg->will_props)){ if(!cfg->quiet) fprintf(stderr, "Error: Problem setting will.\n"); mosquitto_lib_cleanup(); return 1; } + cfg->will_props = NULL; + if(cfg->username && mosquitto_username_pw_set(mosq, cfg->username, cfg->password)){ if(!cfg->quiet) fprintf(stderr, "Error: Problem setting username and password.\n"); mosquitto_lib_cleanup(); return 1; } #ifdef WITH_TLS - if((cfg->cafile || cfg->capath) - && mosquitto_tls_set(mosq, cfg->cafile, cfg->capath, cfg->certfile, cfg->keyfile, NULL)){ - - if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS options.\n"); - mosquitto_lib_cleanup(); - return 1; + if(cfg->cafile || cfg->capath){ + rc = mosquitto_tls_set(mosq, cfg->cafile, cfg->capath, cfg->certfile, cfg->keyfile, NULL); + if(rc){ + if(rc == MOSQ_ERR_INVAL){ + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS options: File not found.\n"); + }else{ + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS options: %s.\n", mosquitto_strerror(rc)); + } + mosquitto_lib_cleanup(); + return 1; + } } if(cfg->insecure && mosquitto_tls_insecure_set(mosq, true)){ if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS insecure option.\n"); mosquitto_lib_cleanup(); return 1; } + if(cfg->tls_engine && mosquitto_string_option(mosq, MOSQ_OPT_TLS_ENGINE, cfg->tls_engine)){ + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS engine, is %s a valid engine?\n", cfg->tls_engine); + mosquitto_lib_cleanup(); + return 1; + } + if(cfg->keyform && mosquitto_string_option(mosq, MOSQ_OPT_TLS_KEYFORM, cfg->keyform)){ + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting key form, it must be one of 'pem' or 'engine'.\n"); + mosquitto_lib_cleanup(); + return 1; + } + if(cfg->tls_engine_kpass_sha1 && mosquitto_string_option(mosq, MOSQ_OPT_TLS_ENGINE_KPASS_SHA1, cfg->tls_engine_kpass_sha1)){ + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS engine key pass sha, is it a 40 character hex string?\n"); + mosquitto_lib_cleanup(); + return 1; + } + if(cfg->tls_alpn && mosquitto_string_option(mosq, MOSQ_OPT_TLS_ALPN, cfg->tls_alpn)){ + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS ALPN protocol.\n"); + mosquitto_lib_cleanup(); + return 1; + } # ifdef FINAL_WITH_TLS_PSK if(cfg->psk && mosquitto_tls_psk_set(mosq, cfg->psk, cfg->psk_identity, NULL)){ if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS-PSK options.\n"); @@ -954,7 +1161,7 @@ int client_opts_set(struct mosquitto *mosq, struct mosq_config *cfg) } # endif if((cfg->tls_version || cfg->ciphers) && mosquitto_tls_opts_set(mosq, 1, cfg->tls_version, cfg->ciphers)){ - if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS options.\n"); + if(!cfg->quiet) fprintf(stderr, "Error: Problem setting TLS options, check the options are valid.\n"); mosquitto_lib_cleanup(); return 1; } @@ -969,15 +1176,11 @@ int client_opts_set(struct mosquitto *mosq, struct mosq_config *cfg) } } #endif - mosquitto_opts_set(mosq, MOSQ_OPT_PROTOCOL_VERSION, &(cfg->protocol_version)); return MOSQ_ERR_SUCCESS; } -int client_id_generate(struct mosq_config *cfg, const char *id_base) +int client_id_generate(struct mosq_config *cfg) { - int len; - char hostname[256]; - if(cfg->id_prefix){ cfg->id = malloc(strlen(cfg->id_prefix)+10); if(!cfg->id){ @@ -986,22 +1189,6 @@ int client_id_generate(struct mosq_config *cfg, const char *id_base) return 1; } snprintf(cfg->id, strlen(cfg->id_prefix)+10, "%s%d", cfg->id_prefix, getpid()); - }else if(!cfg->id){ - hostname[0] = '\0'; - gethostname(hostname, 256); - hostname[255] = '\0'; - len = strlen(id_base) + strlen("|-") + 6 + strlen(hostname); - cfg->id = malloc(len); - if(!cfg->id){ - if(!cfg->quiet) fprintf(stderr, "Error: Out of memory.\n"); - mosquitto_lib_cleanup(); - return 1; - } - snprintf(cfg->id, len, "%s|%d-%s", id_base, getpid(), hostname); - if(strlen(cfg->id) > MOSQ_MQTT_ID_MAX_LENGTH){ - /* Enforce maximum client id length of 23 characters */ - cfg->id[MOSQ_MQTT_ID_MAX_LENGTH] = '\0'; - } } return MOSQ_ERR_SUCCESS; } @@ -1037,10 +1224,10 @@ int client_connect(struct mosquitto *mosq, struct mosq_config *cfg) if(cfg->use_srv){ rc = mosquitto_connect_srv(mosq, cfg->host, cfg->keepalive, cfg->bind_address); }else{ - rc = mosquitto_connect_bind(mosq, cfg->host, port, cfg->keepalive, cfg->bind_address); + rc = mosquitto_connect_bind_v5(mosq, cfg->host, port, cfg->keepalive, cfg->bind_address, cfg->connect_props); } #else - rc = mosquitto_connect_bind(mosq, cfg->host, port, cfg->keepalive, cfg->bind_address); + rc = mosquitto_connect_bind_v5(mosq, cfg->host, port, cfg->keepalive, cfg->bind_address, cfg->connect_props); #endif if(rc>0){ if(!cfg->quiet){ @@ -1109,11 +1296,11 @@ static int mosquitto__urldecode(char *str) static int mosquitto__parse_socks_url(struct mosq_config *cfg, char *url) { char *str; - int i; + size_t i; char *username = NULL, *password = NULL, *host = NULL, *port = NULL; char *username_or_host = NULL; - int start; - int len; + size_t start; + size_t len; bool have_auth = false; int port_int; |