X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.c;h=474cef0808a12ab9c6c05e7e030f96f21343726d;hb=ec02aca3d7888f072c5c0d52ba6b5c37ed42b69e;hp=8f0f82d1a8ae1c3afe5f94f0db22c134c2783ecd;hpb=de126fa104aaeabbc66b5dd59da9d07da2f0fd97;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index 8f0f82d1..474cef08 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -54,6 +54,8 @@ __thread meshlink_errno_t meshlink_errno; meshlink_log_cb_t global_log_cb; meshlink_log_level_t global_log_level; +typedef bool (*search_node_by_condition_t)(const node_t *, const void *); + //TODO: this can go away completely const var_t variables[] = { /* Server configuration */ @@ -624,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); @@ -921,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; @@ -1433,20 +1434,13 @@ meshlink_submesh_t *meshlink_submesh_open(meshlink_handle_t *mesh, const char * return NULL; } - s = (meshlink_submesh_t *)lookup_submesh(mesh, submesh); - - if(s) { - logger(NULL, MESHLINK_ERROR, "SubMesh Already exists!\n"); - meshlink_errno = MESHLINK_EEXIST; - return NULL; - } + //lock mesh->nodes + pthread_mutex_lock(&(mesh->mesh_mutex)); - s = (meshlink_submesh_t *)new_submesh(); - s->name = xstrdup(submesh); + s = (meshlink_submesh_t *)create_submesh(mesh, submesh); - submesh_add(mesh, (submesh_t *)s); + pthread_mutex_unlock(&(mesh->mesh_mutex)); - meshlink_errno = MESHLINK_OK; return s; } @@ -1889,12 +1883,7 @@ meshlink_node_t **meshlink_get_all_nodes(meshlink_handle_t *mesh, meshlink_node_ return result; } -meshlink_node_t **meshlink_get_all_nodes_by_dev_class(meshlink_handle_t *mesh, dev_class_t devclass, meshlink_node_t **nodes, size_t *nmemb) { - if(!mesh || ((int)devclass < 0) || (devclass > _DEV_CLASS_MAX) || !nmemb) { - meshlink_errno = MESHLINK_EINVAL; - return NULL; - } - +static meshlink_node_t **meshlink_get_all_nodes_by_condition(meshlink_handle_t *mesh, const void *condition, meshlink_node_t **nodes, size_t *nmemb, search_node_by_condition_t search_node) { meshlink_node_t **result; pthread_mutex_lock(&(mesh->mesh_mutex)); @@ -1902,7 +1891,7 @@ meshlink_node_t **meshlink_get_all_nodes_by_dev_class(meshlink_handle_t *mesh, d *nmemb = 0; for splay_each(node_t, n, mesh->nodes) { - if(n->devclass == devclass) { + if(true == search_node(n, condition)) { *nmemb = *nmemb + 1; } } @@ -1919,7 +1908,7 @@ meshlink_node_t **meshlink_get_all_nodes_by_dev_class(meshlink_handle_t *mesh, d meshlink_node_t **p = result; for splay_each(node_t, n, mesh->nodes) { - if(n->devclass == devclass) { + if(true == search_node(n, condition)) { *p++ = (meshlink_node_t *)n; } } @@ -1934,6 +1923,42 @@ meshlink_node_t **meshlink_get_all_nodes_by_dev_class(meshlink_handle_t *mesh, d return result; } +static bool search_node_by_dev_class(const node_t *node, const void *condition) { + dev_class_t *devclass = (dev_class_t *)condition; + + if(*devclass == node->devclass) { + return true; + } + + return false; +} + +static bool search_node_by_submesh(const node_t *node, const void *condition) { + if(condition == node->submesh) { + return true; + } + + return false; +} + +meshlink_node_t **meshlink_get_all_nodes_by_dev_class(meshlink_handle_t *mesh, dev_class_t devclass, meshlink_node_t **nodes, size_t *nmemb) { + if(!mesh || ((int)devclass < 0) || (devclass > _DEV_CLASS_MAX) || !nmemb) { + meshlink_errno = MESHLINK_EINVAL; + return NULL; + } + + return meshlink_get_all_nodes_by_condition(mesh, &devclass, nodes, nmemb, search_node_by_dev_class); +} + +meshlink_node_t **meshlink_get_all_nodes_by_submesh(meshlink_handle_t *mesh, meshlink_submesh_t *submesh, meshlink_node_t **nodes, size_t *nmemb) { + if(!mesh || !submesh || !nmemb) { + meshlink_errno = MESHLINK_EINVAL; + return NULL; + } + + return meshlink_get_all_nodes_by_condition(mesh, submesh, nodes, nmemb, search_node_by_submesh); +} + dev_class_t meshlink_get_node_dev_class(meshlink_handle_t *mesh, meshlink_node_t *node) { if(!mesh || !node) { meshlink_errno = MESHLINK_EINVAL; @@ -1951,6 +1976,21 @@ dev_class_t meshlink_get_node_dev_class(meshlink_handle_t *mesh, meshlink_node_t return devclass; } +meshlink_submesh_t *meshlink_get_node_submesh(meshlink_handle_t *mesh, meshlink_node_t *node) { + if(!mesh || !node) { + meshlink_errno = MESHLINK_EINVAL; + return NULL; + } + + node_t *n = (node_t *)node; + + meshlink_submesh_t *s; + + s = (meshlink_submesh_t *)n->submesh; + + return s; +} + bool meshlink_sign(meshlink_handle_t *mesh, const void *data, size_t len, void *signature, size_t *siglen) { if(!mesh || !data || !len || !signature || !siglen) { meshlink_errno = MESHLINK_EINVAL; @@ -2274,6 +2314,8 @@ char *meshlink_invite_ex(meshlink_handle_t *mesh, meshlink_submesh_t *submesh, c meshlink_errno = MESHLINK_EINVAL; return NULL; } + } else { + s = (meshlink_submesh_t *)mesh->self->submesh; } pthread_mutex_lock(&(mesh->mesh_mutex)); @@ -3094,7 +3136,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);