]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Close meta-connections in meshlink_stop().
[meshlink] / src / meshlink.c
index fce1f736ea22e0dd6ba1438ab13d24f8d622d710..6e03e63bbe7e1b3848ccb8678c2a8b9fd4207d22 100644 (file)
@@ -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;
 }