X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmeshlink.c;h=1dbefd0eded7be6aa0b60a6caeb329efb3f6c0cf;hb=2fd608c4111ef4d48a649401d918f5981856cc44;hp=6f83c22fbd762a8bc68fd0c71b01af1aa1cdd844;hpb=0d133a5ff230ad78da3208d32521d7549836187e;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index 6f83c22f..1dbefd0e 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -626,23 +626,22 @@ static bool try_bind(int port) { return false; } - while(ai) { - int fd = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP); + //while(ai) { + for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) { + int fd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP); if(!fd) { freeaddrinfo(ai); return false; } - int result = bind(fd, ai->ai_addr, ai->ai_addrlen); + int result = bind(fd, aip->ai_addr, aip->ai_addrlen); closesocket(fd); if(result) { freeaddrinfo(ai); return false; } - - ai = ai->ai_next; } freeaddrinfo(ai); @@ -923,7 +922,7 @@ static bool invitation_receive(void *handle, uint8_t type, const void *msg, uint return finalize_join(mesh); case 2: - logger(mesh, MESHLINK_DEBUG, "Invitation succesfully accepted.\n"); + logger(mesh, MESHLINK_DEBUG, "Invitation successfully accepted.\n"); shutdown(mesh->sock, SHUT_RDWR); mesh->success = true; break; @@ -1675,6 +1674,17 @@ void meshlink_set_receive_cb(meshlink_handle_t *mesh, meshlink_receive_cb_t cb) pthread_mutex_unlock(&(mesh->mesh_mutex)); } +void meshlink_set_connection_try_cb(meshlink_handle_t *mesh, meshlink_connection_try_cb_t cb) { + if(!mesh) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + + pthread_mutex_lock(&(mesh->mesh_mutex)); + mesh->connection_try_cb = cb; + pthread_mutex_unlock(&(mesh->mesh_mutex)); +} + void meshlink_set_node_status_cb(meshlink_handle_t *mesh, meshlink_node_status_cb_t cb) { if(!mesh) { meshlink_errno = MESHLINK_EINVAL; @@ -1853,6 +1863,20 @@ meshlink_node_t *meshlink_get_node(meshlink_handle_t *mesh, const char *name) { return node; } +meshlink_submesh_t *meshlink_get_submesh(meshlink_handle_t *mesh, const char *name) { + if(!mesh || !name) { + meshlink_errno = MESHLINK_EINVAL; + return NULL; + } + + meshlink_submesh_t *submesh = NULL; + + pthread_mutex_lock(&(mesh->mesh_mutex)); + submesh = (meshlink_submesh_t *)lookup_submesh(mesh, name); + pthread_mutex_unlock(&(mesh->mesh_mutex)); + return submesh; +} + meshlink_node_t **meshlink_get_all_nodes(meshlink_handle_t *mesh, meshlink_node_t **nodes, size_t *nmemb) { if(!mesh || !nmemb || (*nmemb && !nodes)) { meshlink_errno = MESHLINK_EINVAL; @@ -3137,7 +3161,7 @@ ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *chann // TODO: more finegrained locking. // Ideally we want to put the data into the UTCP connection's send buffer. - // Then, preferrably only if there is room in the receiver window, + // Then, preferably only if there is room in the receiver window, // kick the meshlink thread to go send packets. pthread_mutex_lock(&mesh->mesh_mutex); @@ -3160,6 +3184,24 @@ uint32_t meshlink_channel_get_flags(meshlink_handle_t *mesh, meshlink_channel_t return channel->c->flags; } +size_t meshlink_channel_get_sendq(meshlink_handle_t *mesh, meshlink_channel_t *channel) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return -1; + } + + return utcp_get_sendq(channel->c); +} + +size_t meshlink_channel_get_recvq(meshlink_handle_t *mesh, meshlink_channel_t *channel) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return -1; + } + + return utcp_get_recvq(channel->c); +} + void update_node_status(meshlink_handle_t *mesh, node_t *n) { if(n->status.reachable && mesh->channel_accept_cb && !n->utcp) { n->utcp = utcp_init(channel_accept, channel_pre_accept, channel_send, n);