]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Add meshlink_set_channel_listen_cb().
[meshlink] / src / meshlink.c
index 07326d56f0642e644628346cbf5a06779e5c830c..f949c2c7da8df9acd9999418c79cf4a736635ada 100644 (file)
@@ -829,7 +829,7 @@ static bool finalize_join(join_state_t *state, const void *buf, uint16_t len) {
        }
 
        /* Ensure the configuration directory metadata is on disk */
-       if(!config_sync(mesh, "current") || !sync_path(mesh->confbase)) {
+       if(!config_sync(mesh, "current") || (mesh->confbase && !sync_path(mesh->confbase))) {
                return false;
        }
 
@@ -3626,7 +3626,12 @@ static bool channel_pre_accept(struct utcp *utcp, uint16_t port) {
        (void)port;
        node_t *n = utcp->priv;
        meshlink_handle_t *mesh = n->mesh;
-       return mesh->channel_accept_cb;
+
+       if(mesh->channel_accept_cb && mesh->channel_listen_cb) {
+               return mesh->channel_listen_cb(mesh, (meshlink_node_t *)n, port);
+       } else {
+               return mesh->channel_accept_cb;
+       }
 }
 
 /* Finish one AIO buffer, return true if the channel is still open. */
@@ -3931,6 +3936,21 @@ void meshlink_set_channel_poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *c
        pthread_mutex_unlock(&mesh->mutex);
 }
 
+void meshlink_set_channel_listen_cb(meshlink_handle_t *mesh, meshlink_channel_listen_cb_t cb) {
+       if(!mesh) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return;
+       }
+
+       if(pthread_mutex_lock(&mesh->mutex) != 0) {
+               abort();
+       }
+
+       mesh->channel_listen_cb = cb;
+
+       pthread_mutex_unlock(&mesh->mutex);
+}
+
 void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_channel_accept_cb_t cb) {
        if(!mesh) {
                meshlink_errno = MESHLINK_EINVAL;