X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.c;h=fe11af2cc44966a309afea3e224ca9935d2b2229;hb=325d837df2ec867c668b6a911b97e719f196ba0e;hp=f6b12bd89d0e26e87e796290b3e9305263db573c;hpb=3be09bc77ac43f45d3fc933f90c93567562d9231;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index f6b12bd8..fe11af2c 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -3154,7 +3154,7 @@ bool meshlink_join(meshlink_handle_t *mesh, const char *invitation) { } // Connect to the meshlink daemon mentioned in the URL. - struct addrinfo *ai = adns_blocking_request(mesh, xstrdup(address), xstrdup(port), SOCK_STREAM, 5); + struct addrinfo *ai = adns_blocking_request(mesh, xstrdup(address), xstrdup(port), SOCK_STREAM, 30); if(ai) { for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) { @@ -3399,6 +3399,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) { if(!buflen) { logger(mesh, MESHLINK_DEBUG, "Invalid data\n"); + free(buf); meshlink_errno = MESHLINK_EPEER; return false; } @@ -3408,6 +3409,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) { if(!count) { logger(mesh, MESHLINK_DEBUG, "Invalid data\n"); + free(buf); meshlink_errno = MESHLINK_EPEER; return false; } @@ -3464,6 +3466,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) { if(!node_write_config(mesh, n, true)) { free_node(n); + free(buf); return false; } @@ -3514,7 +3517,7 @@ static bool blacklist(meshlink_handle_t *mesh, node_t *n) { } } - utcp_abort_all_connections(n->utcp); + utcp_reset_all_connections(n->utcp); n->mtu = 0; n->minmtu = 0; @@ -4252,6 +4255,32 @@ void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel pthread_mutex_unlock(&mesh->mutex); } +void meshlink_channel_abort(meshlink_handle_t *mesh, meshlink_channel_t *channel) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + + if(pthread_mutex_lock(&mesh->mutex) != 0) { + abort(); + } + + if(channel->c) { + utcp_abort(channel->c); + channel->c = NULL; + + /* Clean up any outstanding AIO buffers. */ + aio_abort(mesh, channel, &channel->aio_send); + aio_abort(mesh, channel, &channel->aio_receive); + } + + if(!channel->in_callback) { + free(channel); + } + + pthread_mutex_unlock(&mesh->mutex); +} + ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) { if(!mesh || !channel) { meshlink_errno = MESHLINK_EINVAL;