Ctrl: Client only deals with a payload string, not cJSON.

pull/1886/head
Roger A. Light 5 years ago
parent 2e72d795a9
commit 97385f522b

@ -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]));

@ -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;
}

@ -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);

Loading…
Cancel
Save