diff --git a/apps/mosquitto_ctrl/client.c b/apps/mosquitto_ctrl/client.c index 391697b8..419317a0 100644 --- a/apps/mosquitto_ctrl/client.c +++ b/apps/mosquitto_ctrl/client.c @@ -56,23 +56,15 @@ static void on_publish(struct mosquitto *mosq, void *obj, int mid, int reason_co static void on_subscribe(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos, const mosquitto_property *properties) { struct mosq_ctrl *ctrl = obj; - char *json_str; if(qos_count == 1){ if(granted_qos[0] < 128){ /* Success */ - json_str = cJSON_PrintUnformatted(ctrl->j_tree); - cJSON_Delete(ctrl->j_tree); - ctrl->j_tree = NULL; - if(json_str == NULL){ - fprintf(stderr, "Error: Out of memory.\n"); - run = 0; - mosquitto_disconnect_v5(mosq, 0, NULL); - } - mosquitto_publish(mosq, NULL, ctrl->request_topic, strlen(json_str), json_str, ctrl->cfg.qos, 0); + mosquitto_publish(mosq, NULL, ctrl->request_topic, (int)strlen(ctrl->payload), ctrl->payload, ctrl->cfg.qos, 0); free(ctrl->request_topic); ctrl->request_topic = NULL; - free(json_str); + free(ctrl->payload); + ctrl->payload = NULL; }else{ if(ctrl->cfg.protocol_version == MQTT_PROTOCOL_V5){ fprintf(stderr, "Subscribe error: %s\n", mosquitto_reason_string(granted_qos[0])); diff --git a/apps/mosquitto_ctrl/dynsec.c b/apps/mosquitto_ctrl/dynsec.c index ecad6cf7..b65c62d0 100644 --- a/apps/mosquitto_ctrl/dynsec.c +++ b/apps/mosquitto_ctrl/dynsec.c @@ -747,7 +747,10 @@ int dynsec_init(int argc, char *argv[]) int dynsec__main(int argc, char *argv[], struct mosq_ctrl *ctrl) { + int rc = -1; + cJSON *j_tree; cJSON *j_commands, *j_command; + if(!strcasecmp(argv[0], "help")){ dynsec__print_usage(); return -1; @@ -763,83 +766,92 @@ int dynsec__main(int argc, char *argv[], struct mosq_ctrl *ctrl) if(ctrl->request_topic == NULL || ctrl->response_topic == NULL){ return MOSQ_ERR_NOMEM; } - ctrl->j_tree = cJSON_CreateObject(); - if(ctrl->j_tree == NULL) return MOSQ_ERR_NOMEM; - j_commands = cJSON_AddArrayToObject(ctrl->j_tree, "commands"); + j_tree = cJSON_CreateObject(); + if(j_tree == NULL) return MOSQ_ERR_NOMEM; + j_commands = cJSON_AddArrayToObject(j_tree, "commands"); if(j_commands == NULL){ - cJSON_Delete(ctrl->j_tree); - ctrl->j_tree = NULL; + cJSON_Delete(j_tree); + j_tree = NULL; return MOSQ_ERR_NOMEM; } j_command = cJSON_CreateObject(); if(j_command == NULL){ - cJSON_Delete(ctrl->j_tree); - ctrl->j_tree = NULL; + cJSON_Delete(j_tree); + j_tree = NULL; return MOSQ_ERR_NOMEM; } cJSON_AddItemToArray(j_commands, j_command); if(!strcasecmp(argv[0], "setDefaultACLAccess")){ - return dynsec__set_default_acl_access(argc-1, &argv[1], j_command); + rc = dynsec__set_default_acl_access(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "getDefaultACLAccess")){ - return dynsec__get_default_acl_access(argc-1, &argv[1], j_command); + rc = dynsec__get_default_acl_access(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "createClient")){ - return dynsec_client__create(argc-1, &argv[1], j_command); + rc = dynsec_client__create(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "deleteClient")){ - return dynsec_client__delete(argc-1, &argv[1], j_command); + rc = dynsec_client__delete(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "getClient")){ - return dynsec_client__get(argc-1, &argv[1], j_command); + rc = dynsec_client__get(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "listClients")){ - return dynsec_client__list_all(argc-1, &argv[1], j_command); + rc = dynsec_client__list_all(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "setClientPassword")){ - return dynsec_client__set_password(argc-1, &argv[1], j_command); + rc = dynsec_client__set_password(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "addClientRole")){ - return dynsec_client__add_remove_role(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_client__add_remove_role(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "removeClientRole")){ - return dynsec_client__add_remove_role(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_client__add_remove_role(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "enableClient")){ - return dynsec_client__enable_disable(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_client__enable_disable(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "disableClient")){ - return dynsec_client__enable_disable(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_client__enable_disable(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "createGroup")){ - return dynsec_group__create(argc-1, &argv[1], j_command); + rc = dynsec_group__create(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "deleteGroup")){ - return dynsec_group__delete(argc-1, &argv[1], j_command); + rc = dynsec_group__delete(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "getGroup")){ - return dynsec_group__get(argc-1, &argv[1], j_command); + rc = dynsec_group__get(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "listGroups")){ - return dynsec_group__list_all(argc-1, &argv[1], j_command); + rc = dynsec_group__list_all(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "addGroupRole")){ - return dynsec_group__add_remove_role(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_group__add_remove_role(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "removeGroupRole")){ - return dynsec_group__add_remove_role(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_group__add_remove_role(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "addGroupClient")){ - return dynsec_group__add_remove_client(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_group__add_remove_client(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "removeGroupClient")){ - return dynsec_group__add_remove_client(argc-1, &argv[1], j_command, argv[0]); + rc = dynsec_group__add_remove_client(argc-1, &argv[1], j_command, argv[0]); }else if(!strcasecmp(argv[0], "setAnonymousGroup")){ - return dynsec_group__set_anonymous(argc-1, &argv[1], j_command); + rc = dynsec_group__set_anonymous(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "getAnonymousGroup")){ - return dynsec_group__get_anonymous(argc-1, &argv[1], j_command); + rc = dynsec_group__get_anonymous(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "createRole")){ - return dynsec_role__create(argc-1, &argv[1], j_command); + rc = dynsec_role__create(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "deleteRole")){ - return dynsec_role__delete(argc-1, &argv[1], j_command); + rc = dynsec_role__delete(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "getRole")){ - return dynsec_role__get(argc-1, &argv[1], j_command); + rc = dynsec_role__get(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "listRoles")){ - return dynsec_role__list_all(argc-1, &argv[1], j_command); + rc = dynsec_role__list_all(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "addRoleACL")){ - return dynsec_role__add_acl(argc-1, &argv[1], j_command); + rc = dynsec_role__add_acl(argc-1, &argv[1], j_command); }else if(!strcasecmp(argv[0], "removeRoleACL")){ - return dynsec_role__remove_acl(argc-1, &argv[1], j_command); + rc = dynsec_role__remove_acl(argc-1, &argv[1], j_command); }else{ fprintf(stderr, "Command '%s' not recognised.\n", argv[0]); return MOSQ_ERR_UNKNOWN; } + + if(rc == MOSQ_ERR_SUCCESS){ + ctrl->payload = cJSON_PrintUnformatted(j_tree); + cJSON_Delete(j_tree); + if(ctrl->payload == NULL){ + fprintf(stderr, "Error: Out of memory.\n"); + return MOSQ_ERR_NOMEM; + } + } return 0; } diff --git a/apps/mosquitto_ctrl/mosquitto_ctrl.h b/apps/mosquitto_ctrl/mosquitto_ctrl.h index a02a43d6..d202a225 100644 --- a/apps/mosquitto_ctrl/mosquitto_ctrl.h +++ b/apps/mosquitto_ctrl/mosquitto_ctrl.h @@ -68,8 +68,9 @@ struct mosq_ctrl { struct mosq_config cfg; char *request_topic; char *response_topic; - cJSON *j_tree; + char *payload; void (*payload_callback)(struct mosq_ctrl *, long , const void *); + void *userdata; }; void init_config(struct mosq_config *cfg);