int dslink_node_add_child(DSLink *link, DSNode *node) { assert(node); assert(node->parent); int ret = 0; if (!node->parent->children) { node->parent->children = malloc(sizeof(Map)); if (!node->parent->children) { return DSLINK_ALLOC_ERR; } if (dslink_map_init(node->parent->children, dslink_map_str_cmp, dslink_map_str_key_len_cal) != 0) { free(node->parent->children); node->parent->children = NULL; return DSLINK_ALLOC_ERR; } } assert(!dslink_map_contains(node->parent->children, (void *) node->name)); { DSNode *tmp = node; if ((ret = dslink_map_set(node->parent->children, (void *) node->name, (void **) &tmp)) != 0) { return ret; } } if (!link->_ws) { return ret; } uint32_t *id = dslink_map_get(link->responder->list_subs, (void *) node->parent->path); if (!id) { return ret; } json_t *top = json_object(); if (!top) { return ret; } json_t *resps = json_array(); if (!resps) { goto cleanup; } json_object_set_new_nocheck(top, "responses", resps); json_t *resp = json_object(); if (!resp) { goto cleanup; } json_array_append_new(resps, resp); json_object_set_new_nocheck(resp, "stream", json_string("open")); json_object_set_new_nocheck(resp, "rid", json_integer(*id)); json_t *updates = json_array(); if (!updates) { goto cleanup; } json_object_set_new_nocheck(resp, "updates", updates); json_t *update = json_array(); if (!update) { goto cleanup; } json_array_append_new(updates, update); dslink_response_list_append_child(update, node); dslink_ws_send_obj(link->_ws, top); cleanup: json_delete(top); return ret; }
void virtual_downstream_node_init(VirtualDownstreamNode *node) { node->permissionList = NULL; dslink_map_init(&node->childrenNode, dslink_map_str_cmp, dslink_map_str_key_len_cal, dslink_map_hash_key); node->meta = json_object(); }
static int broker_init(Broker *broker, json_t *defaultPermission) { broker->root = broker_node_create("", "node"); if (!broker->root) { goto fail; } broker->root->permissionList = permission_list_load(defaultPermission); broker->root->path = dslink_strdup("/"); json_object_set_new(broker->root->meta, "$downstream", json_string_nocheck("/downstream")); broker->sys = broker_node_create("sys", "static"); if (!(broker->sys && broker_node_add(broker->root, broker->sys) == 0)) { broker_node_free(broker->sys); goto fail; } broker->upstream = broker_node_create("upstream", "static"); if (!(broker->upstream && broker_node_add(broker->root, broker->upstream) == 0)) { broker_node_free(broker->upstream); goto fail; } broker->data = broker_node_create("data", "node"); if (!(broker->data && broker_node_add(broker->root, broker->data) == 0 && broker_load_data_nodes(broker) == 0 && broker_data_node_populate(broker->data) == 0)) { broker_node_free(broker->data); goto fail; } broker->downstream = broker_node_create("downstream", "node"); if (!(broker->downstream && broker_node_add(broker->root, broker->downstream) == 0)) { broker_node_free(broker->downstream); goto fail; } broker_load_downstream_nodes(broker); broker_load_qos_storage(broker); if (broker_sys_node_populate(broker->sys)) { goto fail; } BrokerNode *node = broker_node_create("defs", "static"); if (!(node && json_object_set_new_nocheck(node->meta, "$hidden", json_true()) == 0 && broker_node_add(broker->root, node) == 0)) { broker_node_free(node); goto fail; } if (dslink_map_init(&broker->client_connecting, dslink_map_str_cmp, dslink_map_str_key_len_cal, dslink_map_hash_key) != 0) { goto fail; } if (dslink_map_init(&broker->remote_pending_sub, dslink_map_str_cmp, dslink_map_str_key_len_cal, dslink_map_hash_key) != 0) { goto fail; } if (dslink_map_init(&broker->local_pending_sub, dslink_map_str_cmp, dslink_map_str_key_len_cal, dslink_map_hash_key) != 0) { goto fail; } return 0; fail: broker_free(broker); return 1; }