diff --git a/ChangeLog.txt b/ChangeLog.txt index 14d77fb310..5b7124c6b4 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -42,6 +42,8 @@ Clients: option. - Add `-x` to all clients to all the session-expiry-interval property to be easily set for MQTT v5 clients. +- Default behaviour for v5 clients using `-c` is now to use infinite length + sessions, as with v3 clients. Closes #1546. 1.6.8 - 20191128 diff --git a/client/args.txt b/client/args.txt index bb61cb0c9c..e9f2a126f7 100644 --- a/client/args.txt +++ b/client/args.txt @@ -45,7 +45,7 @@ v - RR,SUB (verbose) W - SUB (timeout) w X -x +x - PUB,RR,SUB (session-expiry-interval) Y y Z diff --git a/client/client_shared.c b/client/client_shared.c index b0531fe719..45f0c1b02a 100644 --- a/client/client_shared.c +++ b/client/client_shared.c @@ -155,6 +155,7 @@ void init_config(struct mosq_config *cfg, int pub_or_sub) }else{ cfg->protocol_version = MQTT_PROTOCOL_V311; } + cfg->session_expiry_interval = -1; /* -1 means unset here, the user can't set it to -1. */ } void client_config_cleanup(struct mosq_config *cfg) @@ -366,18 +367,26 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } #endif - if(cfg->protocol_version != 5 && cfg->clean_session == false && (cfg->id_prefix || !cfg->id)){ - fprintf(stderr, "Error: You must provide a client id if you are using the -c option.\n"); - return 1; - } - if(cfg->protocol_version == 5 && cfg->session_expiry_interval > 0){ - if(cfg->session_expiry_interval == UINT32_MAX && (cfg->id_prefix || !cfg->id)){ - fprintf(stderr, "Error: You must provide a client id if you are using an infinite session expiry interval.\n"); - return 1; + if(cfg->protocol_version == 5){ + if(cfg->clean_session == false && cfg->session_expiry_interval == -1){ + /* User hasn't set session-expiry-interval, but has cleared clean + * session so default to persistent session. */ + cfg->session_expiry_interval = UINT32_MAX; } - rc = mosquitto_property_add_int32(&cfg->connect_props, MQTT_PROP_SESSION_EXPIRY_INTERVAL, cfg->session_expiry_interval); - if(rc){ - fprintf(stderr, "Error adding property session-expiry-interval\n"); + if(cfg->session_expiry_interval > 0){ + if(cfg->session_expiry_interval == UINT32_MAX && (cfg->id_prefix || !cfg->id)){ + fprintf(stderr, "Error: You must provide a client id if you are using an infinite session expiry interval.\n"); + return 1; + } + rc = mosquitto_property_add_int32(&cfg->connect_props, MQTT_PROP_SESSION_EXPIRY_INTERVAL, cfg->session_expiry_interval); + if(rc){ + fprintf(stderr, "Error adding property session-expiry-interval\n"); + } + } + }else{ + if(cfg->clean_session == false && (cfg->id_prefix || !cfg->id)){ + fprintf(stderr, "Error: You must provide a client id if you are using the -c option.\n"); + return 1; } }