X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.c;h=6e03e63bbe7e1b3848ccb8678c2a8b9fd4207d22;hb=157c8660a94aea6eddef4dd290ae93d40566b2d8;hp=fce1f736ea22e0dd6ba1438ab13d24f8d622d710;hpb=0bdce44687a22c8825695cba185b845f5ea5e060;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index fce1f736..6e03e63b 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -1044,6 +1044,20 @@ void meshlink_stop(meshlink_handle_t *mesh) { mesh->threadstarted = false; + // Close all metaconnections + if(mesh->connections) { + for(list_node_t *node = mesh->connections->head, *next; node; node = next) { + next = node->next; + connection_t *c = node->data; + c->outgoing = NULL; + terminate_connection(mesh, c, false); + } + } + + if(mesh->outgoings) + list_delete_list(mesh->outgoings); + mesh->outgoings = NULL; + pthread_mutex_unlock(&(mesh->mesh_mutex)); } @@ -2146,8 +2160,9 @@ meshlink_edge_t **meshlink_get_all_edges_state(meshlink_handle_t *mesh, meshlink } static bool channel_pre_accept(struct utcp *utcp, uint16_t port) { - //TODO: implement - return true; + node_t *n = utcp->priv; + meshlink_handle_t *mesh = n->mesh; + return mesh->channel_accept_cb; } static ssize_t channel_recv(struct utcp_connection *connection, const void *data, size_t len) { @@ -2156,7 +2171,9 @@ static ssize_t channel_recv(struct utcp_connection *connection, const void *data abort(); node_t *n = channel->node; meshlink_handle_t *mesh = n->mesh; - if(channel->receive_cb) + if(n->status.destroyed) + meshlink_channel_close(mesh, channel); + else if(channel->receive_cb) channel->receive_cb(mesh, channel, data, len); return len; }