]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Fix cornercases closing channels.
[meshlink] / src / meshlink.c
index 7492c46bda6a0ce7716fc27278b58db108735500..a8ed1fad3d20a0d39db9ad5f9c7a67763d904e6f 100644 (file)
@@ -2603,6 +2603,30 @@ bool meshlink_set_canonical_address(meshlink_handle_t *mesh, meshlink_node_t *no
        return config_sync(mesh, "current");
 }
 
+bool meshlink_clear_canonical_address(meshlink_handle_t *mesh, meshlink_node_t *node) {
+       if(!mesh || !node) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return false;
+       }
+
+       if(pthread_mutex_lock(&mesh->mutex) != 0) {
+               abort();
+       }
+
+       node_t *n = (node_t *)node;
+       free(n->canonical_address);
+       n->canonical_address = NULL;
+
+       if(!node_write_config(mesh, n)) {
+               pthread_mutex_unlock(&mesh->mutex);
+               return false;
+       }
+
+       pthread_mutex_unlock(&mesh->mutex);
+
+       return config_sync(mesh, "current");
+}
+
 bool meshlink_add_invitation_address(struct meshlink_handle *mesh, const char *address, const char *port) {
        if(!mesh || !address) {
                meshlink_errno = MESHLINK_EINVAL;
@@ -3880,9 +3904,6 @@ static void channel_poll(struct utcp_connection *connection, size_t len) {
                }
 
                if(sent != (ssize_t)todo) {
-                       /* We should never get a partial send at this point */
-                       assert(sent <= 0);
-
                        /* Sending failed, abort all outstanding AIO buffers and send a poll callback. */
                        if(!aio_abort(mesh, channel, &channel->aio_send)) {
                                return;