DSNode *dslink_node_get_path(DSNode *root, const char *path) { if (!root) { return NULL; } else if (strcmp(path, "/") == 0) { return root; } else if (*path == '/') { path++; } DSNode *node = root; const char *end = strchr(path, '/'); if (end) { if (!node->children) { return NULL; } node = dslink_map_getl(node->children, (void *) path, end - path); return dslink_node_get_path(node, end); } else if (*path != '\0') { if (!node->children) { return NULL; } return dslink_map_get(node->children, (void *) path); } return node; }
void broker_subscribe_disconnected_remote(const char *path, SubRequester *subreq) { Broker *broker = mainLoop->data; const size_t len = broker_downstream_node_base_len(path); if (len ==0) { // todo remove subreq? return; } ref_t *ref = dslink_map_getl(&broker->remote_pending_sub, (char *) path, len); List *subs; if (ref) { subs = ref->data; } else { subs = dslink_calloc(1, sizeof(List)); list_init(subs); dslink_map_set(&broker->remote_pending_sub, dslink_strl_ref(path, len), dslink_ref(subs, subs_list_free)); } subreq->pendingNode = dslink_list_insert(subs, subreq); }
ref_t *dslink_map_get(Map *map, void *key) { size_t len = map->key_len_calc(key); return dslink_map_getl(map, key, len); }