X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fprotocol.c;fp=src%2Fprotocol.c;h=c69d7a1726c0454adef4d8f6e2295f8eed76a624;hb=9759acaa786734e050d31bd6f8c150b8a80a597d;hp=d95edceda62b99f506ddfe714241d7e63b222adf;hpb=664466227602b6aabd4f601cf57183bbfa45bc08;p=meshlink-tiny diff --git a/src/protocol.c b/src/protocol.c index d95edce..c69d7a1 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -116,23 +116,6 @@ bool send_request(meshlink_handle_t *mesh, connection_t *c, const char *format, } } -void forward_request(meshlink_handle_t *mesh, connection_t *from, const char *request) { - assert(from); - assert(request); - assert(*request); - - logger(mesh, MESHLINK_DEBUG, "Forwarding %s from %s: %s", request_name[atoi(request)], from->name, request); - - // Create a temporary newline-terminated copy of the request - int len = strlen(request); - char tmp[len + 1]; - - memcpy(tmp, request, len); - tmp[len] = '\n'; - - broadcast_meta(mesh, from, tmp, sizeof(tmp)); -} - bool receive_request(meshlink_handle_t *mesh, connection_t *c, const char *request) { assert(request); @@ -164,85 +147,3 @@ bool receive_request(meshlink_handle_t *mesh, connection_t *c, const char *reque return true; } - -static int past_request_compare(const past_request_t *a, const past_request_t *b) { - return strcmp(a->request, b->request); -} - -static void free_past_request(past_request_t *r) { - if(r->request) { - free((void *)r->request); - } - - free(r); -} - -static const int request_timeout = 60; - -static void age_past_requests(event_loop_t *loop, void *data) { - (void)data; - meshlink_handle_t *mesh = loop->data; - int left = 0, deleted = 0; - - for splay_each(past_request_t, p, mesh->past_request_tree) { - if(p->firstseen + request_timeout <= mesh->loop.now.tv_sec) { - splay_delete_node(mesh->past_request_tree, splay_node), deleted++; - } else { - left++; - } - } - - if(left || deleted) { - logger(mesh, MESHLINK_DEBUG, "Aging past requests: deleted %d, left %d", deleted, left); - } - - if(left) { - timeout_set(&mesh->loop, &mesh->past_request_timeout, &(struct timespec) { - 10, prng(mesh, TIMER_FUDGE) - }); - } -} - -bool seen_request(meshlink_handle_t *mesh, const char *request) { - assert(request); - assert(*request); - - past_request_t *new, p = {.request = request}; - - if(splay_search(mesh->past_request_tree, &p)) { - logger(mesh, MESHLINK_DEBUG, "Already seen request"); - return true; - } else { - new = xmalloc(sizeof(*new)); - new->request = xstrdup(request); - new->firstseen = mesh->loop.now.tv_sec; - - if(!mesh->past_request_tree->head && mesh->past_request_timeout.cb) { - timeout_set(&mesh->loop, &mesh->past_request_timeout, &(struct timespec) { - 10, prng(mesh, TIMER_FUDGE) - }); - } - - splay_insert(mesh->past_request_tree, new); - return false; - } -} - -void init_requests(meshlink_handle_t *mesh) { - assert(!mesh->past_request_tree); - - mesh->past_request_tree = splay_alloc_tree((splay_compare_t) past_request_compare, (splay_action_t) free_past_request); - timeout_add(&mesh->loop, &mesh->past_request_timeout, age_past_requests, NULL, &(struct timespec) { - 0, 0 - }); -} - -void exit_requests(meshlink_handle_t *mesh) { - if(mesh->past_request_tree) { - splay_delete_tree(mesh->past_request_tree); - } - - mesh->past_request_tree = NULL; - - timeout_del(&mesh->loop, &mesh->past_request_timeout); -}