]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Address Lars's comments on the API.
[meshlink] / src / meshlink.c
index b3e87faaca293175b384b0a6b189cdaa4c26f97b..a49aa578ea0ae527c855138d7e307391923af3db 100644 (file)
@@ -629,8 +629,10 @@ static const char *errstr[] = {
        [MESHLINK_ENOENT] = "No such node",
 };
 
-const char *meshlink_strerror(meshlink_errno_t errno) {
-       return errstr[errno];
+const char *meshlink_strerror(meshlink_errno_t err) {
+       if(err < 0 || err >= sizeof errstr / sizeof *errstr)
+               return "Invalid error code";
+       return errstr[err];
 }
 
 static bool ecdsa_keygen(meshlink_handle_t *mesh) {
@@ -841,7 +843,7 @@ void meshlink_stop(meshlink_handle_t *mesh) {
 }
 
 void meshlink_close(meshlink_handle_t *mesh) {
-       if(!mesh)
+       if(!mesh || !mesh->confbase)
                return;
 
        // Close and free all resources used.
@@ -853,11 +855,19 @@ void meshlink_close(meshlink_handle_t *mesh) {
        exit_configuration(&mesh->config);
        event_loop_exit(&mesh->loop);
 
-       free(mesh);
-
 #ifdef HAVE_MINGW
-       WSACleanup();
+       if(mesh->confbase)
+               WSACleanup();
 #endif
+
+       ecdsa_free(mesh->invitation_key);
+
+       free(mesh->name);
+       free(mesh->confbase);
+
+       memset(mesh, 0, sizeof *mesh);
+
+       free(mesh);
 }
 
 void meshlink_set_receive_cb(meshlink_handle_t *mesh, meshlink_receive_cb_t cb) {
@@ -940,24 +950,30 @@ meshlink_node_t *meshlink_get_node(meshlink_handle_t *mesh, const char *name) {
        return (meshlink_node_t *)lookup_node(mesh, (char *)name); // TODO: make lookup_node() use const
 }
 
-ssize_t meshlink_get_all_nodes(meshlink_handle_t *mesh, meshlink_node_t **nodes, size_t nmemb) {
+meshlink_node_t **meshlink_get_all_nodes(meshlink_handle_t *mesh, meshlink_node_t **nodes, size_t *nmemb) {
        if(!mesh || (nmemb && !nodes))
-               return -1;
+               return NULL;
 
-       size_t i = 0;
+       meshlink_node_t **result, **p;
 
        //lock mesh->nodes
        pthread_mutex_lock(&(mesh->nodes_mutex));
 
-       for splay_each(node_t, n, mesh->nodes) {
-               if(i < nmemb)
-                       nodes[i] = (meshlink_node_t *)n;
-               i++;
+       *nmemb = mesh->nodes->count;
+       result = realloc(nodes, *nmemb * sizeof *nodes);
+
+       if(result) {
+               for splay_each(node_t, n, mesh->nodes)
+                       *p++ = (meshlink_node_t *)n;
+       } else {
+               *nmemb = 0;
+               free(nodes);
+               meshlink_errno = MESHLINK_ENOMEM;
        }
 
        pthread_mutex_unlock(&(mesh->nodes_mutex));
 
-       return i;
+       return result;
 }
 
 bool meshlink_sign(meshlink_handle_t *mesh, const void *data, size_t len, void *signature, size_t *siglen) {
@@ -1445,6 +1461,18 @@ void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node) {
        return;
 }
 
+void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) {
+       if(!mesh || !node)
+               return;
+
+       node_t *n = (node_t *)node;
+       n->status.blacklisted = false;
+
+       //TODO: remove blacklisted = yes from the config file
+
+       return;
+}
+
 static void __attribute__((constructor)) meshlink_init(void) {
        crypto_init();
 }