X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmeshlink.c;h=0ea38dbb55c952c5ea69e0ab70181f4cb8f17706;hb=ed1f31db1e8840ffd6849b48bcad93e9975a24bb;hp=520176232d6f05beb68fa2eeb11caa60116e9b61;hpb=6054182c9e208fd0b3f5c6c90f54cb5af75d3f5c;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index 52017623..0ea38dbb 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -37,6 +37,7 @@ typedef struct { #include "meshlink_internal.h" #include "netutl.h" #include "node.h" +#include "submesh.h" #include "protocol.h" #include "route.h" #include "sockaddr.h" @@ -1415,6 +1416,37 @@ meshlink_handle_t *meshlink_open_ex(const meshlink_open_params_t *params) { return mesh; } +meshlink_submesh_t *meshlink_submesh_open(meshlink_handle_t *mesh, const char *submesh) { + meshlink_submesh_t *s = NULL; + if(!mesh) { + logger(NULL, MESHLINK_ERROR, "No mesh handle given!\n"); + meshlink_errno = MESHLINK_EINVAL; + return NULL; + } + + if(!submesh || !*submesh) { + logger(NULL, MESHLINK_ERROR, "No submesh name given!\n"); + meshlink_errno = MESHLINK_EINVAL; + 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; + } + + s = (meshlink_submesh_t *)new_submesh(); + s->name = xstrdup(submesh); + + submesh_add(mesh, (submesh_t *)s); + + meshlink_errno = MESHLINK_OK; + return s; +} + static void *meshlink_main_loop(void *arg) { meshlink_handle_t *mesh = arg; @@ -1847,6 +1879,68 @@ 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; + } + + meshlink_node_t **result; + + pthread_mutex_lock(&(mesh->mesh_mutex)); + + *nmemb = 0; + + for splay_each(node_t, n, mesh->nodes) { + if(n->devclass == devclass) { + *nmemb = *nmemb + 1; + } + } + + if(*nmemb == 0) { + free(nodes); + pthread_mutex_unlock(&(mesh->mesh_mutex)); + return NULL; + } + + result = realloc(nodes, *nmemb * sizeof(*nodes)); + + if(result) { + meshlink_node_t **p = result; + + for splay_each(node_t, n, mesh->nodes) { + if(n->devclass == devclass) { + *p++ = (meshlink_node_t *)n; + } + } + } else { + *nmemb = 0; + free(nodes); + meshlink_errno = MESHLINK_ENOMEM; + } + + pthread_mutex_unlock(&(mesh->mesh_mutex)); + + return result; +} + +dev_class_t meshlink_get_node_dev_class(meshlink_handle_t *mesh, meshlink_node_t *node) { + if(!mesh || !node) { + meshlink_errno = MESHLINK_EINVAL; + return -1; + } + + dev_class_t devclass; + + pthread_mutex_lock(&(mesh->mesh_mutex)); + + devclass = ((node_t *)node)->devclass; + + pthread_mutex_unlock(&(mesh->mesh_mutex)); + + return devclass; +} + 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;