Exemple #1
0
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;
}
Exemple #2
0
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);
}
Exemple #3
0
ref_t *dslink_map_get(Map *map, void *key) {
    size_t len = map->key_len_calc(key);
    return dslink_map_getl(map, key, len);
}