--- mesh/node.c | 69 +++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 39 deletions(-) diff --git a/mesh/node.c b/mesh/node.c index d1b37a5da..d631b9324 100644 --- a/mesh/node.c +++ b/mesh/node.c @@ -112,8 +112,14 @@ struct mesh_node { }; struct managed_obj_request { - void *data; - void *cb; + union { + const uint8_t *uuid; + struct mesh_node *node; + }; + union { + node_ready_func_t ready_cb; + node_join_ready_func_t join_ready_cb; + }; struct l_dbus_message *pending_msg; enum request_type type; struct mesh_config_import *import; @@ -1571,10 +1577,10 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) } if (is_new) { - node = node_new(req->data); + node = node_new(req->uuid); node->elements = l_queue_new(); } else { - node = req->data; + node = req->node; } num_ele = 0; @@ -1644,8 +1650,6 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) } if (req->type == REQUEST_TYPE_ATTACH) { - node_ready_func_t cb = req->cb; - if (num_ele != node->num_ele) goto fail; @@ -1654,13 +1658,11 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) node->disc_watch = l_dbus_add_disconnect_watch(bus, node->owner, app_disc_cb, node, NULL); - cb(req->pending_msg, MESH_ERROR_NONE, node); + req->ready_cb(req->pending_msg, MESH_ERROR_NONE, node); } else goto fail; } else if (req->type == REQUEST_TYPE_JOIN) { - node_join_ready_func_t cb = req->cb; - if (!agent) { l_error("Interface %s not found", MESH_PROVISION_AGENT_INTERFACE); @@ -1669,16 +1671,14 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) node->num_ele = num_ele; set_defaults(node); - memcpy(node->uuid, req->data, 16); + memcpy(node->uuid, req->uuid, 16); if (!create_node_config(node, node->uuid)) goto fail; - cb(node, agent); + req->join_ready_cb(node, agent); } else if (req->type == REQUEST_TYPE_IMPORT) { - - node_ready_func_t cb = req->cb; struct mesh_config_import *import = req->import; struct keyring_net_key net_key; @@ -1694,7 +1694,7 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) if (node->seq_number != import->node->seq_number) node->seq_number = import->node->seq_number; - memcpy(node->uuid, req->data, 16); + memcpy(node->uuid, req->uuid, 16); if (!create_node_config(node, node->uuid)) goto fail; @@ -1719,17 +1719,16 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) if (!keyring_put_net_key(node, import->net_key.idx, &net_key)) goto fail; - cb(req->pending_msg, MESH_ERROR_NONE, node); + req->ready_cb(req->pending_msg, MESH_ERROR_NONE, node); } else { /* Callback for create node request */ - node_ready_func_t cb = req->cb; struct keyring_net_key net_key; uint8_t dev_key[16]; node->num_ele = num_ele; set_defaults(node); - memcpy(node->uuid, req->data, 16); + memcpy(node->uuid, req->uuid, 16); if (!create_node_config(node, node->uuid)) goto fail; @@ -1756,7 +1755,7 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data) if (!keyring_put_net_key(node, PRIMARY_NET_IDX, &net_key)) goto fail; - cb(req->pending_msg, MESH_ERROR_NONE, node); + req->ready_cb(req->pending_msg, MESH_ERROR_NONE, node); } return; @@ -1765,26 +1764,18 @@ fail: mesh_agent_remove(agent); if (!is_new) { - /* Handle failed Attach request */ - node_ready_func_t cb = req->cb; - free_node_dbus_resources(node); - cb(req->pending_msg, MESH_ERROR_FAILED, node); + req->ready_cb(req->pending_msg, MESH_ERROR_FAILED, node); } else { /* Handle failed Join, Create and Import requests */ if (node) node_remove(node); - if (req->type == REQUEST_TYPE_JOIN) { - node_join_ready_func_t cb = req->cb; - - cb(NULL, NULL); - } else { - node_ready_func_t cb = req->cb; - - cb(req->pending_msg, MESH_ERROR_FAILED, NULL); - } + if (req->type == REQUEST_TYPE_JOIN) + req->join_ready_cb(NULL, NULL); + else + req->ready_cb(req->pending_msg, MESH_ERROR_FAILED, NULL); } } @@ -1809,8 +1800,8 @@ int node_attach(const char *app_path, const char *sender, uint64_t token, node->owner = l_strdup(sender); req = l_new(struct managed_obj_request, 1); - req->data = node; - req->cb = cb; + req->node = node; + req->ready_cb = cb; req->pending_msg = user_data; req->type = REQUEST_TYPE_ATTACH; @@ -1833,8 +1824,8 @@ void node_join(const char *app_path, const char *sender, const uint8_t *uuid, l_debug(""); req = l_new(struct managed_obj_request, 1); - req->data = (void *) uuid; - req->cb = cb; + req->uuid = uuid; + req->join_ready_cb = cb; req->type = REQUEST_TYPE_JOIN; l_dbus_method_call(dbus_get_bus(), sender, app_path, @@ -1859,8 +1850,8 @@ bool node_import(const char *app_path, const char *sender, req = l_new(struct managed_obj_request, 1); - req->data = (void *) uuid; - req->cb = cb; + req->uuid = uuid; + req->ready_cb = cb; req->pending_msg = user_data; req->import = import; req->type = REQUEST_TYPE_IMPORT; @@ -1881,8 +1872,8 @@ void node_create(const char *app_path, const char *sender, const uint8_t *uuid, l_debug(""); req = l_new(struct managed_obj_request, 1); - req->data = (void *) uuid; - req->cb = cb; + req->uuid = uuid; + req->ready_cb = cb; req->pending_msg = user_data; req->type = REQUEST_TYPE_CREATE; -- 2.19.1