]> git.meshlink.io Git - meshlink/commitdiff
Add API functions to query nodes by device class.
authorGuus Sliepen <guus@meshlink.io>
Thu, 31 Jan 2019 21:38:48 +0000 (22:38 +0100)
committerGuus Sliepen <guus@meshlink.io>
Thu, 31 Jan 2019 21:52:53 +0000 (22:52 +0100)
src/meshlink.c
src/meshlink.h

index 520176232d6f05beb68fa2eeb11caa60116e9b61..815acdeadd60f40e6e8691a2f5e779a849e5f9e2 100644 (file)
@@ -1847,6 +1847,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;
index 968d344283b96c491c8fe3759e9c55d34a906ec0..35b9bd6478331c4dbe74ffa87b2b44df8ffa9783 100644 (file)
@@ -469,6 +469,36 @@ extern meshlink_node_t **meshlink_get_all_nodes(meshlink_handle_t *mesh, meshlin
  */
 extern bool meshlink_sign(meshlink_handle_t *mesh, const void *data, size_t len, void *signature, size_t *siglen);
 
+/// Get the list of all nodes by device class.
+/** This function returns a list with handles for all the nodes that matches with the given @a devclass @a .
+ *
+ *  @param mesh         A handle which represents an instance of MeshLink.
+ *  @param devclass     Device class of the nodes for which the list has to be obtained.
+ *  @param nodes        A pointer to a previously allocated array of pointers to meshlink_node_t, or NULL in which case MeshLink will allocate a new array.
+ *                      The application can supply an array it allocated itself with malloc, or the return value from the previous call to this function (which is the preferred way).
+ *                      The application is allowed to call free() on the array whenever it wishes.
+ *                      The pointers in the array are valid until meshlink_close() is called.
+ *  @param nmemb        A pointer to a variable holding the number of nodes with the same @a device class @a that are stored in the array.
+ *                      In case the @a nodes @a argument is not NULL, MeshLink might call realloc() on the array to change its size.
+ *                      The contents of this variable will be changed to reflect the new size of the array.
+ *
+ *  @return             A pointer to an array containing pointers to all known nodes of the given device class, or NULL in case of an error.
+ *                      If the @a nodes @a argument was not NULL, then the return value can either be the same value or a different value.
+ *                      If it is a new value, the old value of @a nodes @a should not be used anymore.
+ *                      If the new value is NULL, then the old array will have been freed by MeshLink.
+ */
+extern 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);
+
+/// Get the node's device class.
+/** This function returns the device class of the given node.
+ *
+ *  @param mesh          A handle which represents an instance of MeshLink.
+ *  @param node         A pointer to a meshlink_node_t describing the node.
+ *
+ *  @return              This function returns the device class of the @a node @a , or -1 in case of an error.
+ */
+extern dev_class_t meshlink_get_node_dev_class(meshlink_handle_t *mesh, meshlink_node_t *node);
+
 /// Verify the signature generated by another node of a piece of data.
 /** This function verifies the signature that another node generated for a piece of data.
  *