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) 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; struct mosq_ctrl *ctrl = obj;
char *json_str;
if(qos_count == 1){ if(qos_count == 1){
if(granted_qos[0] < 128){ if(granted_qos[0] < 128){
/* Success */ /* Success */
json_str = cJSON_PrintUnformatted(ctrl->j_tree); mosquitto_publish(mosq, NULL, ctrl->request_topic, (int)strlen(ctrl->payload), ctrl->payload, ctrl->cfg.qos, 0);
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);
free(ctrl->request_topic); free(ctrl->request_topic);
ctrl->request_topic = NULL; ctrl->request_topic = NULL;
free(json_str); free(ctrl->payload);
ctrl->payload = NULL;
}else{ }else{
if(ctrl->cfg.protocol_version == MQTT_PROTOCOL_V5){ if(ctrl->cfg.protocol_version == MQTT_PROTOCOL_V5){
fprintf(stderr, "Subscribe error: %s\n", mosquitto_reason_string(granted_qos[0])); 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 dynsec__main(int argc, char *argv[], struct mosq_ctrl *ctrl)
{ {
int rc = -1;
cJSON *j_tree;
cJSON *j_commands, *j_command; cJSON *j_commands, *j_command;
if(!strcasecmp(argv[0], "help")){ if(!strcasecmp(argv[0], "help")){
dynsec__print_usage(); dynsec__print_usage();
return -1; 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){ if(ctrl->request_topic == NULL || ctrl->response_topic == NULL){
return MOSQ_ERR_NOMEM; return MOSQ_ERR_NOMEM;
} }
ctrl->j_tree = cJSON_CreateObject(); j_tree = cJSON_CreateObject();
if(ctrl->j_tree == NULL) return MOSQ_ERR_NOMEM; if(j_tree == NULL) return MOSQ_ERR_NOMEM;
j_commands = cJSON_AddArrayToObject(ctrl->j_tree, "commands"); j_commands = cJSON_AddArrayToObject(j_tree, "commands");
if(j_commands == NULL){ if(j_commands == NULL){
cJSON_Delete(ctrl->j_tree); cJSON_Delete(j_tree);
ctrl->j_tree = NULL; j_tree = NULL;
return MOSQ_ERR_NOMEM; return MOSQ_ERR_NOMEM;
} }
j_command = cJSON_CreateObject(); j_command = cJSON_CreateObject();
if(j_command == NULL){ if(j_command == NULL){
cJSON_Delete(ctrl->j_tree); cJSON_Delete(j_tree);
ctrl->j_tree = NULL; j_tree = NULL;
return MOSQ_ERR_NOMEM; return MOSQ_ERR_NOMEM;
} }
cJSON_AddItemToArray(j_commands, j_command); cJSON_AddItemToArray(j_commands, j_command);
if(!strcasecmp(argv[0], "setDefaultACLAccess")){ 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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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")){ }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{ }else{
fprintf(stderr, "Command '%s' not recognised.\n", argv[0]); fprintf(stderr, "Command '%s' not recognised.\n", argv[0]);
return MOSQ_ERR_UNKNOWN; 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; return 0;
} }

@ -68,8 +68,9 @@ struct mosq_ctrl {
struct mosq_config cfg; struct mosq_config cfg;
char *request_topic; char *request_topic;
char *response_topic; char *response_topic;
cJSON *j_tree; char *payload;
void (*payload_callback)(struct mosq_ctrl *, long , const void *); void (*payload_callback)(struct mosq_ctrl *, long , const void *);
void *userdata;
}; };
void init_config(struct mosq_config *cfg); void init_config(struct mosq_config *cfg);

Loading…
Cancel
Save