From 7046f998f479e11dff626dd298cc7fae4861ff13 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Mon, 22 May 2023 09:26:09 +0800 Subject: [PATCH 1/3] fix: neu_adapter_rename null pointer deref --- src/adapter/adapter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 0f0fc9b6..844e0044 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -222,9 +222,9 @@ int neu_adapter_rename(neu_adapter_t *adapter, const char *new_name) neu_metrics_del_node(adapter); } free(adapter->name); - adapter->name = name; - adapter->metrics->name = name; + adapter->name = name; if (adapter->metrics) { + adapter->metrics->name = name; neu_metrics_add_node(adapter); } From 90aef77588840d7333a368ca009266b06669b50a Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Mon, 22 May 2023 09:26:09 +0800 Subject: [PATCH 2/3] feat(core): add node update message type --- include/neuron/adapter.h | 22 ++++++++++++++++++++++ src/adapter/adapter.c | 10 ++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/neuron/adapter.h b/include/neuron/adapter.h index 0e14e928..61b12b7b 100644 --- a/include/neuron/adapter.h +++ b/include/neuron/adapter.h @@ -55,6 +55,7 @@ typedef enum neu_reqresp_type { NEU_REQ_NODE_UNINIT, NEU_RESP_NODE_UNINIT, NEU_REQ_ADD_NODE, + NEU_REQ_UPDATE_NODE, NEU_REQ_DEL_NODE, NEU_REQ_GET_NODE, NEU_RESP_GET_NODE, @@ -66,6 +67,8 @@ typedef enum neu_reqresp_type { NEU_REQ_GET_NODES_STATE, NEU_RESP_GET_NODES_STATE, NEU_REQ_NODE_CTL, + NEU_REQ_NODE_RENAME, + NEU_RESP_NODE_RENAME, NEU_REQ_ADD_GROUP, NEU_REQ_DEL_GROUP, @@ -144,6 +147,7 @@ static const char *neu_reqresp_type_string_t[] = { [NEU_REQ_NODE_UNINIT] = "NEU_REQ_NODE_UNINIT", [NEU_RESP_NODE_UNINIT] = "NEU_RESP_NODE_UNINIT", [NEU_REQ_ADD_NODE] = "NEU_REQ_ADD_NODE", + [NEU_REQ_UPDATE_NODE] = "NEU_REQ_UPDATE_NODE", [NEU_REQ_DEL_NODE] = "NEU_REQ_DEL_NODE", [NEU_REQ_GET_NODE] = "NEU_REQ_GET_NODE", [NEU_RESP_GET_NODE] = "NEU_RESP_GET_NODE", @@ -155,6 +159,8 @@ static const char *neu_reqresp_type_string_t[] = { [NEU_REQ_GET_NODES_STATE] = "NEU_REQ_GET_NODES_STATE", [NEU_RESP_GET_NODES_STATE] = "NEU_RESP_GET_NODES_STATE", [NEU_REQ_NODE_CTL] = "NEU_REQ_NODE_CTL", + [NEU_REQ_NODE_RENAME] = "NEU_REQ_NODE_RENAME", + [NEU_RESP_NODE_RENAME] = "NEU_RESP_NODE_RENAME", [NEU_REQ_ADD_GROUP] = "NEU_REQ_ADD_GROUP", [NEU_REQ_DEL_GROUP] = "NEU_REQ_DEL_GROUP", @@ -270,6 +276,11 @@ typedef struct neu_req_add_node { char plugin[NEU_PLUGIN_NAME_LEN]; } neu_req_add_node_t; +typedef struct neu_req_update_node { + char node[NEU_NODE_NAME_LEN]; + char new_name[NEU_NODE_NAME_LEN]; +} neu_req_update_node_t; + typedef struct neu_req_del_node { char node[NEU_NODE_NAME_LEN]; } neu_req_del_node_t; @@ -427,6 +438,17 @@ typedef struct neu_req_node_ctl { neu_adapter_ctl_e ctl; } neu_req_node_ctl_t; +typedef struct { + char node[NEU_NODE_NAME_LEN]; + char new_name[NEU_NODE_NAME_LEN]; +} neu_req_node_rename_t; + +typedef struct { + char node[NEU_NODE_NAME_LEN]; + char new_name[NEU_NODE_NAME_LEN]; + int error; +} neu_resp_node_rename_t; + typedef struct neu_req_get_node_state { char node[NEU_NODE_NAME_LEN]; } neu_req_get_node_state_t; diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 844e0044..501f869c 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -354,6 +354,7 @@ static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header, strcpy(header.receiver, cmd->driver); break; } + case NEU_REQ_UPDATE_NODE: case NEU_REQ_NODE_CTL: case NEU_REQ_GET_NODE_STATE: case NEU_REQ_GET_NODE_SETTING: @@ -1241,6 +1242,9 @@ void *neu_msg_gen(neu_reqresp_head_t *header, void *data) case NEU_REQ_ADD_NODE_EVENT: data_size = sizeof(neu_req_add_node_t); break; + case NEU_REQ_UPDATE_NODE: + data_size = sizeof(neu_req_update_node_t); + break; case NEU_REQ_DEL_NODE: case NEU_REQ_DEL_NODE_EVENT: data_size = sizeof(neu_req_del_node_t); @@ -1327,6 +1331,12 @@ void *neu_msg_gen(neu_reqresp_head_t *header, void *data) case NEU_REQ_NODE_CTL_EVENT: data_size = sizeof(neu_req_node_ctl_t); break; + case NEU_REQ_NODE_RENAME: + data_size = sizeof(neu_req_node_rename_t); + break; + case NEU_RESP_NODE_RENAME: + data_size = sizeof(neu_resp_node_rename_t); + break; case NEU_REQ_GET_NODE_STATE: data_size = sizeof(neu_req_get_node_state_t); break; From d1cc2c23efdeecdf4ba2765f68566bc1ac52d799 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Mon, 22 May 2023 10:13:16 +0800 Subject: [PATCH 3/3] feat(core): fulfill NEU_REQ_UPDATE_NODE request --- src/adapter/adapter.c | 12 ++++++++++++ src/core/manager.c | 39 +++++++++++++++++++++++++++++++++++++ src/core/manager_internal.c | 18 +++++++++++++++++ src/core/manager_internal.h | 2 ++ src/core/node_manager.c | 38 +++++++++++++++++++++++++++++++++++- src/core/node_manager.h | 3 +++ src/core/storage.c | 7 +++++++ src/core/storage.h | 2 ++ src/core/subscribe.c | 36 ++++++++++++++++++++++++++++++++++ src/core/subscribe.h | 7 +++++++ 10 files changed, 163 insertions(+), 1 deletion(-) diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 501f869c..994fa82e 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -689,6 +689,18 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) reply(adapter, header, &error); break; } + case NEU_REQ_NODE_RENAME: { + neu_req_node_rename_t *cmd = (neu_req_node_rename_t *) &header[1]; + neu_resp_node_rename_t resp = { 0 }; + resp.error = neu_adapter_rename(adapter, cmd->new_name); + strcpy(header->receiver, header->sender); + strcpy(header->sender, cmd->new_name); + strcpy(resp.node, cmd->node); + strcpy(resp.new_name, cmd->new_name); + header->type = NEU_RESP_NODE_RENAME; + reply(adapter, header, &resp); + break; + } case NEU_REQ_DEL_TAG: { neu_req_del_tag_t *cmd = (neu_req_del_tag_t *) &header[1]; neu_resp_error_t error = { 0 }; diff --git a/src/core/manager.c b/src/core/manager.c index e365ff83..f0e98f06 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -568,6 +568,32 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) reply(manager, header, &e); break; } + case NEU_REQ_UPDATE_NODE: { + neu_req_update_node_t *cmd = (neu_req_update_node_t *) &header[1]; + neu_resp_error_t e = { 0 }; + + if (NULL == neu_node_manager_find(manager->node_manager, cmd->node)) { + e.error = NEU_ERR_NODE_NOT_EXIST; + } + + if (NULL != + neu_node_manager_find(manager->node_manager, cmd->new_name)) { + // this also makes renaming to the original name an error + e.error = NEU_ERR_NODE_EXIST; + } + + if (0 == e.error) { + header->type = NEU_REQ_NODE_RENAME; + forward_msg(manager, msg, header->receiver); + } else { + header->type = NEU_RESP_ERROR; + neu_msg_exchange(header); + neu_msg_exchange(header); + reply(manager, header, &e); + } + + break; + } case NEU_REQ_DEL_NODE: { neu_req_del_node_t *cmd = (neu_req_del_node_t *) &header[1]; neu_resp_error_t error = { 0 }; @@ -770,6 +796,19 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } + case NEU_RESP_NODE_RENAME: { + neu_resp_node_rename_t *resp = (neu_resp_node_rename_t *) &header[1]; + if (0 == resp->error) { + neu_manager_update_node_name(manager, resp->node, resp->new_name); + manager_storage_update_node(manager, resp->node, resp->new_name); + } + + neu_resp_error_t e = { .error = resp->error }; + header->type = NEU_RESP_ERROR; + reply(manager, header, &e); + break; + } + case NEU_REQ_ADD_NODE_EVENT: case NEU_REQ_DEL_NODE_EVENT: case NEU_REQ_NODE_CTL_EVENT: diff --git a/src/core/manager_internal.c b/src/core/manager_internal.c index ecbe538d..6a043b98 100644 --- a/src/core/manager_internal.c +++ b/src/core/manager_internal.c @@ -103,6 +103,24 @@ UT_array *neu_manager_get_nodes(neu_manager_t *manager, neu_node_type_e type, return neu_node_manager_filter(manager->node_manager, type, plugin, node); } +int neu_manager_update_node_name(neu_manager_t *manager, const char *node, + const char *new_name) +{ + int ret = 0; + if (neu_node_manager_is_driver(manager->node_manager, node)) { + ret = neu_subscribe_manager_update_driver_name( + manager->subscribe_manager, node, new_name); + } else { + ret = neu_subscribe_manager_update_app_name(manager->subscribe_manager, + node, new_name); + } + if (0 == ret) { + ret = + neu_node_manager_update_name(manager->node_manager, node, new_name); + } + return ret; +} + int neu_manager_add_template(neu_manager_t *manager, const char *name, const char *plugin, uint16_t n_group, neu_reqresp_template_group_t *groups) diff --git a/src/core/manager_internal.h b/src/core/manager_internal.h index 5d5fbfd3..8be57ed0 100644 --- a/src/core/manager_internal.h +++ b/src/core/manager_internal.h @@ -56,6 +56,8 @@ int neu_manager_add_node(neu_manager_t *manager, const char *node_name, int neu_manager_del_node(neu_manager_t *manager, const char *node_name); UT_array *neu_manager_get_nodes(neu_manager_t *manager, neu_node_type_e type, const char *plugin, const char *node); +int neu_manager_update_node_name(neu_manager_t *manager, const char *node, + const char *new_name); int neu_manager_add_template(neu_manager_t *manager, const char *name, const char *plugin, uint16_t n_group, diff --git a/src/core/node_manager.c b/src/core/node_manager.c index 137b6136..39399034 100644 --- a/src/core/node_manager.c +++ b/src/core/node_manager.c @@ -20,8 +20,9 @@ #include #include -#include "adapter/adapter_internal.h" +#include "errcodes.h" +#include "adapter/adapter_internal.h" #include "node_manager.h" typedef struct node_entity { @@ -104,6 +105,29 @@ int neu_node_manager_add_single(neu_node_manager_t *mgr, neu_adapter_t *adapter, return 0; } +int neu_node_manager_update_name(neu_node_manager_t *mgr, const char *node_name, + const char *new_node_name) +{ + node_entity_t *node = NULL; + + HASH_FIND_STR(mgr->nodes, node_name, node); + if (NULL == node) { + return NEU_ERR_NODE_NOT_EXIST; + } + + char *new_name = strdup(new_node_name); + if (NULL == new_name) { + return NEU_ERR_EINTERNAL; + } + + HASH_DEL(mgr->nodes, node); + free(node->name); + node->name = new_name; + HASH_ADD_STR(mgr->nodes, name, node); + + return 0; +} + int neu_node_manager_update(neu_node_manager_t *mgr, const char *name, nng_pipe pipe) { @@ -266,6 +290,18 @@ bool neu_node_manager_is_single(neu_node_manager_t *mgr, const char *name) return false; } +bool neu_node_manager_is_driver(neu_node_manager_t *mgr, const char *name) +{ + node_entity_t *node = NULL; + + HASH_FIND_STR(mgr->nodes, name, node); + if (node != NULL) { + return NEU_NA_TYPE_DRIVER == node->adapter->module->type; + } + + return false; +} + UT_array *neu_node_manager_get_pipes(neu_node_manager_t *mgr, neu_node_type_e type) { diff --git a/src/core/node_manager.h b/src/core/node_manager.h index 6f00a183..15b8cde7 100644 --- a/src/core/node_manager.h +++ b/src/core/node_manager.h @@ -37,6 +37,8 @@ int neu_node_manager_add_static(neu_node_manager_t *mgr, neu_adapter_t * adapter); int neu_node_manager_add_single(neu_node_manager_t *mgr, neu_adapter_t *adapter, bool display); +int neu_node_manager_update_name(neu_node_manager_t *mgr, const char *node_name, + const char *new_node_name); int neu_node_manager_update(neu_node_manager_t *mgr, const char *name, nng_pipe pipe); bool neu_node_manager_exist_uninit(neu_node_manager_t *mgr); @@ -54,6 +56,7 @@ UT_array * neu_node_manager_get_adapter(neu_node_manager_t *mgr, neu_node_type_e type); neu_adapter_t *neu_node_manager_find(neu_node_manager_t *mgr, const char *name); bool neu_node_manager_is_single(neu_node_manager_t *mgr, const char *name); +bool neu_node_manager_is_driver(neu_node_manager_t *mgr, const char *name); // nng_pipe array UT_array *neu_node_manager_get_pipes(neu_node_manager_t *mgr, diff --git a/src/core/storage.c b/src/core/storage.c index 03fbbcbf..9338b0ea 100644 --- a/src/core/storage.c +++ b/src/core/storage.c @@ -56,6 +56,13 @@ void manager_storage_add_node(neu_manager_t *manager, const char *node) neu_persist_node_info_fini(&node_info); } +void manager_storage_update_node(neu_manager_t *manager, const char *node, + const char *new_name) +{ + (void) manager; + neu_persister_update_node(node, new_name); +} + void manager_storage_del_node(neu_manager_t *manager, const char *node) { (void) manager; diff --git a/src/core/storage.h b/src/core/storage.h index aa1efab0..f28c7245 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -27,6 +27,8 @@ void manager_strorage_plugin(neu_manager_t *manager); void manager_storage_del_node(neu_manager_t *manager, const char *node); void manager_storage_add_node(neu_manager_t *manager, const char *node); +void manager_storage_update_node(neu_manager_t *manager, const char *node, + const char *new_name); void manager_storage_subscribe(neu_manager_t *manager, const char *app, const char *driver, const char *group, const char *params); diff --git a/src/core/subscribe.c b/src/core/subscribe.c index fdb2b8d7..1dd55f2b 100644 --- a/src/core/subscribe.c +++ b/src/core/subscribe.c @@ -231,3 +231,39 @@ void neu_subscribe_manager_remove(neu_subscribe_mgr_t *mgr, const char *driver, } } } + +int neu_subscribe_manager_update_app_name(neu_subscribe_mgr_t *mgr, + const char *app, const char *new_name) +{ + sub_elem_t *el = NULL, *tmp = NULL; + + HASH_ITER(hh, mgr->ss, el, tmp) + { + utarray_foreach(el->apps, neu_app_subscribe_t *, sub_app) + { + if (strcmp(app, sub_app->app_name) == 0) { + strcpy(sub_app->app_name, new_name); + } + } + } + + return 0; +} + +int neu_subscribe_manager_update_driver_name(neu_subscribe_mgr_t *mgr, + const char * driver, + const char * new_name) +{ + sub_elem_t *el = NULL, *tmp = NULL; + + HASH_ITER(hh, mgr->ss, el, tmp) + { + if (strcmp(driver, el->key.driver) == 0) { + HASH_DEL(mgr->ss, el); + strcpy(el->key.driver, new_name); + HASH_ADD(hh, mgr->ss, key, sizeof(sub_elem_key_t), el); + } + } + + return 0; +} diff --git a/src/core/subscribe.h b/src/core/subscribe.h index 782e957f..07c2cab3 100644 --- a/src/core/subscribe.h +++ b/src/core/subscribe.h @@ -56,4 +56,11 @@ int neu_subscribe_manager_unsub(neu_subscribe_mgr_t *mgr, const char *driver, void neu_subscribe_manager_remove(neu_subscribe_mgr_t *mgr, const char *driver, const char *group); +int neu_subscribe_manager_update_app_name(neu_subscribe_mgr_t *mgr, + const char * app, + const char * new_name); +int neu_subscribe_manager_update_driver_name(neu_subscribe_mgr_t *mgr, + const char * driver, + const char * new_name); + #endif