aboutsummaryrefslogtreecommitdiff
path: root/client_shared.c
diff options
context:
space:
mode:
authorV.Krishn <vkrishn4@gmail.com>2019-12-03 23:27:25 +0530
committerV.Krishn <vkrishn4@gmail.com>2019-12-03 23:27:25 +0530
commit5f6a441f259d2e309986fc6efb8bac7f2b11d04b (patch)
tree611b89de1d716339aa4356197bc9602534009b83 /client_shared.c
parent4b088614689ca526dab0ef1e3d77c66e663bfa94 (diff)
downloadmqtt-dirpub-5f6a441f259d2e309986fc6efb8bac7f2b11d04b.tar.bz2
update to mosquitto-v1.6
Diffstat (limited to 'client_shared.c')
-rw-r--r--client_shared.c431
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;