]> git.meshlink.io Git - meshlink/commitdiff
Fix more compiler warnings.
authorGuus Sliepen <guus@meshlink.io>
Wed, 13 May 2020 20:48:02 +0000 (22:48 +0200)
committerGuus Sliepen <guus@meshlink.io>
Wed, 13 May 2020 20:48:12 +0000 (22:48 +0200)
This enables much more compiler warnings by default, and fixes all the
warnings we get from GCC 10 and Clang 10 in the library.

The blackbox test cases still produce a lot of warnings that have not
been fixed yet.

67 files changed:
configure.ac
examples/groupchat.c
examples/manynodes.c
examples/meshlinkapp.c
src/adns.c
src/adns.h
src/buffer.h
src/conf.h
src/connection.h
src/crypto.h
src/devtools.h
src/discovery.h
src/dropin.h
src/ecdh.h
src/ecdsa.h
src/ecdsagen.h
src/edge.h
src/event.c
src/event.h
src/graph.c
src/graph.h
src/hash.h
src/list.h
src/logger.h
src/meshlink.c
src/meshlink.h
src/meshlink_internal.h
src/meta.c
src/meta.h
src/net.h
src/net_packet.c
src/net_setup.c
src/netutl.h
src/node.h
src/prf.c
src/prf.h
src/protocol.c
src/protocol.h
src/protocol_auth.c
src/protocol_edge.c
src/protocol_key.c
src/route.h
src/splay_tree.h
src/sptps.h
src/submesh.h
src/utcp-test.c
src/utcp.c
src/utcp.h
src/utils.h
src/xoshiro.h
test/basic.c
test/blacklist.c
test/channels-cornercases.c
test/channels-failure.c
test/channels-fork.c
test/channels-udp.c
test/channels.c
test/duplicate.c
test/echo-fork.c
test/encrypted.c
test/ephemeral.c
test/get-all-nodes.c
test/import-export.c
test/invite-join.c
test/sign-verify.c
test/trio.c
test/trio2.c

index 37e7b82f46b382d636cc35888e78187d03c5c8b0..c5e629d66e17f476ad577c6b58d9b31854438b4d 100644 (file)
@@ -75,6 +75,7 @@ AS_IF([test "x$enable_hardening" != "xno"],
    esac
    AX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS="$LDFLAGS -Wl,-z,relro"])
    AX_CHECK_LINK_FLAG([-Wl,-z,now], [LDFLAGS="$LDFLAGS -Wl,-z,now"])
+   AX_CHECK_COMPILE_FLAG([-Wextra -pedantic -Wreturn-type -Wold-style-definition -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wshadow -Wbad-function-cast -Wwrite-strings -fdiagnostics-show-option -fstrict-aliasing -Wmissing-noreturn], [CPPFLAGS="$CPPFLAGS -Wextra -pedantic -Wreturn-type -Wold-style-definition -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wshadow -Wbad-function-cast -Wwrite-strings -fdiagnostics-show-option -fno-strict-aliasing -Wmissing-noreturn"])
   ]
 );
 
index 75e259db7d1d8ed16caee6e7cac92abe9b0043f4..18e6f6194b0c67fe58a4a5083e09677adbdea34b 100644 (file)
@@ -80,16 +80,9 @@ static void node_status(meshlink_handle_t *mesh, meshlink_node_t *node, bool rea
        }
 }
 
-static meshlink_node_t **nodes;
-static size_t nnodes;
-
 static void parse_command(meshlink_handle_t *mesh, char *buf) {
        char *arg = strchr(buf, ' ');
        char *arg1 = NULL;
-       meshlink_submesh_t *s = NULL;
-       static meshlink_submesh_t **submesh = NULL;
-       static size_t nmemb = 0;
-       size_t i;
 
        if(arg) {
                *arg++ = 0;
@@ -103,38 +96,38 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
        }
 
        if(!strcasecmp(buf, "invite")) {
-               char *invitation;
-
                if(!arg) {
                        fprintf(stderr, "/invite requires an argument!\n");
                        return;
                }
 
-               if(arg1) {
+               meshlink_submesh_t *s = NULL;
 
-                       submesh = devtool_get_all_submeshes(mesh, submesh, &nmemb);
+               if(arg1) {
+                       size_t nmemb;
+                       meshlink_submesh_t **submeshes = devtool_get_all_submeshes(mesh, NULL, &nmemb);
 
-                       if(!submesh || !nmemb) {
+                       if(!submeshes || !nmemb) {
                                fprintf(stderr, "Group does not exist!\n");
                                return;
                        }
 
-                       for(i = 0; i < nmemb; i++) {
-                               if(!strcmp(arg1, submesh[i]->name)) {
-                                       s = submesh[i];
+                       for(size_t i = 0; i < nmemb; i++) {
+                               if(!strcmp(arg1, submeshes[i]->name)) {
+                                       s = submeshes[i];
                                        break;
-                               } else {
-                                       s = NULL;
                                }
                        }
 
+                       free(submeshes);
+
                        if(!s) {
                                fprintf(stderr, "Group is not yet created!\n");
                                return;
                        }
                }
 
-               invitation = meshlink_invite(mesh, s, arg);
+               char *invitation = meshlink_invite(mesh, s, arg);
 
                if(!invitation) {
                        fprintf(stderr, "Could not invite '%s': %s\n", arg, meshlink_strerror(meshlink_errno));
@@ -191,7 +184,9 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
                        return;
                }
 
-               if(!(s = meshlink_submesh_open(mesh, arg))) {
+               meshlink_submesh_t *s = meshlink_submesh_open(mesh, arg);
+
+               if(!s) {
                        fprintf(stderr, "Could not create group: %s\n", meshlink_strerror(meshlink_errno));
                } else {
                        fprintf(stderr, "Group '%s' created!\n", s->name);
@@ -256,25 +251,29 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
                meshlink_submesh_t *node_group = NULL;
 
                if(!arg) {
-                       nodes = meshlink_get_all_nodes(mesh, nodes, &nnodes);
+                       size_t nnodes;
+                       meshlink_node_t **nodes = meshlink_get_all_nodes(mesh, NULL, &nnodes);
 
                        if(!nnodes) {
                                fprintf(stderr, "Could not get list of nodes: %s\n", meshlink_strerror(meshlink_errno));
-                       } else {
-                               fprintf(stderr, "%lu known nodes:\n", (unsigned long)nnodes);
+                               return;
+                       }
 
-                               for(size_t i = 0; i < nnodes; i++) {
-                                       fprintf(stderr, " %lu. %s", (unsigned long)i, nodes[i]->name);
+                       fprintf(stderr, "%lu known nodes:\n", (unsigned long)nnodes);
 
-                                       if((node_group = meshlink_get_node_submesh(mesh, nodes[i]))) {
-                                               fprintf(stderr, "\t%s", node_group->name);
-                                       }
+                       for(size_t i = 0; i < nnodes; i++) {
+                               fprintf(stderr, " %lu. %s", (unsigned long)i, nodes[i]->name);
 
-                                       fprintf(stderr, "\n");
+                               if((node_group = meshlink_get_node_submesh(mesh, nodes[i]))) {
+                                       fprintf(stderr, "\t%s", node_group->name);
                                }
 
                                fprintf(stderr, "\n");
                        }
+
+                       fprintf(stderr, "\n");
+
+                       free(nodes);
                } else {
                        meshlink_node_t *node = meshlink_get_node(mesh, arg);
 
@@ -296,45 +295,47 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
                        return;
                }
 
-               submesh = devtool_get_all_submeshes(mesh, submesh, &nmemb);
+               size_t nmemb;
+               meshlink_submesh_t **submeshes = devtool_get_all_submeshes(mesh, NULL, &nmemb);
 
-               if(!submesh || !nmemb) {
+               if(!submeshes || !nmemb) {
                        fprintf(stderr, "Group does not exist!\n");
                        return;
                }
 
-               for(i = 0; i < nmemb; i++) {
-                       if(!strcmp(arg, submesh[i]->name)) {
-                               s = submesh[i];
+               meshlink_submesh_t *s = NULL;
+
+               for(size_t i = 0; i < nmemb; i++) {
+                       if(!strcmp(arg, submeshes[i]->name)) {
+                               s = submeshes[i];
                                break;
-                       } else {
-                               s = NULL;
                        }
                }
 
+               free(submeshes);
+
                if(!s) {
                        fprintf(stderr, "Group %s does not exist!\n", arg);
                        return;
                }
 
-               nodes = meshlink_get_all_nodes_by_submesh(mesh, s, nodes, &nnodes);
+               size_t nnodes;
+               meshlink_node_t **nodes = meshlink_get_all_nodes_by_submesh(mesh, s, NULL, &nnodes);
 
-               if(!nodes) {
+               if(!nodes || !nnodes) {
                        fprintf(stderr, "Group %s does not contain any nodes!\n", arg);
                        return;
                }
 
-               if(nnodes <= 0) {
-                       fprintf(stderr, "Could not get list of nodes for group %s: %s\n", arg, meshlink_strerror(meshlink_errno));
-               } else {
-                       fprintf(stderr, "%zu known nodes in group %s:", nnodes, arg);
-
-                       for(size_t i = 0; i < nnodes; i++) {
-                               fprintf(stderr, " %s", nodes[i]->name);
-                       }
+               fprintf(stderr, "%zu known nodes in group %s:", nnodes, arg);
 
-                       fprintf(stderr, "\n");
+               for(size_t i = 0; i < nnodes; i++) {
+                       fprintf(stderr, " %s", nodes[i]->name);
                }
+
+               fprintf(stderr, "\n");
+
+               free(nodes);
        } else if(!strcasecmp(buf, "quit")) {
                fprintf(stderr, "Bye!\n");
                fclose(stdin);
index d9fb0a41fee1f826458a4a18af3a0d20f24e95d9..923b5542e0612bd214901f9e0095bf4631954137 100644 (file)
@@ -23,8 +23,8 @@
 #include <assert.h>
 
 static int n = 10;
-static meshlink_handle_t **mesh;
-static char *namesprefix = "machine1";
+static meshlink_handle_t **meshes;
+static const char *namesprefix = "machine1";
 static int nodeindex = 0;
 
 static meshlink_node_t **nodes;
@@ -42,11 +42,10 @@ static void log_message(meshlink_handle_t *mesh, meshlink_log_level_t level, con
 }
 
 //Test mesh sending data
-static void testmesh() {
-
+static void testmesh(void) {
        for(int nindex = 0; nindex < n; nindex++) {
 
-               nodes = meshlink_get_all_nodes(mesh[nindex], nodes, &nnodes);
+               nodes = meshlink_get_all_nodes(meshes[nindex], nodes, &nnodes);
 
                if(!nodes) {
                        fprintf(stderr, "Could not get list of nodes: %s\n", meshlink_strerror(meshlink_errno));
@@ -55,7 +54,7 @@ static void testmesh() {
 
                        for(size_t i = 0; i < nnodes; i++) {
                                //printf(" %s\n", nodes[i]->name);
-                               if(!meshlink_send(mesh[nindex], nodes[i], "magic", strlen("magic") + 1)) {
+                               if(!meshlink_send(meshes[nindex], nodes[i], "magic", strlen("magic") + 1)) {
                                        fprintf(stderr, "Could not send message to '%s': %s\n", nodes[i]->name, meshlink_strerror(meshlink_errno));
                                }
                        }
@@ -65,15 +64,15 @@ static void testmesh() {
        }
 }
 // Make all nodes know about each other by importing each others public keys and addresses.
-static void linkmesh() {
+static void linkmesh(void) {
        for(int i = 0; i < n; i++) {
-               char *datai = meshlink_export(mesh[i]);
+               char *datai = meshlink_export(meshes[i]);
 
                for(int j = i + 1; j < n; j++) {
-                       char *dataj = meshlink_export(mesh[j]);
+                       char *dataj = meshlink_export(meshes[j]);
 
-                       if(!meshlink_import(mesh[i], dataj) || !meshlink_import(mesh[j], datai)) {
-                               fprintf(stderr, "Could not exchange keys between %s and %s: %s\n", mesh[i]->name, mesh[j]->name, meshlink_strerror(meshlink_errno));
+                       if(!meshlink_import(meshes[i], dataj) || !meshlink_import(meshes[j], datai)) {
+                               fprintf(stderr, "Could not exchange keys between %s and %s: %s\n", meshes[i]->name, meshes[j]->name, meshlink_strerror(meshlink_errno));
                        }
 
                        free(dataj);
@@ -106,7 +105,7 @@ static bool exportmeshgraph(const char *path) {
                return false;
        }
 
-       if(!devtool_export_json_all_edges_state(mesh[0], stream)) {
+       if(!devtool_export_json_all_edges_state(meshes[0], stream)) {
                fclose(stream);
                fprintf(stderr, "could not export graph\n");
                return false;
@@ -117,7 +116,7 @@ static bool exportmeshgraph(const char *path) {
 }
 
 
-void exportmeshgraph_timer(int signum) {
+static void exportmeshgraph_timer(int signum) {
        (void)signum;
 
        struct timeval ts;
@@ -211,7 +210,7 @@ static void parse_command(char *buf) {
                        return;
                }
 
-               invitation = meshlink_invite(mesh[nodeindex], NULL, arg);
+               invitation = meshlink_invite(meshes[nodeindex], NULL, arg);
 
                if(!invitation) {
                        fprintf(stderr, "Could not invite '%s': %s\n", arg, meshlink_strerror(meshlink_errno));
@@ -226,15 +225,15 @@ static void parse_command(char *buf) {
                        return;
                }
 
-               meshlink_stop(mesh[nodeindex]);
+               meshlink_stop(meshes[nodeindex]);
 
-               if(!meshlink_join(mesh[nodeindex], arg)) {
+               if(!meshlink_join(meshes[nodeindex], arg)) {
                        fprintf(stderr, "Could not join using invitation: %s\n", meshlink_strerror(meshlink_errno));
                } else {
                        fprintf(stderr, "Invitation accepted!\n");
                }
 
-               if(!meshlink_start(mesh[nodeindex])) {
+               if(!meshlink_start(meshes[nodeindex])) {
                        fprintf(stderr, "Could not restart MeshLink: %s\n", meshlink_strerror(meshlink_errno));
                        exit(1);
                }
@@ -244,14 +243,14 @@ static void parse_command(char *buf) {
                        return;
                }
 
-               meshlink_node_t *node = meshlink_get_node(mesh[nodeindex], arg);
+               meshlink_node_t *node = meshlink_get_node(meshes[nodeindex], arg);
 
                if(!node) {
                        fprintf(stderr, "Unknown node '%s'\n", arg);
                        return;
                }
 
-               if(!meshlink_blacklist(mesh[nodeindex], node)) {
+               if(!meshlink_blacklist(meshes[nodeindex], node)) {
                        fprintf(stderr, "Error blacklising '%s': %s", arg, meshlink_strerror(meshlink_errno));
                        return;
                }
@@ -263,14 +262,14 @@ static void parse_command(char *buf) {
                        return;
                }
 
-               meshlink_node_t *node = meshlink_get_node(mesh[nodeindex], arg);
+               meshlink_node_t *node = meshlink_get_node(meshes[nodeindex], arg);
 
                if(!node) {
                        fprintf(stderr, "Error looking up '%s': %s\n", arg, meshlink_strerror(meshlink_errno));
                        return;
                }
 
-               if(!meshlink_whitelist(mesh[nodeindex], node)) {
+               if(!meshlink_whitelist(meshes[nodeindex], node)) {
                        fprintf(stderr, "Error whitelising '%s': %s", arg, meshlink_strerror(meshlink_errno));
                        return;
                }
@@ -278,7 +277,7 @@ static void parse_command(char *buf) {
                printf("Node '%s' whitelisted.\n", arg);
        } else if(!strcasecmp(buf, "who")) {
                if(!arg) {
-                       nodes = meshlink_get_all_nodes(mesh[nodeindex], nodes, &nnodes);
+                       nodes = meshlink_get_all_nodes(meshes[nodeindex], nodes, &nnodes);
 
                        if(!nodes) {
                                fprintf(stderr, "Could not get list of nodes: %s\n", meshlink_strerror(meshlink_errno));
@@ -292,12 +291,12 @@ static void parse_command(char *buf) {
                                printf("\n");
                        }
                } else {
-                       meshlink_node_t *node = meshlink_get_node(mesh[nodeindex], arg);
+                       meshlink_node_t *node = meshlink_get_node(meshes[nodeindex], arg);
 
                        if(!node) {
                                fprintf(stderr, "Unknown node '%s'\n", arg);
                        } else {
-                               printf("Node %s found, pmtu %ld\n", arg, (long int)meshlink_get_pmtu(mesh[nodeindex], node));
+                               printf("Node %s found, pmtu %ld\n", arg, (long int)meshlink_get_pmtu(meshes[nodeindex], node));
                        }
                }
        } else if(!strcasecmp(buf, "link")) {
@@ -319,7 +318,7 @@ static void parse_command(char *buf) {
                nodeindex = atoi(arg);
                printf("Index is now %d\n", nodeindex);
        } else if(!strcasecmp(buf, "stop")) {
-               meshlink_stop(mesh[nodeindex]);
+               meshlink_stop(meshes[nodeindex]);
        } else if(!strcasecmp(buf, "quit")) {
                printf("Bye!\n");
                fclose(stdin);
@@ -389,7 +388,7 @@ static void parse_input(char *buf) {
                        msg++;
                }
 
-               destination = meshlink_get_node(mesh[nodeindex], buf);
+               destination = meshlink_get_node(meshes[nodeindex], buf);
 
                if(!destination) {
                        fprintf(stderr, "Unknown node '%s'\n", buf);
@@ -402,7 +401,7 @@ static void parse_input(char *buf) {
                return;
        }
 
-       if(!meshlink_send(mesh[nodeindex], destination, msg, strlen(msg) + 1)) {
+       if(!meshlink_send(meshes[nodeindex], destination, msg, strlen(msg) + 1)) {
                fprintf(stderr, "Could not send message to '%s': %s\n", destination->name, meshlink_strerror(meshlink_errno));
                return;
        }
@@ -436,7 +435,7 @@ int main(int argc, char *argv[]) {
                graphexporttimeout = argv[4];
        }
 
-       mesh = calloc(n, sizeof(*mesh));
+       meshes = calloc(n, sizeof(*meshes));
 
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_message);
 #ifndef _WIN32
@@ -453,14 +452,14 @@ int main(int argc, char *argv[]) {
                snprintf(filename, sizeof(filename), "%s/%s", basebase, nodename);
 
                if(n / (i + 1) > n / 4) {
-                       mesh[i] = meshlink_open(filename, nodename, "manynodes", DEV_CLASS_BACKBONE);
+                       meshes[i] = meshlink_open(filename, nodename, "manynodes", DEV_CLASS_BACKBONE);
                } else {
-                       mesh[i] = meshlink_open(filename, nodename, "manynodes", DEV_CLASS_PORTABLE);
+                       meshes[i] = meshlink_open(filename, nodename, "manynodes", DEV_CLASS_PORTABLE);
                }
 
-               meshlink_set_log_cb(mesh[i], MESHLINK_DEBUG, log_message);
+               meshlink_set_log_cb(meshes[i], MESHLINK_DEBUG, log_message);
 
-               if(!mesh[i]) {
+               if(!meshes[i]) {
                        fprintf(stderr, "errno is: %d\n", meshlink_errno);
                        fprintf(stderr, "Could not open %s: %s\n", filename, meshlink_strerror(meshlink_errno));
                        return 1;
@@ -470,7 +469,7 @@ int main(int argc, char *argv[]) {
        int started = 0;
 
        for(int i = 0; i < n; i++) {
-               if(!meshlink_start(mesh[i])) {
+               if(!meshlink_start(meshes[i])) {
                        fprintf(stderr, "Could not start node %d: %s\n", i, meshlink_strerror(meshlink_errno));
                } else {
                        started++;
@@ -498,7 +497,7 @@ int main(int argc, char *argv[]) {
        printf("Nodes stopping.\n");
 
        for(int i = 0; i < n; i++) {
-               meshlink_close(mesh[i]);
+               meshlink_close(meshes[i]);
        }
 
        return 0;
index 54e82a39ed4099fcc0d5d2bb752970091f333779..67f996a4f91b75c3e036304a8dad4a29f7a8615a 100644 (file)
@@ -2,17 +2,16 @@
 #include "../src/system.h"
 #include "../src/meshlink.h"
 
-void handle_recv_data(meshlink_handle_t *mesh, meshlink_node_t *source, void *data, size_t len) {
+static void handle_recv_data(meshlink_handle_t *mesh, meshlink_node_t *source, void *data, size_t len) {
        (void)mesh;
 
        printf("Received %zu bytes from %s: %s\n", len, source->name, (char *)data);
 }
 
 int main(int argc, char **argv) {
-       char *confbase = argc > 1 ? argv[1] : "/tmp/meshlink/";
-       char *name = argc > 2 ? argv[2] : "foo";
-
-       char *remotename = argc > 3 ? argv[3] : "bar";
+       const char *confbase = argc > 1 ? argv[1] : "/tmp/meshlink/";
+       const char *name = argc > 2 ? argv[2] : "foo";
+       const char *remotename = argc > 3 ? argv[3] : "bar";
 
        meshlink_handle_t *myhandle;
 
index 8181140d15ddb011e3837bff81119b272b9fd9f5..a04310149f07a76cf3ff7ae2d05db369fb921d23 100644 (file)
@@ -141,7 +141,7 @@ struct adns_blocking_info {
        bool done;
 };
 
-void *adns_blocking_handler(void *data) {
+static void *adns_blocking_handler(void *data) {
        struct adns_blocking_info *info = data;
 
        logger(info->mesh, MESHLINK_DEBUG, "Resolving %s port %s", info->host, info->serv);
index 8dc89fe13af185480f8d7f29b04fb3a46432dfe3..7f9aa9080d9ee61d9555bcc32d62a03a19d765e7 100644 (file)
@@ -24,9 +24,9 @@
 
 typedef void (*adns_cb_t)(meshlink_handle_t *mesh, char *host, char *serv, void *data, struct addrinfo *ai, int err);
 
-extern void init_adns(meshlink_handle_t *mesh);
-extern void exit_adns(meshlink_handle_t *mesh);
-extern void adns_queue(meshlink_handle_t *mesh, char *host, char *serv, adns_cb_t cb, void *data, int timeout);
-extern struct addrinfo *adns_blocking_request(meshlink_handle_t *mesh, char *host, char *serv, int timeout);
+void init_adns(meshlink_handle_t *mesh);
+void exit_adns(meshlink_handle_t *mesh);
+void adns_queue(meshlink_handle_t *mesh, char *host, char *serv, adns_cb_t cb, void *data, int timeout);
+struct addrinfo *adns_blocking_request(meshlink_handle_t *mesh, char *host, char *serv, int timeout);
 
 #endif
index ba6647ed0c095119247617e714fdb01b090266b9..26c0dc9e5f13a571f56ca1f57245d8da6499283f 100644 (file)
@@ -27,11 +27,11 @@ typedef struct buffer_t {
        size_t offset;
 } buffer_t;
 
-extern void buffer_compact(buffer_t *buffer, size_t maxsize);
-extern char *buffer_prepare(buffer_t *buffer, size_t size);
-extern void buffer_add(buffer_t *buffer, const char *data, size_t size);
-extern char *buffer_readline(buffer_t *buffer);
-extern char *buffer_read(buffer_t *buffer, size_t size);
-extern void buffer_clear(buffer_t *buffer);
+void buffer_compact(buffer_t *buffer, size_t maxsize);
+char *buffer_prepare(buffer_t *buffer, size_t size);
+void buffer_add(buffer_t *buffer, const char *data, size_t size);
+char *buffer_readline(buffer_t *buffer);
+char *buffer_read(buffer_t *buffer, size_t size);
+void buffer_clear(buffer_t *buffer);
 
 #endif
index 2f79834ac7a0e09dc2c4b581306f919a0b9e823a..32492ace11120c104f4dc13d1a3f74f051c9d908 100644 (file)
@@ -29,33 +29,33 @@ typedef struct config_t {
 
 typedef bool (*config_scan_action_t)(struct meshlink_handle *mesh, const char *name, void *arg);
 
-extern bool config_read_file(struct meshlink_handle *mesh, FILE *f, struct config_t *, const void *key) __attribute__((__warn_unused_result__));
-extern bool config_write_file(struct meshlink_handle *mesh, FILE *f, const struct config_t *, const void *key) __attribute__((__warn_unused_result__));
-extern void config_free(struct config_t *config);
-
-extern bool meshlink_confbase_exists(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
-
-extern bool config_init(struct meshlink_handle *mesh, const char *conf_subdir) __attribute__((__warn_unused_result__));
-extern bool config_destroy(const char *confbase, const char *conf_subdir) __attribute__((__warn_unused_result__));
-extern bool config_copy(struct meshlink_handle *mesh, const char *src_dir_name, const void *src_key, const char *dst_dir_name, const void *dst_key) __attribute__((__warn_unused_result__));
-extern bool config_rename(struct meshlink_handle *mesh, const char *old_conf_subdir, const char *new_conf_subdir) __attribute__((__warn_unused_result__));
-extern bool config_sync(struct meshlink_handle *mesh, const char *conf_subdir) __attribute__((__warn_unused_result__));
-extern bool sync_path(const char *path) __attribute__((__warn_unused_result__));
-
-extern bool main_config_exists(struct meshlink_handle *mesh, const char *conf_subdir) __attribute__((__warn_unused_result__));
-extern bool main_config_lock(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
-extern void main_config_unlock(struct meshlink_handle *mesh);
-extern bool main_config_read(struct meshlink_handle *mesh, const char *conf_subdir, struct config_t *, void *key) __attribute__((__warn_unused_result__));
-extern bool main_config_write(struct meshlink_handle *mesh, const char *conf_subdir, const struct config_t *, void *key) __attribute__((__warn_unused_result__));
-
-extern bool config_exists(struct meshlink_handle *mesh, const char *conf_subdir, const char *name) __attribute__((__warn_unused_result__));
-extern bool config_read(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, struct config_t *, void *key) __attribute__((__warn_unused_result__));
-extern bool config_write(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, const struct config_t *, void *key) __attribute__((__warn_unused_result__));
-extern bool config_delete(struct meshlink_handle *mesh, const char *conf_subdir, const char *name) __attribute__((__warn_unused_result__));
-extern bool config_scan_all(struct meshlink_handle *mesh, const char *conf_subdir, const char *conf_type, config_scan_action_t action, void *arg) __attribute__((__warn_unused_result__));
-
-extern bool invitation_read(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, struct config_t *, void *key) __attribute__((__warn_unused_result__));
-extern bool invitation_write(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, const struct config_t *, void *key) __attribute__((__warn_unused_result__));
-extern size_t invitation_purge_old(struct meshlink_handle *mesh, time_t deadline);
+bool config_read_file(struct meshlink_handle *mesh, FILE *f, struct config_t *, const void *key) __attribute__((__warn_unused_result__));
+bool config_write_file(struct meshlink_handle *mesh, FILE *f, const struct config_t *, const void *key) __attribute__((__warn_unused_result__));
+void config_free(struct config_t *config);
+
+bool meshlink_confbase_exists(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+
+bool config_init(struct meshlink_handle *mesh, const char *conf_subdir) __attribute__((__warn_unused_result__));
+bool config_destroy(const char *confbase, const char *conf_subdir) __attribute__((__warn_unused_result__));
+bool config_copy(struct meshlink_handle *mesh, const char *src_dir_name, const void *src_key, const char *dst_dir_name, const void *dst_key) __attribute__((__warn_unused_result__));
+bool config_rename(struct meshlink_handle *mesh, const char *old_conf_subdir, const char *new_conf_subdir) __attribute__((__warn_unused_result__));
+bool config_sync(struct meshlink_handle *mesh, const char *conf_subdir) __attribute__((__warn_unused_result__));
+bool sync_path(const char *path) __attribute__((__warn_unused_result__));
+
+bool main_config_exists(struct meshlink_handle *mesh, const char *conf_subdir) __attribute__((__warn_unused_result__));
+bool main_config_lock(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+void main_config_unlock(struct meshlink_handle *mesh);
+bool main_config_read(struct meshlink_handle *mesh, const char *conf_subdir, struct config_t *, void *key) __attribute__((__warn_unused_result__));
+bool main_config_write(struct meshlink_handle *mesh, const char *conf_subdir, const struct config_t *, void *key) __attribute__((__warn_unused_result__));
+
+bool config_exists(struct meshlink_handle *mesh, const char *conf_subdir, const char *name) __attribute__((__warn_unused_result__));
+bool config_read(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, struct config_t *, void *key) __attribute__((__warn_unused_result__));
+bool config_write(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, const struct config_t *, void *key) __attribute__((__warn_unused_result__));
+bool config_delete(struct meshlink_handle *mesh, const char *conf_subdir, const char *name) __attribute__((__warn_unused_result__));
+bool config_scan_all(struct meshlink_handle *mesh, const char *conf_subdir, const char *conf_type, config_scan_action_t action, void *arg) __attribute__((__warn_unused_result__));
+
+bool invitation_read(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, struct config_t *, void *key) __attribute__((__warn_unused_result__));
+bool invitation_write(struct meshlink_handle *mesh, const char *conf_subdir, const char *name, const struct config_t *, void *key) __attribute__((__warn_unused_result__));
+size_t invitation_purge_old(struct meshlink_handle *mesh, time_t deadline);
 
 #endif
index 5160422b346b9a01d054d7f828983dbe8421416a..b5ccaed9ec46b299bcf4a89445c1ab221a7e6638 100644 (file)
@@ -80,11 +80,11 @@ typedef struct connection_t {
        int protocol_minor;             /* used protocol */
 } connection_t;
 
-extern void init_connections(struct meshlink_handle *mesh);
-extern void exit_connections(struct meshlink_handle *mesh);
-extern connection_t *new_connection(void) __attribute__((__malloc__));
-extern void free_connection(connection_t *);
-extern void connection_add(struct meshlink_handle *mesh, connection_t *);
-extern void connection_del(struct meshlink_handle *mesh, connection_t *);
+void init_connections(struct meshlink_handle *mesh);
+void exit_connections(struct meshlink_handle *mesh);
+connection_t *new_connection(void) __attribute__((__malloc__));
+void free_connection(connection_t *);
+void connection_add(struct meshlink_handle *mesh, connection_t *);
+void connection_del(struct meshlink_handle *mesh, connection_t *);
 
 #endif
index 779f4522b01b4e6bb9e99526a720bd5a2c7ce594..9e8a19bcb9ac32b1e60110d8a8202e4e974ef311 100644 (file)
@@ -3,7 +3,7 @@
 
 /*
     crypto.h -- header for crypto.c
-    Copyright (C) 2014, 2017 Guus Sliepen <guus@meshlink.io>
+    Copyright (C) 2014-2020 Guus Sliepen <guus@meshlink.io>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -20,8 +20,8 @@
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-extern void crypto_init();
-extern void crypto_exit();
-extern void randomize(void *, size_t);
+void crypto_init(void);
+void crypto_exit(void);
+void randomize(void *buf, size_t len);
 
 #endif
index 2981d6d3d20311bfdbd9844df80bb4bca3b33166..44965c37078e38c11ff5604ba7c4b48b2b6887f5 100644 (file)
@@ -71,7 +71,7 @@ struct devtool_edge {
  *                      value. If the new values is NULL, then the old array
  *                      will have been freed by Meshlink.
  */
-extern devtool_edge_t *devtool_get_all_edges(meshlink_handle_t *mesh, devtool_edge_t *edges, size_t *nmemb);
+devtool_edge_t *devtool_get_all_edges(meshlink_handle_t *mesh, devtool_edge_t *edges, size_t *nmemb);
 
 /// Export a list of edges to a file in JSON format.
 /*  @param mesh         A handle which represents an instance of MeshLink.
@@ -79,7 +79,7 @@ extern devtool_edge_t *devtool_get_all_edges(meshlink_handle_t *mesh, devtool_ed
  *
  *  @return             True in case of success, false otherwise.
  */
-extern bool devtool_export_json_all_edges_state(meshlink_handle_t *mesh, FILE *stream);
+bool devtool_export_json_all_edges_state(meshlink_handle_t *mesh, FILE *stream);
 
 /// The status of a node.
 typedef struct devtool_node_status devtool_node_status_t;
@@ -116,7 +116,7 @@ struct devtool_node_status {
  *                      The contents of this variable will be changed to reflect
  *                      the current status of the node.
  */
-extern void devtool_get_node_status(meshlink_handle_t *mesh, meshlink_node_t *node, devtool_node_status_t *status);
+void devtool_get_node_status(meshlink_handle_t *mesh, meshlink_node_t *node, devtool_node_status_t *status);
 
 /// Get the list of all submeshes of a meshlink instance.
 /** This function returns an array of submesh handles.
@@ -130,7 +130,7 @@ extern void devtool_get_node_status(meshlink_handle_t *mesh, meshlink_node_t *no
  *                      The contents of this variable will be changed to indicate
  *                      the number if array elements.
  */
-extern meshlink_submesh_t **devtool_get_all_submeshes(meshlink_handle_t *mesh, meshlink_submesh_t **submeshes, size_t *nmemb);
+meshlink_submesh_t **devtool_get_all_submeshes(meshlink_handle_t *mesh, meshlink_submesh_t **submeshes, size_t *nmemb);
 
 /// Open a MeshLink instance in a given network namespace.
 /** This function opens MeshLink in the given network namespace.
@@ -147,7 +147,7 @@ extern meshlink_submesh_t **devtool_get_all_submeshes(meshlink_handle_t *mesh, m
  *  @return         A pointer to a meshlink_handle_t which represents this instance of MeshLink, or NULL in case of an error.
  *                  The pointer is valid until meshlink_close() is called.
  */
-extern meshlink_handle_t *devtool_open_in_netns(const char *confbase, const char *name, const char *appname, dev_class_t devclass, int netns);
+meshlink_handle_t *devtool_open_in_netns(const char *confbase, const char *name, const char *appname, dev_class_t devclass, int netns);
 
 /// Debug function pointer variable for set port API
 /** This function pointer variable is a userspace tracepoint or debugger callback for
@@ -177,6 +177,14 @@ extern void (*devtool_adns_resolve_probe)(void);
  */
 extern void (*devtool_sptps_renewal_probe)(meshlink_node_t *node);
 
+/// Force renewal of SPTPS sessions with the given node.
+/** This causes the SPTPS sessions for both the UDP and TCP connections to renew their keys.
+ *
+ *  @param mesh A handle which represents an instance of MeshLink.
+ *  @param node The node whose SPTPS key(s) should be renewed
+ */
+void devtool_force_sptps_renewal(meshlink_handle_t *mesh, meshlink_node_t *node);
+
 /// Debug function pointer variable for asserting inviter/invitee committing sequence
 /** This function pointer variable is a userspace tracepoint or debugger callback which
  *  invokes either after inviter writing invitees host file into the disk
index bd034a80068bd4dba697c0402a827813a0aac5e0..48571695c52756a2c475b4364bbf7c3a2d88571d 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <stdbool.h>
 
-extern bool discovery_start(meshlink_handle_t *mesh);
-extern void discovery_stop(meshlink_handle_t *mesh);
+bool discovery_start(meshlink_handle_t *mesh);
+void discovery_stop(meshlink_handle_t *mesh);
 
 #endif
index f7a429752bd95e6db66b63afedb5fca4404f32fb..603a28d939e239b31b8855c8f0f01f621ce0ea8c 100644 (file)
@@ -21,8 +21,8 @@
 */
 
 #ifndef HAVE_ASPRINTF
-extern int asprintf(char **, const char *, ...);
-extern int vasprintf(char **, const char *, va_list ap);
+int asprintf(char **, const char *, ...);
+int vasprintf(char **, const char *, va_list ap);
 #endif
 
 #ifdef HAVE_MINGW
index eb66ec0d17713bcd706ce747b60aef1b5a8ceeb4..ea4a841ad30d224fb89023689c8ce2f43ee78abc 100644 (file)
@@ -27,8 +27,8 @@
 typedef struct ecdh ecdh_t;
 #endif
 
-extern ecdh_t *ecdh_generate_public(void *pubkey) __attribute__((__malloc__));
-extern bool ecdh_compute_shared(ecdh_t *ecdh, const void *pubkey, void *shared) __attribute__((__warn_unused_result__));
-extern void ecdh_free(ecdh_t *ecdh);
+ecdh_t *ecdh_generate_public(void *pubkey) __attribute__((__malloc__));
+bool ecdh_compute_shared(ecdh_t *ecdh, const void *pubkey, void *shared) __attribute__((__warn_unused_result__));
+void ecdh_free(ecdh_t *ecdh);
 
 #endif
index 6da3d2f403ebec58d4ff10a5b9c3f3e3c751b39d..64b329fed33c22396a3ef756cb7b63757753c3a6 100644 (file)
 typedef struct ecdsa ecdsa_t;
 #endif
 
-extern ecdsa_t *ecdsa_set_private_key(const void *p) __attribute__((__malloc__));
-extern ecdsa_t *ecdsa_set_base64_public_key(const char *p) __attribute__((__malloc__));
-extern ecdsa_t *ecdsa_set_public_key(const void *p) __attribute__((__malloc__));
-extern char *ecdsa_get_base64_public_key(ecdsa_t *ecdsa);
-extern const void *ecdsa_get_public_key(ecdsa_t *ecdsa) __attribute__((__malloc__));
-extern const void *ecdsa_get_private_key(ecdsa_t *ecdsa) __attribute__((__malloc__));
-extern ecdsa_t *ecdsa_read_pem_public_key(FILE *fp) __attribute__((__malloc__));
-extern ecdsa_t *ecdsa_read_pem_private_key(FILE *fp) __attribute__((__malloc__));
-extern size_t ecdsa_size(ecdsa_t *ecdsa);
-extern bool ecdsa_sign(ecdsa_t *ecdsa, const void *in, size_t inlen, void *out) __attribute__((__warn_unused_result__));
-extern bool ecdsa_verify(ecdsa_t *ecdsa, const void *in, size_t inlen, const void *out) __attribute__((__warn_unused_result__));
-extern bool ecdsa_active(ecdsa_t *ecdsa);
-extern void ecdsa_free(ecdsa_t *ecdsa);
+ecdsa_t *ecdsa_set_private_key(const void *p) __attribute__((__malloc__));
+ecdsa_t *ecdsa_set_base64_public_key(const char *p) __attribute__((__malloc__));
+ecdsa_t *ecdsa_set_public_key(const void *p) __attribute__((__malloc__));
+char *ecdsa_get_base64_public_key(ecdsa_t *ecdsa);
+const void *ecdsa_get_public_key(ecdsa_t *ecdsa) __attribute__((__malloc__));
+const void *ecdsa_get_private_key(ecdsa_t *ecdsa) __attribute__((__malloc__));
+ecdsa_t *ecdsa_read_pem_public_key(FILE *fp) __attribute__((__malloc__));
+ecdsa_t *ecdsa_read_pem_private_key(FILE *fp) __attribute__((__malloc__));
+size_t ecdsa_size(ecdsa_t *ecdsa);
+bool ecdsa_sign(ecdsa_t *ecdsa, const void *in, size_t inlen, void *out) __attribute__((__warn_unused_result__));
+bool ecdsa_verify(ecdsa_t *ecdsa, const void *in, size_t inlen, const void *out) __attribute__((__warn_unused_result__));
+bool ecdsa_active(ecdsa_t *ecdsa);
+void ecdsa_free(ecdsa_t *ecdsa);
 
 #endif
index 812a98b48524949200baaceab4ee80a5ff657f48..263906777265999e5196d76d630472b9eddfecd4 100644 (file)
@@ -22,8 +22,8 @@
 
 #include "ecdsa.h"
 
-extern ecdsa_t *ecdsa_generate(void) __attribute__((__malloc__));
-extern bool ecdsa_write_pem_public_key(ecdsa_t *ecdsa, FILE *fp) __attribute__((__warn_unused_result__));
-extern bool ecdsa_write_pem_private_key(ecdsa_t *ecdsa, FILE *fp) __attribute__((__warn_unused_result__));
+ecdsa_t *ecdsa_generate(void) __attribute__((__malloc__));
+bool ecdsa_write_pem_public_key(ecdsa_t *ecdsa, FILE *fp) __attribute__((__warn_unused_result__));
+bool ecdsa_write_pem_private_key(ecdsa_t *ecdsa, FILE *fp) __attribute__((__warn_unused_result__));
 
 #endif
index 3805e557c634146b87beafd5efa4438260e859b2..d5ec117db0af81f48a71bbbb76d29a7e02be2847 100644 (file)
@@ -37,14 +37,14 @@ typedef struct edge_t {
        uint32_t session_id;                     /* the session_id of the from node */
 } edge_t;
 
-extern void init_edges(struct meshlink_handle *mesh);
-extern void exit_edges(struct meshlink_handle *mesh);
-extern edge_t *new_edge(void) __attribute__((__malloc__));
-extern void free_edge(edge_t *);
-extern struct splay_tree_t *new_edge_tree(void) __attribute__((__malloc__));
-extern void free_edge_tree(struct splay_tree_t *);
-extern void edge_add(struct meshlink_handle *mesh, edge_t *);
-extern void edge_del(struct meshlink_handle *mesh, edge_t *);
-extern edge_t *lookup_edge(struct node_t *, struct node_t *) __attribute__((__warn_unused_result__));
+void init_edges(struct meshlink_handle *mesh);
+void exit_edges(struct meshlink_handle *mesh);
+edge_t *new_edge(void) __attribute__((__malloc__));
+void free_edge(edge_t *);
+struct splay_tree_t *new_edge_tree(void) __attribute__((__malloc__));
+void free_edge_tree(struct splay_tree_t *);
+void edge_add(struct meshlink_handle *mesh, edge_t *);
+void edge_del(struct meshlink_handle *mesh, edge_t *);
+edge_t *lookup_edge(struct node_t *, struct node_t *) __attribute__((__warn_unused_result__));
 
 #endif
index 40dbd18e5e5cce004c3776b7574a02233c0b0636..39a7d18f6dea3d00c4fa4382b6a8341299f59d43 100644 (file)
@@ -364,13 +364,6 @@ bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) {
        return true;
 }
 
-void event_flush_output(event_loop_t *loop) {
-       for splay_each(io_t, io, &loop->ios)
-               if(FD_ISSET(io->fd, &loop->writefds)) {
-                       io->cb(loop, io->data, IO_WRITE);
-               }
-}
-
 void event_loop_start(event_loop_t *loop) {
        loop->running = true;
 }
@@ -394,14 +387,14 @@ void event_loop_exit(event_loop_t *loop) {
        assert(!loop->signals.count);
 
        for splay_each(io_t, io, &loop->ios) {
-               splay_unlink_node(&loop->ios, node);
+               splay_unlink_node(&loop->ios, splay_node);
        }
 
        for splay_each(timeout_t, timeout, &loop->timeouts) {
-               splay_unlink_node(&loop->timeouts, node);
+               splay_unlink_node(&loop->timeouts, splay_node);
        }
 
        for splay_each(signal_t, signal, &loop->signals) {
-               splay_unlink_node(&loop->signals, node);
+               splay_unlink_node(&loop->signals, splay_node);
        }
 }
index 31c326be141f37177d636b1dbfd7e65af7f8f3c4..a87685da1c361152343d185e3bf566bde1e3dc30 100644 (file)
@@ -78,25 +78,25 @@ struct event_loop_t {
        int pipefd[2];
 };
 
-extern void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int flags);
-extern void io_del(event_loop_t *loop, io_t *io);
-extern void io_set(event_loop_t *loop, io_t *io, int flags);
-
-extern void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timespec *tv);
-extern void timeout_del(event_loop_t *loop, timeout_t *timeout);
-extern void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv);
-
-extern void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum);
-extern void signal_trigger(event_loop_t *loop, signal_t *sig);
-extern void signal_del(event_loop_t *loop, signal_t *sig);
-
-extern void idle_set(event_loop_t *loop, idle_cb_t cb, void *data);
-
-extern void event_loop_init(event_loop_t *loop);
-extern void event_loop_exit(event_loop_t *loop);
-extern bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) __attribute__((__warn_unused_result__));
-extern void event_loop_flush_output(event_loop_t *loop);
-extern void event_loop_start(event_loop_t *loop);
-extern void event_loop_stop(event_loop_t *loop);
+void io_add(event_loop_t *loop, io_t *io, io_cb_t cb, void *data, int fd, int flags);
+void io_del(event_loop_t *loop, io_t *io);
+void io_set(event_loop_t *loop, io_t *io, int flags);
+
+void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb, void *data, struct timespec *tv);
+void timeout_del(event_loop_t *loop, timeout_t *timeout);
+void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timespec *tv);
+
+void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum);
+void signal_trigger(event_loop_t *loop, signal_t *sig);
+void signal_del(event_loop_t *loop, signal_t *sig);
+
+void idle_set(event_loop_t *loop, idle_cb_t cb, void *data);
+
+void event_loop_init(event_loop_t *loop);
+void event_loop_exit(event_loop_t *loop);
+bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) __attribute__((__warn_unused_result__));
+void event_loop_flush_output(event_loop_t *loop);
+void event_loop_start(event_loop_t *loop);
+void event_loop_stop(event_loop_t *loop);
 
 #endif
index c6e413d40f6fae3e1a763d74ded701f209d2e409..754626edd8a117fa15ddcdf9845a18c1aa43ae16 100644 (file)
@@ -126,8 +126,8 @@ static void sssp_bfs(meshlink_handle_t *mesh) {
                        list_insert_tail(todo_list, e->to);
                }
 
-               next = node->next; /* Because the list_insert_tail() above could have added something extra for us! */
-               list_delete_node(todo_list, node);
+               list_next = list_node->next; /* Because the list_insert_tail() above could have added something extra for us! */
+               list_delete_node(todo_list, list_node);
        }
 
        list_free(todo_list);
index 2375cc6c99724a5d7ae8d9f207bf94d8e79269ad..17757327b7f1234ed402b73a050834a109093f24 100644 (file)
@@ -20,6 +20,6 @@
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-extern void graph(struct meshlink_handle *mesh);
+void graph(struct meshlink_handle *mesh);
 
 #endif
index de96f888128885ff419769a12a53a67e6b054d1b..b28dc977f49a252401999274bb44a97d35a59b01 100644 (file)
@@ -27,15 +27,15 @@ typedef struct hash_t {
        const void **values;
 } hash_t;
 
-extern hash_t *hash_alloc(size_t n, size_t size) __attribute__((__malloc__));
-extern void hash_free(hash_t *);
+hash_t *hash_alloc(size_t n, size_t size) __attribute__((__malloc__));
+void hash_free(hash_t *);
 
-extern void hash_insert(hash_t *, const void *key, const void *value);
+void hash_insert(hash_t *, const void *key, const void *value);
 
-extern void *hash_search(const hash_t *, const void *key);
-extern void *hash_search_or_insert(hash_t *, const void *key, const void *value);
+void *hash_search(const hash_t *, const void *key);
+void *hash_search_or_insert(hash_t *, const void *key, const void *value);
 
-extern void hash_clear(hash_t *);
-extern void hash_resize(hash_t *, size_t n);
+void hash_clear(hash_t *);
+void hash_resize(hash_t *, size_t n);
 
 #endif
index 60f9a4374a36776976a96cc4a55f81736ebb4389..bdce15673305140dedf749564e176c858f1df53c 100644 (file)
@@ -44,35 +44,35 @@ typedef struct list_t {
 
 /* (De)constructors */
 
-extern list_t *list_alloc(list_action_t) __attribute__((__malloc__));
-extern void list_free(list_t *);
+list_t *list_alloc(list_action_t) __attribute__((__malloc__));
+void list_free(list_t *);
 
 /* Insertion and deletion */
 
-extern list_node_t *list_insert_head(list_t *, void *);
-extern list_node_t *list_insert_tail(list_t *, void *);
+list_node_t *list_insert_head(list_t *, void *);
+list_node_t *list_insert_tail(list_t *, void *);
 
-extern void list_delete(list_t *, const void *);
+void list_delete(list_t *, const void *);
 
-extern void list_delete_node(list_t *, list_node_t *);
+void list_delete_node(list_t *, list_node_t *);
 
-extern void list_delete_head(list_t *);
-extern void list_delete_tail(list_t *);
+void list_delete_head(list_t *);
+void list_delete_tail(list_t *);
 
 /* Head/tail lookup */
 
-extern void *list_get_head(list_t *);
-extern void *list_get_tail(list_t *);
+void *list_get_head(list_t *);
+void *list_get_tail(list_t *);
 
 /* Fast list deletion */
 
-extern void list_delete_list(list_t *);
+void list_delete_list(list_t *);
 
 /* Traversing */
 
-extern void list_foreach(list_t *, list_action_t);
-extern void list_foreach_node(list_t *, list_action_node_t);
+void list_foreach(list_t *, list_action_t);
+void list_foreach_node(list_t *, list_action_node_t);
 
-#define list_each(type, item, list) (type *item = (type *)1; item; item = NULL) for(list_node_t *node = (list)->head, *next; item = node ? node->data : NULL, next = node ? node->next : NULL, node; node = next)
+#define list_each(type, item, list) (type *item = (type *)1; item; item = NULL) for(list_node_t *list_node = (list)->head, *list_next; item = list_node ? list_node->data : NULL, list_next = list_node ? list_node->next : NULL, list_node; list_node = list_next)
 
 #endif
index d6a28c59efe2f452c7d75ae28229bc6b80d7088c..b9269f047b84ad2b943fdd2ed9a4d94aea9921df 100644 (file)
@@ -22,6 +22,6 @@
 
 #include "meshlink_internal.h"
 
-extern void logger(meshlink_handle_t *mesh, meshlink_log_level_t level, const char *format, ...) __attribute__((__format__(printf, 3, 4)));
+void logger(meshlink_handle_t *mesh, meshlink_log_level_t level, const char *format, ...) __attribute__((__format__(printf, 3, 4)));
 
 #endif
index 7c5bbd22741476532e0d17cdfbe992a7e2056276..55b1e04fcd7d807d5e0304a2887026322e1f98c3 100644 (file)
@@ -167,7 +167,7 @@ static int socket_in_netns(int domain, int type, int protocol, int netns) {
 // Find out what local address a socket would use if we connect to the given address.
 // We do this using connect() on a UDP socket, so the kernel has to resolve the address
 // of both endpoints, but this will actually not send any UDP packet.
-static bool getlocaladdr(char *destaddr, sockaddr_t *sa, socklen_t *salen, int netns) {
+static bool getlocaladdr(const char *destaddr, sockaddr_t *sa, socklen_t *salen, int netns) {
        struct addrinfo *rai = NULL;
        const struct addrinfo hint = {
                .ai_family = AF_UNSPEC,
@@ -204,7 +204,7 @@ static bool getlocaladdr(char *destaddr, sockaddr_t *sa, socklen_t *salen, int n
        return true;
 }
 
-static bool getlocaladdrname(char *destaddr, char *host, socklen_t hostlen, int netns) {
+static bool getlocaladdrname(const char *destaddr, char *host, socklen_t hostlen, int netns) {
        sockaddr_t sa;
        socklen_t salen = sizeof(sa);
 
@@ -386,7 +386,7 @@ char *meshlink_get_local_address_for_family(meshlink_handle_t *mesh, int family)
        return xstrdup(localaddr);
 }
 
-void remove_duplicate_hostnames(char *host[], char *port[], int n) {
+static void remove_duplicate_hostnames(char *host[], char *port[], int n) {
        for(int i = 0; i < n; i++) {
                if(!host[i]) {
                        continue;
@@ -710,39 +710,39 @@ static bool finalize_join(join_state_t *state, const void *buf, uint16_t len) {
        // Write host config files
        for(uint32_t i = 0; i < count; i++) {
                const void *data;
-               uint32_t len = packmsg_get_bin_raw(&in, &data);
+               uint32_t data_len = packmsg_get_bin_raw(&in, &data);
 
-               if(!len) {
+               if(!data_len) {
                        logger(mesh, MESHLINK_ERROR, "Incomplete invitation file!\n");
                        return false;
                }
 
-               packmsg_input_t in2 = {data, len};
-               uint32_t version = packmsg_get_uint32(&in2);
-               char *name = packmsg_get_str_dup(&in2);
+               packmsg_input_t in2 = {data, data_len};
+               uint32_t version2 = packmsg_get_uint32(&in2);
+               char *name2 = packmsg_get_str_dup(&in2);
 
-               if(!packmsg_input_ok(&in2) || version != MESHLINK_CONFIG_VERSION || !check_id(name)) {
-                       free(name);
+               if(!packmsg_input_ok(&in2) || version2 != MESHLINK_CONFIG_VERSION || !check_id(name2)) {
+                       free(name2);
                        packmsg_input_invalidate(&in);
                        break;
                }
 
-               if(!check_id(name)) {
-                       free(name);
+               if(!check_id(name2)) {
+                       free(name2);
                        break;
                }
 
-               if(!strcmp(name, mesh->name)) {
+               if(!strcmp(name2, mesh->name)) {
                        logger(mesh, MESHLINK_DEBUG, "Secondary chunk would overwrite our own host config file.\n");
-                       free(name);
+                       free(name2);
                        meshlink_errno = MESHLINK_EPEER;
                        return false;
                }
 
                node_t *n = new_node();
-               n->name = name;
+               n->name = name2;
 
-               config_t config = {data, len};
+               config_t config = {data, data_len};
 
                if(!node_read_from_config(mesh, n, &config)) {
                        free_node(n);
@@ -888,7 +888,7 @@ static bool recvline(join_state_t *state) {
        return true;
 }
 
-static bool sendline(int fd, char *format, ...) {
+static bool sendline(int fd, const char *format, ...) {
        char buffer[4096];
        char *p = buffer;
        int blen = 0;
@@ -3136,14 +3136,14 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) {
        pthread_mutex_lock(&mesh->mutex);
 
        while(count--) {
-               const void *data;
-               uint32_t len = packmsg_get_bin_raw(&in, &data);
+               const void *data2;
+               uint32_t len2 = packmsg_get_bin_raw(&in, &data2);
 
-               if(!len) {
+               if(!len2) {
                        break;
                }
 
-               packmsg_input_t in2 = {data, len};
+               packmsg_input_t in2 = {data2, len2};
                uint32_t version = packmsg_get_uint32(&in2);
                char *name = packmsg_get_str_dup(&in2);
 
@@ -3169,7 +3169,7 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) {
                n = new_node();
                n->name = name;
 
-               config_t config = {data, len};
+               config_t config = {data2, len2};
 
                if(!node_read_from_config(mesh, n, &config)) {
                        free_node(n);
@@ -3406,7 +3406,7 @@ bool meshlink_forget_node(meshlink_handle_t *mesh, meshlink_node_t *node) {
        if(mesh->outgoings) {
                for list_each(outgoing_t, outgoing, mesh->outgoings) {
                        if(outgoing->node == n) {
-                               list_delete_node(mesh->outgoings, node);
+                               list_delete_node(mesh->outgoings, list_node);
                        }
                }
        }
@@ -4281,7 +4281,7 @@ void handle_network_change(meshlink_handle_t *mesh, bool online) {
        retry(mesh);
 }
 
-void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t meshlink_errno) {
+void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t cb_errno) {
        // We should only call the callback function if we are in the background thread.
        if(!mesh->error_cb) {
                return;
@@ -4292,7 +4292,7 @@ void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t meshlink_errno) {
        }
 
        if(mesh->thread == pthread_self()) {
-               mesh->error_cb(mesh, meshlink_errno);
+               mesh->error_cb(mesh, cb_errno);
        }
 }
 
index 2763ad8d214ff2d52d2ec3b0ec373c8a0cb12a07..f504497562cf723c3e8d4f2a28315b84ea840e7e 100644 (file)
@@ -140,7 +140,7 @@ struct meshlink_channel {
  *                  The pointer is to static storage that is valid for the lifetime of the application.
  *                  This function will always return a valid pointer, even if an invalid error code has been passed.
  */
-extern const char *meshlink_strerror(meshlink_errno_t err) __attribute__((__warn_unused_result__));
+const char *meshlink_strerror(meshlink_errno_t err) __attribute__((__warn_unused_result__));
 
 /// Create a new meshlink_open_params_t struct.
 /** This function allocates and initializes a new meshlink_open_params_t struct that can be passed to meshlink_open_ex().
@@ -159,14 +159,14 @@ extern const char *meshlink_strerror(meshlink_errno_t err) __attribute__((__warn
  *  @return         A pointer to a meshlink_open_params_t which can be passed to meshlink_open_ex(), or NULL in case of an error.
  *                  The pointer is valid until meshlink_open_params_free() is called.
  */
-extern meshlink_open_params_t *meshlink_open_params_init(const char *confbase, const char *name, const char *appname, dev_class_t devclass) __attribute__((__warn_unused_result__));
+meshlink_open_params_t *meshlink_open_params_init(const char *confbase, const char *name, const char *appname, dev_class_t devclass) __attribute__((__warn_unused_result__));
 
 /// Free a meshlink_open_params_t struct.
 /** This function frees a meshlink_open_params_t struct and all resources associated with it.
  *
  *  @param params   A pointer to a meshlink_open_params_t which must have been created earlier with meshlink_open_params_init().
  */
-extern void meshlink_open_params_free(meshlink_open_params_t *params);
+void meshlink_open_params_free(meshlink_open_params_t *params);
 
 /// Set the network namespace MeshLink should use.
 /** This function changes the open parameters to use the given netns filedescriptor.
@@ -176,7 +176,7 @@ extern void meshlink_open_params_free(meshlink_open_params_t *params);
  *
  *  @return         This function will return true if the open parameters have been successfully updated, false otherwise.
  */
-extern bool meshlink_open_params_set_netns(meshlink_open_params_t *params, int netns) __attribute__((__warn_unused_result__));
+bool meshlink_open_params_set_netns(meshlink_open_params_t *params, int netns) __attribute__((__warn_unused_result__));
 
 /// Set the encryption key MeshLink should use for local storage.
 /** This function changes the open parameters to use the given key for encrypting MeshLink's own configuration files.
@@ -187,7 +187,7 @@ extern bool meshlink_open_params_set_netns(meshlink_open_params_t *params, int n
  *
  *  @return         This function will return true if the open parameters have been successfully updated, false otherwise.
  */
-extern bool meshlink_open_params_set_storage_key(meshlink_open_params_t *params, const void *key, size_t keylen) __attribute__((__warn_unused_result__));
+bool meshlink_open_params_set_storage_key(meshlink_open_params_t *params, const void *key, size_t keylen) __attribute__((__warn_unused_result__));
 
 /// Open or create a MeshLink instance.
 /** This function opens or creates a MeshLink instance.
@@ -207,7 +207,7 @@ extern bool meshlink_open_params_set_storage_key(meshlink_open_params_t *params,
  *  @return         A pointer to a struct meshlink_handle which represents this instance of MeshLink, or NULL in case of an error.
  *                  The pointer is valid until meshlink_close() is called.
  */
-extern struct meshlink_handle *meshlink_open_ex(const meshlink_open_params_t *params) __attribute__((__warn_unused_result__));
+struct meshlink_handle *meshlink_open_ex(const meshlink_open_params_t *params) __attribute__((__warn_unused_result__));
 
 /// Open or create a MeshLink instance.
 /** This function opens or creates a MeshLink instance.
@@ -237,7 +237,7 @@ extern struct meshlink_handle *meshlink_open_ex(const meshlink_open_params_t *pa
  *  @return         A pointer to a struct meshlink_handle which represents this instance of MeshLink, or NULL in case of an error.
  *                  The pointer is valid until meshlink_close() is called.
  */
-extern struct meshlink_handle *meshlink_open(const char *confbase, const char *name, const char *appname, dev_class_t devclass) __attribute__((__warn_unused_result__));
+struct meshlink_handle *meshlink_open(const char *confbase, const char *name, const char *appname, dev_class_t devclass) __attribute__((__warn_unused_result__));
 
 /// Open or create a MeshLink instance that uses encrypted storage.
 /** This function opens or creates a MeshLink instance.
@@ -269,7 +269,7 @@ extern struct meshlink_handle *meshlink_open(const char *confbase, const char *n
  *  @return         A pointer to a struct meshlink_handle which represents this instance of MeshLink, or NULL in case of an error.
  *                  The pointer is valid until meshlink_close() is called.
  */
-extern struct meshlink_handle *meshlink_open_encrypted(const char *confbase, const char *name, const char *appname, dev_class_t devclass, const void *key, size_t keylen) __attribute__((__warn_unused_result__));
+struct meshlink_handle *meshlink_open_encrypted(const char *confbase, const char *name, const char *appname, dev_class_t devclass, const void *key, size_t keylen) __attribute__((__warn_unused_result__));
 
 /// Create an ephemeral MeshLink instance that does not store any state.
 /** This function creates a MeshLink instance.
@@ -293,7 +293,7 @@ extern struct meshlink_handle *meshlink_open_encrypted(const char *confbase, con
  *  @return         A pointer to a struct meshlink_handle which represents this instance of MeshLink, or NULL in case of an error.
  *                  The pointer is valid until meshlink_close() is called.
  */
-extern struct meshlink_handle *meshlink_open_ephemeral(const char *name, const char *appname, dev_class_t devclass) __attribute__((__warn_unused_result__));
+struct meshlink_handle *meshlink_open_ephemeral(const char *name, const char *appname, dev_class_t devclass) __attribute__((__warn_unused_result__));
 
 /// Create Sub-Mesh.
 /** This function causes MeshLink to open a new Sub-Mesh network
@@ -322,7 +322,7 @@ struct meshlink_submesh *meshlink_submesh_open(struct meshlink_handle *mesh, con
  *
  *  @return         This function will return true if MeshLink has successfully started, false otherwise.
  */
-extern bool meshlink_start(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+bool meshlink_start(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
 
 /// Stop MeshLink.
 /** This function causes MeshLink to disconnect from all other nodes,
@@ -334,7 +334,7 @@ extern bool meshlink_start(struct meshlink_handle *mesh) __attribute__((__warn_u
  *  \memberof meshlink_handle
  *  @param mesh     A handle which represents an instance of MeshLink.
  */
-extern void meshlink_stop(struct meshlink_handle *mesh);
+void meshlink_stop(struct meshlink_handle *mesh);
 
 /// Close the MeshLink handle.
 /** This function calls meshlink_stop() if necessary,
@@ -348,7 +348,7 @@ extern void meshlink_stop(struct meshlink_handle *mesh);
  * \memberof meshlink_handle
  *  @param mesh     A handle which represents an instance of MeshLink.
  */
-extern void meshlink_close(struct meshlink_handle *mesh);
+void meshlink_close(struct meshlink_handle *mesh);
 
 /// Destroy a MeshLink instance.
 /** This function remove all configuration files of a MeshLink instance. It should only be called when the application
@@ -360,7 +360,7 @@ extern void meshlink_close(struct meshlink_handle *mesh);
  *
  *  @return         This function will return true if the MeshLink instance was successfully destroyed, false otherwise.
  */
-extern bool meshlink_destroy(const char *confbase) __attribute__((__warn_unused_result__));
+bool meshlink_destroy(const char *confbase) __attribute__((__warn_unused_result__));
 
 /// A callback for receiving data from the mesh.
 /** @param mesh      A handle which represents an instance of MeshLink.
@@ -384,7 +384,7 @@ typedef void (*meshlink_receive_cb_t)(struct meshlink_handle *mesh, struct meshl
  *  @param cb        A pointer to the function which will be called when another node sends data to the local node.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_receive_cb(struct meshlink_handle *mesh, meshlink_receive_cb_t cb);
+void meshlink_set_receive_cb(struct meshlink_handle *mesh, meshlink_receive_cb_t cb);
 
 /// A callback reporting the meta-connection attempt made by the host node to an another node.
 /** @param mesh      A handle which represents an instance of MeshLink.
@@ -405,7 +405,7 @@ typedef void (*meshlink_connection_try_cb_t)(struct meshlink_handle *mesh, struc
  *  @param cb        A pointer to the function which will be called when host node attempts to make
  *                   the connection to another node. If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_connection_try_cb(struct meshlink_handle *mesh, meshlink_connection_try_cb_t cb);
+void meshlink_set_connection_try_cb(struct meshlink_handle *mesh, meshlink_connection_try_cb_t cb);
 
 /// A callback reporting node status changes.
 /** @param mesh      A handle which represents an instance of MeshLink.
@@ -427,7 +427,7 @@ typedef void (*meshlink_node_status_cb_t)(struct meshlink_handle *mesh, struct m
  *  @param cb        A pointer to the function which will be called when another node's status changes.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_node_status_cb(struct meshlink_handle *mesh, meshlink_node_status_cb_t cb);
+void meshlink_set_node_status_cb(struct meshlink_handle *mesh, meshlink_node_status_cb_t cb);
 
 /// A callback reporting node path MTU changes.
 /** @param mesh      A handle which represents an instance of MeshLink.
@@ -449,7 +449,7 @@ typedef void (*meshlink_node_pmtu_cb_t)(struct meshlink_handle *mesh, struct mes
  *  @param cb        A pointer to the function which will be called when another node's extended status changes.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_node_pmtu_cb(struct meshlink_handle *mesh, meshlink_node_pmtu_cb_t cb);
+void meshlink_set_node_pmtu_cb(struct meshlink_handle *mesh, meshlink_node_pmtu_cb_t cb);
 
 /// A callback reporting duplicate node detection.
 /** @param mesh       A handle which represents an instance of MeshLink.
@@ -470,7 +470,7 @@ typedef void (*meshlink_node_duplicate_cb_t)(struct meshlink_handle *mesh, struc
  *  @param cb        A pointer to the function which will be called when a duplicate node is detected.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_node_duplicate_cb(struct meshlink_handle *mesh, meshlink_node_duplicate_cb_t cb);
+void meshlink_set_node_duplicate_cb(struct meshlink_handle *mesh, meshlink_node_duplicate_cb_t cb);
 
 /// Severity of log messages generated by MeshLink.
 typedef enum {
@@ -513,7 +513,7 @@ typedef void (*meshlink_log_cb_t)(struct meshlink_handle *mesh, meshlink_log_lev
  *  @param cb        A pointer to the function which will be called when another node sends data to the local node.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_log_cb(struct meshlink_handle *mesh, meshlink_log_level_t level, meshlink_log_cb_t cb);
+void meshlink_set_log_cb(struct meshlink_handle *mesh, meshlink_log_level_t level, meshlink_log_cb_t cb);
 
 /// A callback for receiving error conditions encountered by the MeshLink thread.
 /** @param mesh      A handle which represents an instance of MeshLink, or NULL.
@@ -545,7 +545,7 @@ typedef void (*meshlink_error_cb_t)(struct meshlink_handle *mesh, meshlink_errno
  *  @param cb        A pointer to the function which will be called when a serious error is encountered.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_error_cb(struct meshlink_handle *mesh, meshlink_error_cb_t cb);
+void meshlink_set_error_cb(struct meshlink_handle *mesh, meshlink_error_cb_t cb);
 
 /// Send data to another node.
 /** This functions sends one packet of data to another node in the mesh.
@@ -566,7 +566,7 @@ extern void meshlink_set_error_cb(struct meshlink_handle *mesh, meshlink_error_c
  *  @return             This function will return true if MeshLink has queued the message for transmission, and false otherwise.
  *                      A return value of true does not guarantee that the message will actually arrive at the destination.
  */
-extern bool meshlink_send(struct meshlink_handle *mesh, struct meshlink_node *destination, const void *data, size_t len) __attribute__((__warn_unused_result__));
+bool meshlink_send(struct meshlink_handle *mesh, struct meshlink_node *destination, const void *data, size_t len) __attribute__((__warn_unused_result__));
 
 /// Query the maximum packet size that can be sent to a node.
 /** This functions returns the maximum size of packets (path MTU) that can be sent to a specific node with meshlink_send().
@@ -582,7 +582,7 @@ extern bool meshlink_send(struct meshlink_handle *mesh, struct meshlink_node *de
  *  @return             The recommended maximum size of packets that are to be sent to the destination node, 0 if the node is unreachable,
  *                      or a negative value in case of an error.
  */
-extern ssize_t meshlink_get_pmtu(struct meshlink_handle *mesh, struct meshlink_node *destination) __attribute__((__warn_unused_result__));
+ssize_t meshlink_get_pmtu(struct meshlink_handle *mesh, struct meshlink_node *destination) __attribute__((__warn_unused_result__));
 
 /// Get a handle for our own node.
 /** This function returns a handle for the local node.
@@ -593,7 +593,7 @@ extern ssize_t meshlink_get_pmtu(struct meshlink_handle *mesh, struct meshlink_n
  *  @return             A pointer to a struct meshlink_node which represents the local node.
  *                      The pointer is guaranteed to be valid until meshlink_close() is called.
  */
-extern struct meshlink_node *meshlink_get_self(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+struct meshlink_node *meshlink_get_self(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
 
 /// Get a handle for a specific node.
 /** This function returns a handle for the node with the given name.
@@ -607,7 +607,7 @@ extern struct meshlink_node *meshlink_get_self(struct meshlink_handle *mesh) __a
  *                      or NULL if the requested node does not exist.
  *                      The pointer is guaranteed to be valid until meshlink_close() is called.
  */
-extern struct meshlink_node *meshlink_get_node(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
+struct meshlink_node *meshlink_get_node(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
 
 /// Get a handle for a specific submesh.
 /** This function returns a handle for the submesh with the given name.
@@ -621,7 +621,7 @@ extern struct meshlink_node *meshlink_get_node(struct meshlink_handle *mesh, con
  *                      or NULL if the requested submesh does not exist.
  *                      The pointer is guaranteed to be valid until meshlink_close() is called.
  */
-extern struct meshlink_submesh *meshlink_get_submesh(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
+struct meshlink_submesh *meshlink_get_submesh(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
 
 /// Get the fingerprint of a node's public key.
 /** This function returns a fingerprint of the node's public key.
@@ -634,7 +634,7 @@ extern struct meshlink_submesh *meshlink_get_submesh(struct meshlink_handle *mes
  *  @return             A nul-terminated C string containing the fingerprint of the node's public key in a printable ASCII format.
  *                      The application should call free() after it is done using this string.
  */
-extern char *meshlink_get_fingerprint(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+char *meshlink_get_fingerprint(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
 
 /// Get a list of all nodes.
 /** This function returns a list with handles for all known nodes.
@@ -654,7 +654,7 @@ extern char *meshlink_get_fingerprint(struct meshlink_handle *mesh, struct meshl
  *                      If it is a new value, the old value of @a nodes should not be used anymore.
  *                      If the new value is NULL, then the old array will have been freed by MeshLink.
  */
-extern struct meshlink_node **meshlink_get_all_nodes(struct meshlink_handle *mesh, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
+struct meshlink_node **meshlink_get_all_nodes(struct meshlink_handle *mesh, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
 
 /// Sign data using the local node's MeshLink key.
 /** This function signs data using the local node's MeshLink key.
@@ -671,7 +671,7 @@ extern struct meshlink_node **meshlink_get_all_nodes(struct meshlink_handle *mes
  *
  *  @return             This function returns true if the signature was correctly generated, false otherwise.
  */
-extern bool meshlink_sign(struct meshlink_handle *mesh, const void *data, size_t len, void *signature, size_t *siglen) __attribute__((__warn_unused_result__));
+bool meshlink_sign(struct meshlink_handle *mesh, const void *data, size_t len, void *signature, size_t *siglen) __attribute__((__warn_unused_result__));
 
 /// 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.
@@ -692,7 +692,7 @@ extern bool meshlink_sign(struct meshlink_handle *mesh, const void *data, size_t
  *                      If it is a new value, the old value of @a nodes should not be used anymore.
  *                      If the new value is NULL, then the old array will have been freed by MeshLink.
  */
-extern struct meshlink_node **meshlink_get_all_nodes_by_dev_class(struct meshlink_handle *mesh, dev_class_t devclass, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
+struct meshlink_node **meshlink_get_all_nodes_by_dev_class(struct meshlink_handle *mesh, dev_class_t devclass, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
 
 /// Get the list of all nodes by Submesh.
 /** This function returns a list with handles for all the nodes that matches with the given @a Submesh.
@@ -713,7 +713,7 @@ extern struct meshlink_node **meshlink_get_all_nodes_by_dev_class(struct meshlin
  *                      If it is a new value, the old value of @a nodes should not be used anymore.
  *                      If the new value is NULL, then the old array will have been freed by MeshLink.
  */
-extern struct meshlink_node **meshlink_get_all_nodes_by_submesh(struct meshlink_handle *mesh, struct meshlink_submesh *submesh, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
+struct meshlink_node **meshlink_get_all_nodes_by_submesh(struct meshlink_handle *mesh, struct meshlink_submesh *submesh, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
 
 /// Get the list of all nodes by time they were last reachable.
 /** This function returns a list with handles for all the nodes whose last known reachability time overlaps with the given time range.
@@ -737,7 +737,7 @@ extern struct meshlink_node **meshlink_get_all_nodes_by_submesh(struct meshlink_
  *                      If it is a new value, the old value of @a nodes should not be used anymore.
  *                      If the new value is NULL, then the old array will have been freed by MeshLink.
  */
-extern struct meshlink_node **meshlink_get_all_nodes_by_last_reachable(struct meshlink_handle *mesh, time_t start, time_t end, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
+struct meshlink_node **meshlink_get_all_nodes_by_last_reachable(struct meshlink_handle *mesh, time_t start, time_t end, struct meshlink_node **nodes, size_t *nmemb) __attribute__((__warn_unused_result__));
 
 /// Get the node's device class.
 /** This function returns the device class of the given node.
@@ -748,7 +748,7 @@ extern struct meshlink_node **meshlink_get_all_nodes_by_last_reachable(struct me
  *
  *  @return              This function returns the device class of the @a node, or -1 in case of an error.
  */
-extern dev_class_t meshlink_get_node_dev_class(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+dev_class_t meshlink_get_node_dev_class(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
 
 /// Get the node's submesh handle.
 /** This function returns the submesh handle of the given node.
@@ -759,7 +759,7 @@ extern dev_class_t meshlink_get_node_dev_class(struct meshlink_handle *mesh, str
  *
  *  @return              This function returns the submesh handle of the @a node, or NULL in case of an error.
  */
-extern struct meshlink_submesh *meshlink_get_node_submesh(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+struct meshlink_submesh *meshlink_get_node_submesh(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
 
 /// Get a node's reachability status.
 /** This function returns the current reachability of a given node, and the times of the last state changes.
@@ -775,7 +775,7 @@ extern struct meshlink_submesh *meshlink_get_node_submesh(struct meshlink_handle
  *
  *  @return                  This function returns true if the node is currently reachable, false otherwise.
  */
-extern bool meshlink_get_node_reachability(struct meshlink_handle *mesh, struct meshlink_node *node, time_t *last_reachable, time_t *last_unreachable);
+bool meshlink_get_node_reachability(struct meshlink_handle *mesh, struct meshlink_node *node, time_t *last_reachable, time_t *last_unreachable);
 
 /// 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.
@@ -791,7 +791,7 @@ extern bool meshlink_get_node_reachability(struct meshlink_handle *mesh, struct
  *
  *  @return             This function returns true if the signature is valid, false otherwise.
  */
-extern bool meshlink_verify(struct meshlink_handle *mesh, struct meshlink_node *source, const void *data, size_t len, const void *signature, size_t siglen) __attribute__((__warn_unused_result__));
+bool meshlink_verify(struct meshlink_handle *mesh, struct meshlink_node *source, const void *data, size_t len, const void *signature, size_t siglen) __attribute__((__warn_unused_result__));
 
 /// Set the canonical Address for a node.
 /** This function sets the canonical Address for a node.
@@ -811,7 +811,7 @@ extern bool meshlink_verify(struct meshlink_handle *mesh, struct meshlink_node *
  *
  *  @return             This function returns true if the address was added, false otherwise.
  */
-extern bool meshlink_set_canonical_address(struct meshlink_handle *mesh, struct meshlink_node *node, const char *address, const char *port) __attribute__((__warn_unused_result__));
+bool meshlink_set_canonical_address(struct meshlink_handle *mesh, struct meshlink_node *node, const char *address, const char *port) __attribute__((__warn_unused_result__));
 
 /// Add an invitation address for the local node.
 /** This function adds an address for the local node, which will be used only for invitation URLs.
@@ -826,7 +826,7 @@ extern bool meshlink_set_canonical_address(struct meshlink_handle *mesh, struct
  *
  *  @return             This function returns true if the address was added, false otherwise.
  */
-extern bool meshlink_add_invitation_address(struct meshlink_handle *mesh, const char *address, const char *port) __attribute__((__warn_unused_result__));
+bool meshlink_add_invitation_address(struct meshlink_handle *mesh, const char *address, const char *port) __attribute__((__warn_unused_result__));
 
 /// Clears all invitation address for the local node.
 /** This function removes all addresses added with meshlink_add_invitation_address().
@@ -834,7 +834,7 @@ extern bool meshlink_add_invitation_address(struct meshlink_handle *mesh, const
  *  \memberof meshlink_handle
  *  @param mesh         A handle which represents an instance of MeshLink.
  */
-extern void meshlink_clear_invitation_addresses(struct meshlink_handle *mesh);
+void meshlink_clear_invitation_addresses(struct meshlink_handle *mesh);
 
 /// Add an Address for the local node.
 /** This function adds an Address for the local node, which will be used for invitation URLs.
@@ -846,7 +846,7 @@ extern void meshlink_clear_invitation_addresses(struct meshlink_handle *mesh);
  *
  *  @return             This function returns true if the address was added, false otherwise.
  */
-extern bool meshlink_add_address(struct meshlink_handle *mesh, const char *address) __attribute__((__warn_unused_result__, __deprecated__("use meshlink_set_canonical_address() and/or meshlink_add_invitation_address() instead")));
+bool meshlink_add_address(struct meshlink_handle *mesh, const char *address) __attribute__((__warn_unused_result__, __deprecated__("use meshlink_set_canonical_address() and/or meshlink_add_invitation_address() instead")));
 
 /// Try to discover the external address for the local node.
 /** This function performs tries to discover the local node's external address
@@ -870,7 +870,7 @@ extern bool meshlink_add_address(struct meshlink_handle *mesh, const char *addre
  *                      or NULL if there was an error looking up the address.
  *                      After meshlink_get_external_address() returns, the application is free to overwrite or free this string.
  */
-extern char *meshlink_get_external_address(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+char *meshlink_get_external_address(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
 
 /// Try to discover the external address for the local node.
 /** This function performs tries to discover the local node's external address
@@ -896,7 +896,7 @@ extern char *meshlink_get_external_address(struct meshlink_handle *mesh) __attri
  *                         or NULL if there was an error looking up the address.
  *                         After meshlink_get_external_address_for_family() returns, the application is free to overwrite or free this string.
  */
-extern char *meshlink_get_external_address_for_family(struct meshlink_handle *mesh, int address_family) __attribute__((__warn_unused_result__));
+char *meshlink_get_external_address_for_family(struct meshlink_handle *mesh, int address_family) __attribute__((__warn_unused_result__));
 
 /// Try to discover the local address for the local node.
 /** This function performs tries to discover the address of the local interface used for outgoing connection.
@@ -919,7 +919,7 @@ extern char *meshlink_get_external_address_for_family(struct meshlink_handle *me
  *                         or NULL if there was an error looking up the address.
  *                         After meshlink_get_local_address_for_family() returns, the application is free to overwrite or free this string.
  */
-extern char *meshlink_get_local_address_for_family(struct meshlink_handle *mesh, int address_family) __attribute__((__warn_unused_result__));
+char *meshlink_get_local_address_for_family(struct meshlink_handle *mesh, int address_family) __attribute__((__warn_unused_result__));
 
 /// Try to discover the external address for the local node, and add it to its list of addresses.
 /** This function is equivalent to:
@@ -933,7 +933,7 @@ extern char *meshlink_get_local_address_for_family(struct meshlink_handle *mesh,
  *
  *  @return             This function returns true if the address was added, false otherwise.
  */
-extern bool meshlink_add_external_address(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+bool meshlink_add_external_address(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
 
 /// Get the network port used by the local node.
 /** This function returns the network port that the local node is listening on.
@@ -943,7 +943,7 @@ extern bool meshlink_add_external_address(struct meshlink_handle *mesh) __attrib
  *
  *  @return              This function returns the port number, or -1 in case of an error.
  */
-extern int meshlink_get_port(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+int meshlink_get_port(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
 
 /// Set the network port used by the local node.
 /** This function sets the network port that the local node is listening on.
@@ -964,7 +964,7 @@ extern int meshlink_get_port(struct meshlink_handle *mesh) __attribute__((__warn
  *                       is no guarantee that MeshLink is listening on the old port.
  */
 
-extern bool meshlink_set_port(struct meshlink_handle *mesh, int port) __attribute__((__warn_unused_result__));
+bool meshlink_set_port(struct meshlink_handle *mesh, int port) __attribute__((__warn_unused_result__));
 
 /// Set the timeout for invitations.
 /** This function sets the timeout for invitations.
@@ -975,7 +975,7 @@ extern bool meshlink_set_port(struct meshlink_handle *mesh, int port) __attribut
  *  @param mesh         A handle which represents an instance of MeshLink.
  *  @param timeout      The timeout for invitations in seconds.
  */
-extern void meshlink_set_invitation_timeout(struct meshlink_handle *mesh, int timeout);
+void meshlink_set_invitation_timeout(struct meshlink_handle *mesh, int timeout);
 
 /// Invite another node into the mesh.
 /** This function generates an invitation that can be used by another node to join the same mesh as the local node.
@@ -993,7 +993,7 @@ extern void meshlink_set_invitation_timeout(struct meshlink_handle *mesh, int ti
  *  @return             This function returns a nul-terminated C string that contains the invitation URL, or NULL in case of an error.
  *                      The application should call free() after it has finished using the URL.
  */
-extern char *meshlink_invite_ex(struct meshlink_handle *mesh, struct meshlink_submesh *submesh, const char *name, uint32_t flags) __attribute__((__warn_unused_result__));
+char *meshlink_invite_ex(struct meshlink_handle *mesh, struct meshlink_submesh *submesh, const char *name, uint32_t flags) __attribute__((__warn_unused_result__));
 
 /// Invite another node into the mesh.
 /** This function generates an invitation that can be used by another node to join the same mesh as the local node.
@@ -1012,7 +1012,7 @@ extern char *meshlink_invite_ex(struct meshlink_handle *mesh, struct meshlink_su
  *  @return             This function returns a nul-terminated C string that contains the invitation URL, or NULL in case of an error.
  *                      The application should call free() after it has finished using the URL.
  */
-extern char *meshlink_invite(struct meshlink_handle *mesh, struct meshlink_submesh *submesh, const char *name) __attribute__((__warn_unused_result__));
+char *meshlink_invite(struct meshlink_handle *mesh, struct meshlink_submesh *submesh, const char *name) __attribute__((__warn_unused_result__));
 
 /// Use an invitation to join a mesh.
 /** This function allows the local node to join an existing mesh using an invitation URL generated by another node.
@@ -1032,7 +1032,7 @@ extern char *meshlink_invite(struct meshlink_handle *mesh, struct meshlink_subme
  *
  *  @return             This function returns true if the local node joined the mesh it was invited to, false otherwise.
  */
-extern bool meshlink_join(struct meshlink_handle *mesh, const char *invitation) __attribute__((__warn_unused_result__));
+bool meshlink_join(struct meshlink_handle *mesh, const char *invitation) __attribute__((__warn_unused_result__));
 
 /// Export the local node's key and addresses.
 /** This function generates a string that contains the local node's public key and one or more IP addresses.
@@ -1048,7 +1048,7 @@ extern bool meshlink_join(struct meshlink_handle *mesh, const char *invitation)
  *  @return             This function returns a nul-terminated C string that contains the exported key and addresses, or NULL in case of an error.
  *                      The application should call free() after it has finished using this string.
  */
-extern char *meshlink_export(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+char *meshlink_export(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
 
 /// Import another node's key and addresses.
 /** This function accepts a string containing the exported public key and addresses of another node.
@@ -1064,7 +1064,7 @@ extern char *meshlink_export(struct meshlink_handle *mesh) __attribute__((__warn
  *
  *  @return             This function returns true if the data was valid and the other node has been granted access to the mesh, false otherwise.
  */
-extern bool meshlink_import(struct meshlink_handle *mesh, const char *data) __attribute__((__warn_unused_result__));
+bool meshlink_import(struct meshlink_handle *mesh, const char *data) __attribute__((__warn_unused_result__));
 
 /// Forget any information about a node.
 /** This function allows the local node to forget any information it has about a node,
@@ -1086,7 +1086,7 @@ extern bool meshlink_import(struct meshlink_handle *mesh, const char *data) __at
  *
  *  @return             This function returns true if all currently known data about the node has been forgotten, false otherwise.
  */
-extern bool meshlink_forget_node(struct meshlink_handle *mesh, struct meshlink_node *node);
+bool meshlink_forget_node(struct meshlink_handle *mesh, struct meshlink_node *node);
 
 /// Blacklist a node from the mesh.
 /** This function causes the local node to blacklist another node.
@@ -1099,7 +1099,7 @@ extern bool meshlink_forget_node(struct meshlink_handle *mesh, struct meshlink_n
  *
  *  @return             This function returns true if the node has been blacklisted, false otherwise.
  */
-extern bool meshlink_blacklist(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+bool meshlink_blacklist(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
 
 /// Blacklist a node from the mesh by name.
 /** This function causes the local node to blacklist another node by name.
@@ -1114,7 +1114,7 @@ extern bool meshlink_blacklist(struct meshlink_handle *mesh, struct meshlink_nod
  *
  *  @return             This function returns true if the node has been blacklisted, false otherwise.
  */
-extern bool meshlink_blacklist_by_name(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
+bool meshlink_blacklist_by_name(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
 
 /// Whitelist a node on the mesh.
 /** This function causes the local node to whitelist a previously blacklisted node.
@@ -1127,7 +1127,7 @@ extern bool meshlink_blacklist_by_name(struct meshlink_handle *mesh, const char
  *
  *  @return             This function returns true if the node has been whitelisted, false otherwise.
  */
-extern bool meshlink_whitelist(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+bool meshlink_whitelist(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
 
 /// Whitelist a node on the mesh by name.
 /** This function causes the local node to whitelist a node by name.
@@ -1143,7 +1143,7 @@ extern bool meshlink_whitelist(struct meshlink_handle *mesh, struct meshlink_nod
  *
  *  @return             This function returns true if the node has been whitelisted, false otherwise.
  */
-extern bool meshlink_whitelist_by_name(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
+bool meshlink_whitelist_by_name(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
 
 /// Set whether new nodes are blacklisted by default.
 /** This function sets the blacklist behaviour for newly discovered nodes.
@@ -1156,7 +1156,7 @@ extern bool meshlink_whitelist_by_name(struct meshlink_handle *mesh, const char
  *  @param mesh         A handle which represents an instance of MeshLink.
  *  @param blacklist    True if new nodes are to be blacklisted, false if whitelisted.
  */
-extern void meshlink_set_default_blacklist(struct meshlink_handle *mesh, bool blacklist);
+void meshlink_set_default_blacklist(struct meshlink_handle *mesh, bool blacklist);
 
 /// A callback for accepting incoming channels.
 /** This function is called whenever a remote node wants to open a channel to the local node.
@@ -1224,7 +1224,7 @@ typedef void (*meshlink_channel_poll_cb_t)(struct meshlink_handle *mesh, struct
  *  @param cb        A pointer to the function which will be called when another node sends data to the local node.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_channel_accept_cb(struct meshlink_handle *mesh, meshlink_channel_accept_cb_t cb);
+void meshlink_set_channel_accept_cb(struct meshlink_handle *mesh, meshlink_channel_accept_cb_t cb);
 
 /// Set the receive callback.
 /** This functions sets the callback that is called whenever another node sends data to the local node.
@@ -1239,7 +1239,7 @@ extern void meshlink_set_channel_accept_cb(struct meshlink_handle *mesh, meshlin
  *  @param cb        A pointer to the function which will be called when another node sends data to the local node.
  *                   If a NULL pointer is given, the callback will be disabled and incoming data is ignored.
  */
-extern void meshlink_set_channel_receive_cb(struct meshlink_handle *mesh, struct meshlink_channel *channel, meshlink_channel_receive_cb_t cb);
+void meshlink_set_channel_receive_cb(struct meshlink_handle *mesh, struct meshlink_channel *channel, meshlink_channel_receive_cb_t cb);
 
 /// Set the poll callback.
 /** This functions sets the callback that is called whenever data can be sent to another node.
@@ -1254,7 +1254,7 @@ extern void meshlink_set_channel_receive_cb(struct meshlink_handle *mesh, struct
  *  @param cb        A pointer to the function which will be called when data can be sent to another node.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_channel_poll_cb(struct meshlink_handle *mesh, struct meshlink_channel *channel, meshlink_channel_poll_cb_t cb);
+void meshlink_set_channel_poll_cb(struct meshlink_handle *mesh, struct meshlink_channel *channel, meshlink_channel_poll_cb_t cb);
 
 /// Set the send buffer size of a channel.
 /** This function sets the desired size of the send buffer.
@@ -1266,7 +1266,7 @@ extern void meshlink_set_channel_poll_cb(struct meshlink_handle *mesh, struct me
  *  @param size      The desired size for the send buffer.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_channel_sndbuf(struct meshlink_handle *mesh, struct meshlink_channel *channel, size_t size);
+void meshlink_set_channel_sndbuf(struct meshlink_handle *mesh, struct meshlink_channel *channel, size_t size);
 
 /// Set the receive buffer size of a channel.
 /** This function sets the desired size of the receive buffer.
@@ -1278,7 +1278,7 @@ extern void meshlink_set_channel_sndbuf(struct meshlink_handle *mesh, struct mes
  *  @param size      The desired size for the send buffer.
  *                   If a NULL pointer is given, the callback will be disabled.
  */
-extern void meshlink_set_channel_rcvbuf(struct meshlink_handle *mesh, struct meshlink_channel *channel, size_t size);
+void meshlink_set_channel_rcvbuf(struct meshlink_handle *mesh, struct meshlink_channel *channel, size_t size);
 
 /// Open a reliable stream channel to another node.
 /** This function is called whenever a remote node wants to open a channel to the local node.
@@ -1303,7 +1303,7 @@ extern void meshlink_set_channel_rcvbuf(struct meshlink_handle *mesh, struct mes
  *  @return             A handle for the channel, or NULL in case of an error.
  *                      The handle is valid until meshlink_channel_close() is called.
  */
-extern struct meshlink_channel *meshlink_channel_open_ex(struct meshlink_handle *mesh, struct meshlink_node *node, uint16_t port, meshlink_channel_receive_cb_t cb, const void *data, size_t len, uint32_t flags) __attribute__((__warn_unused_result__));
+struct meshlink_channel *meshlink_channel_open_ex(struct meshlink_handle *mesh, struct meshlink_node *node, uint16_t port, meshlink_channel_receive_cb_t cb, const void *data, size_t len, uint32_t flags) __attribute__((__warn_unused_result__));
 
 /// Open a reliable stream channel to another node.
 /** This function is called whenever a remote node wants to open a channel to the local node.
@@ -1330,7 +1330,7 @@ extern struct meshlink_channel *meshlink_channel_open_ex(struct meshlink_handle
  *  @return             A handle for the channel, or NULL in case of an error.
  *                      The handle is valid until meshlink_channel_close() is called.
  */
-extern struct meshlink_channel *meshlink_channel_open(struct meshlink_handle *mesh, struct meshlink_node *node, uint16_t port, meshlink_channel_receive_cb_t cb, const void *data, size_t len) __attribute__((__warn_unused_result__));
+struct meshlink_channel *meshlink_channel_open(struct meshlink_handle *mesh, struct meshlink_node *node, uint16_t port, meshlink_channel_receive_cb_t cb, const void *data, size_t len) __attribute__((__warn_unused_result__));
 
 /// Partially close a reliable stream channel.
 /** This shuts down the read or write side of a channel, or both, without closing the handle.
@@ -1344,7 +1344,7 @@ extern struct meshlink_channel *meshlink_channel_open(struct meshlink_handle *me
  *  @param channel      A handle for the channel.
  *  @param direction    Must be one of SHUT_RD, SHUT_WR or SHUT_RDWR, otherwise this call will not have any affect.
  */
-extern void meshlink_channel_shutdown(struct meshlink_handle *mesh, struct meshlink_channel *channel, int direction);
+void meshlink_channel_shutdown(struct meshlink_handle *mesh, struct meshlink_channel *channel, int direction);
 
 /// Close a reliable stream channel.
 /** This informs the remote node that the local node has finished sending all data on the channel.
@@ -1359,7 +1359,7 @@ extern void meshlink_channel_shutdown(struct meshlink_handle *mesh, struct meshl
  *  @param mesh         A handle which represents an instance of MeshLink.
  *  @param channel      A handle for the channel.
  */
-extern void meshlink_channel_close(struct meshlink_handle *mesh, struct meshlink_channel *channel);
+void meshlink_channel_close(struct meshlink_handle *mesh, struct meshlink_channel *channel);
 
 /// Transmit data on a channel
 /** This queues data to send to the remote node.
@@ -1375,7 +1375,7 @@ extern void meshlink_channel_close(struct meshlink_handle *mesh, struct meshlink
  *                      If MESHLINK_CHANNEL_NO_PARTIAL is set, then the result will either be len,
  *                      0 if the buffer is currently too full, or -1 if len is too big even for an empty buffer.
  */
-extern ssize_t meshlink_channel_send(struct meshlink_handle *mesh, struct meshlink_channel *channel, const void *data, size_t len) __attribute__((__warn_unused_result__));
+ssize_t meshlink_channel_send(struct meshlink_handle *mesh, struct meshlink_channel *channel, const void *data, size_t len) __attribute__((__warn_unused_result__));
 
 /// A callback for cleaning up buffers submitted for asynchronous I/O.
 /** This callbacks signals that MeshLink has finished using this buffer.
@@ -1417,7 +1417,7 @@ typedef void (*meshlink_aio_fd_cb_t)(struct meshlink_handle *mesh, struct meshli
  *
  *  @return             True if the buffer was enqueued, false otherwise.
  */
-extern bool meshlink_channel_aio_send(struct meshlink_handle *mesh, struct meshlink_channel *channel, const void *data, size_t len, meshlink_aio_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
+bool meshlink_channel_aio_send(struct meshlink_handle *mesh, struct meshlink_channel *channel, const void *data, size_t len, meshlink_aio_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
 
 /// Transmit data on a channel asynchronously from a filedescriptor
 /** This will read up to the specified length number of bytes from the given filedescriptor, and send it over the channel.
@@ -1434,7 +1434,7 @@ extern bool meshlink_channel_aio_send(struct meshlink_handle *mesh, struct meshl
  *
  *  @return             True if the buffer was enqueued, false otherwise.
  */
-extern bool meshlink_channel_aio_fd_send(struct meshlink_handle *mesh, struct meshlink_channel *channel, int fd, size_t len, meshlink_aio_fd_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
+bool meshlink_channel_aio_fd_send(struct meshlink_handle *mesh, struct meshlink_channel *channel, int fd, size_t len, meshlink_aio_fd_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
 
 /// Receive data on a channel asynchronously
 /** This registers a buffer that will be filled with incoming channel data.
@@ -1453,7 +1453,7 @@ extern bool meshlink_channel_aio_fd_send(struct meshlink_handle *mesh, struct me
  *
  *  @return             True if the buffer was enqueued, false otherwise.
  */
-extern bool meshlink_channel_aio_receive(struct meshlink_handle *mesh, struct meshlink_channel *channel, const void *data, size_t len, meshlink_aio_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
+bool meshlink_channel_aio_receive(struct meshlink_handle *mesh, struct meshlink_channel *channel, const void *data, size_t len, meshlink_aio_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
 
 /// Receive data on a channel asynchronously and send it to a filedescriptor
 /** This will read up to the specified length number of bytes from the channel, and send it to the filedescriptor.
@@ -1470,7 +1470,7 @@ extern bool meshlink_channel_aio_receive(struct meshlink_handle *mesh, struct me
  *
  *  @return             True if the buffer was enqueued, false otherwise.
  */
-extern bool meshlink_channel_aio_fd_receive(struct meshlink_handle *mesh, struct meshlink_channel *channel, int fd, size_t len, meshlink_aio_fd_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
+bool meshlink_channel_aio_fd_receive(struct meshlink_handle *mesh, struct meshlink_channel *channel, int fd, size_t len, meshlink_aio_fd_cb_t cb, void *priv) __attribute__((__warn_unused_result__));
 
 /// Get channel flags.
 /** This returns the flags used when opening this channel.
@@ -1481,7 +1481,7 @@ extern bool meshlink_channel_aio_fd_receive(struct meshlink_handle *mesh, struct
  *
  *  @return             The flags set for this channel.
  */
-extern uint32_t meshlink_channel_get_flags(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
+uint32_t meshlink_channel_get_flags(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
 
 /// Get the amount of bytes in the send buffer.
 /** This returns the amount of bytes in the send buffer.
@@ -1493,7 +1493,7 @@ extern uint32_t meshlink_channel_get_flags(struct meshlink_handle *mesh, struct
  *
  *  @return             The amount of un-ACKed bytes in the send buffer.
  */
-extern size_t meshlink_channel_get_sendq(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
+size_t meshlink_channel_get_sendq(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
 
 /// Get the amount of bytes in the receive buffer.
 /** This returns the amount of bytes in the receive buffer.
@@ -1505,7 +1505,7 @@ extern size_t meshlink_channel_get_sendq(struct meshlink_handle *mesh, struct me
  *
  *  @return             The amount of bytes in the receive buffer.
  */
-extern size_t meshlink_channel_get_recvq(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
+size_t meshlink_channel_get_recvq(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
 
 /// Get the maximum segment size of a channel.
 /** This returns the amount of bytes that can be sent at once for channels with UDP semantics.
@@ -1516,7 +1516,7 @@ extern size_t meshlink_channel_get_recvq(struct meshlink_handle *mesh, struct me
  *
  *  @return             The amount of bytes in the receive buffer.
  */
-extern size_t meshlink_channel_get_mss(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
+size_t meshlink_channel_get_mss(struct meshlink_handle *mesh, struct meshlink_channel *channel) __attribute__((__warn_unused_result__));
 
 /// Set the connection timeout used for channels to the given node.
 /** This sets the timeout after which unresponsive channels will be reported as closed.
@@ -1528,7 +1528,7 @@ extern size_t meshlink_channel_get_mss(struct meshlink_handle *mesh, struct mesh
  *  @param timeout      The timeout in seconds after which unresponsive channels will be reported as closed.
  *                      The default is 60 seconds.
  */
-extern void meshlink_set_node_channel_timeout(struct meshlink_handle *mesh, struct meshlink_node *node, int timeout);
+void meshlink_set_node_channel_timeout(struct meshlink_handle *mesh, struct meshlink_node *node, int timeout);
 
 /// Hint that a hostname may be found at an address
 /** This function indicates to meshlink that the given hostname is likely found
@@ -1541,7 +1541,7 @@ extern void meshlink_set_node_channel_timeout(struct meshlink_handle *mesh, stru
  *                  given hostname. The caller is free to overwrite or free
  *                  this memory once meshlink returns.
  */
-extern void meshlink_hint_address(struct meshlink_handle *mesh, struct meshlink_node *node, const struct sockaddr *addr);
+void meshlink_hint_address(struct meshlink_handle *mesh, struct meshlink_node *node, const struct sockaddr *addr);
 
 /// Enable or disable zeroconf discovery of local peers
 /** This controls whether zeroconf discovery using the Catta library will be
@@ -1551,7 +1551,7 @@ extern void meshlink_hint_address(struct meshlink_handle *mesh, struct meshlink_
  *  @param mesh    A handle which represents an instance of MeshLink.
  *  @param enable  Set to true to enable discovery, false to disable.
  */
-extern void meshlink_enable_discovery(struct meshlink_handle *mesh, bool enable);
+void meshlink_enable_discovery(struct meshlink_handle *mesh, bool enable);
 
 /// Performs key rotation for an encrypted storage
 /** This rotates the (master) key for an encrypted storage and discards the old key
@@ -1564,7 +1564,7 @@ extern void meshlink_enable_discovery(struct meshlink_handle *mesh, bool enable)
  *
  *  @return         This function returns true if the key rotation for the encrypted storage succeeds, false otherwise.
  */
-extern bool meshlink_encrypted_key_rotate(struct meshlink_handle *mesh, const void *key, size_t keylen) __attribute__((__warn_unused_result__));
+bool meshlink_encrypted_key_rotate(struct meshlink_handle *mesh, const void *key, size_t keylen) __attribute__((__warn_unused_result__));
 
 /// Set device class timeouts
 /** This sets the ping interval and timeout for a given device class.
@@ -1576,7 +1576,7 @@ extern bool meshlink_encrypted_key_rotate(struct meshlink_handle *mesh, const vo
  *  @param pingtimeout   The required time within which a peer should respond, in seconds. The default is 5.
  *                       The timeout must be smaller than the interval.
  */
-extern void meshlink_set_dev_class_timeouts(struct meshlink_handle *mesh, dev_class_t devclass, int pinginterval, int pingtimeout);
+void meshlink_set_dev_class_timeouts(struct meshlink_handle *mesh, dev_class_t devclass, int pinginterval, int pingtimeout);
 
 /// Set device class fast retry period
 /** This sets the fast retry period for a given device class.
@@ -1587,7 +1587,7 @@ extern void meshlink_set_dev_class_timeouts(struct meshlink_handle *mesh, dev_cl
  *  @param devclass           The device class to update
  *  @param fast_retry_period  The period during which fast connection retries are done. The default is 0.
  */
-extern void meshlink_set_dev_class_fast_retry_period(struct meshlink_handle *mesh, dev_class_t devclass, int fast_retry_period);
+void meshlink_set_dev_class_fast_retry_period(struct meshlink_handle *mesh, dev_class_t devclass, int fast_retry_period);
 
 /// Set which order invitations are committed
 /** This determines in which order configuration files are written to disk during an invitation.
@@ -1598,7 +1598,7 @@ extern void meshlink_set_dev_class_fast_retry_period(struct meshlink_handle *mes
  *  @param mesh               A handle which represents an instance of MeshLink.
  *  @param inviter_commits_first  If true, then the node that invited a peer will commit data to disk first.
  */
-extern void meshlink_set_inviter_commits_first(struct meshlink_handle *mesh, bool inviter_commits_first);
+void meshlink_set_inviter_commits_first(struct meshlink_handle *mesh, bool inviter_commits_first);
 
 /// Set the URL used to discover the host's external address
 /** For generating invitation URLs, MeshLink can look up the externally visible address of the local node.
@@ -1609,7 +1609,7 @@ extern void meshlink_set_inviter_commits_first(struct meshlink_handle *mesh, boo
  *  @param mesh  A handle which represents an instance of MeshLink.
  *  @param url   The URL to use for external address queries, or NULL to revert back to the default URL.
  */
-extern void meshlink_set_external_address_discovery_url(struct meshlink_handle *mesh, const char *url);
+void meshlink_set_external_address_discovery_url(struct meshlink_handle *mesh, const char *url);
 
 /// Set the scheduling granularity of the application
 /** This should be set to the effective scheduling granularity for the application.
@@ -1621,7 +1621,7 @@ extern void meshlink_set_external_address_discovery_url(struct meshlink_handle *
  *  @param mesh         A handle which represents an instance of MeshLink.
  *  @param granularity  The scheduling granularity of the application in microseconds.
  */
-extern void meshlink_set_scheduling_granularity(struct meshlink_handle *mesh, long granularity);
+void meshlink_set_scheduling_granularity(struct meshlink_handle *mesh, long granularity);
 
 #ifdef __cplusplus
 }
index f9225ee5cca65f98ac29a71f0c883d2edfc1bcdf..d6dc87d04f414d7149fdfea3e190342cb728fa15 100644 (file)
@@ -238,14 +238,14 @@ typedef struct meshlink_packethdr {
        uint8_t source[16];
 } __attribute__((__packed__)) meshlink_packethdr_t;
 
-extern void meshlink_send_from_queue(event_loop_t *loop, void *mesh);
-extern void update_node_status(meshlink_handle_t *mesh, struct node_t *n);
-extern void update_node_pmtu(meshlink_handle_t *mesh, struct node_t *n);
+void meshlink_send_from_queue(event_loop_t *loop, void *mesh);
+void update_node_status(meshlink_handle_t *mesh, struct node_t *n);
+void update_node_pmtu(meshlink_handle_t *mesh, struct node_t *n);
 extern meshlink_log_level_t global_log_level;
 extern meshlink_log_cb_t global_log_cb;
-extern void handle_duplicate_node(meshlink_handle_t *mesh, struct node_t *n);
-extern void handle_network_change(meshlink_handle_t *mesh, bool online);
-extern void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t meshlink_errno);
+void handle_duplicate_node(meshlink_handle_t *mesh, struct node_t *n);
+void handle_network_change(meshlink_handle_t *mesh, bool online);
+void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t meshlink_errno);
 
 /// Per-instance PRNG
 static inline int prng(meshlink_handle_t *mesh, uint64_t max) {
index f3ab47f10be486767446de93ea0399ffb32bbc43..fa880d2a3806a4b8172e5ab9e7c088de37ef1a20 100644 (file)
@@ -70,7 +70,7 @@ void broadcast_meta(meshlink_handle_t *mesh, connection_t *from, const char *buf
                }
 }
 
-void broadcast_submesh_meta(meshlink_handle_t *mesh, connection_t *from, submesh_t *s, const char *buffer, int length) {
+void broadcast_submesh_meta(meshlink_handle_t *mesh, connection_t *from, const submesh_t *s, const char *buffer, int length) {
        assert(buffer);
        assert(length);
 
index 768c7acf8a98396871009eace22b306a72d26658..039fa34840746ca92d79c92eb0391be215f6677e 100644 (file)
 
 #include "connection.h"
 
-extern bool send_meta(struct meshlink_handle *mesh, struct connection_t *, const char *, int);
-extern bool send_meta_sptps(void *, uint8_t, const void *, size_t);
-extern bool receive_meta_sptps(void *, uint8_t, const void *, uint16_t);
-extern void broadcast_meta(struct meshlink_handle *mesh, struct connection_t *, const char *, int);
-extern void broadcast_submesh_meta(struct meshlink_handle *mesh, connection_t *from, submesh_t *s,
+bool send_meta(struct meshlink_handle *mesh, struct connection_t *, const char *, int);
+bool send_meta_sptps(void *, uint8_t, const void *, size_t);
+bool receive_meta_sptps(void *, uint8_t, const void *, uint16_t);
+void broadcast_meta(struct meshlink_handle *mesh, struct connection_t *, const char *, int);
+extern void broadcast_submesh_meta(struct meshlink_handle *mesh, connection_t *from, const submesh_t *s,
                                    const char *buffer, int length);
-extern bool receive_meta(struct meshlink_handle *mesh, struct connection_t *) __attribute__((__warn_unused_result__));
+bool receive_meta(struct meshlink_handle *mesh, struct connection_t *) __attribute__((__warn_unused_result__));
 
 #endif
index 5ea2ae3ed28bd88c036e0fd3076b53dfe689d9a6..a139c4328cfc3aad67bcaa025ddf49d7dd35fa97 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -80,37 +80,37 @@ typedef struct outgoing_t {
 #include "connection.h"
 #include "node.h"
 
-extern void init_outgoings(struct meshlink_handle *mesh);
-extern void exit_outgoings(struct meshlink_handle *mesh);
-
-extern void retry_outgoing(struct meshlink_handle *mesh, outgoing_t *);
-extern void handle_incoming_vpn_data(struct event_loop_t *loop, void *, int);
-extern void finish_connecting(struct meshlink_handle *mesh, struct connection_t *);
-extern void do_outgoing_connection(struct meshlink_handle *mesh, struct outgoing_t *);
-extern void handle_new_meta_connection(struct event_loop_t *loop, void *, int);
-extern int setup_tcp_listen_socket(struct meshlink_handle *mesh, const struct addrinfo *aip) __attribute__((__warn_unused_result__));
-extern int setup_udp_listen_socket(struct meshlink_handle *mesh, const struct addrinfo *aip) __attribute__((__warn_unused_result__));
-extern bool send_sptps_data(void *handle, uint8_t type, const void *data, size_t len);
-extern bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len) __attribute__((__warn_unused_result__));
-extern void send_packet(struct meshlink_handle *mesh, struct node_t *, struct vpn_packet_t *);
-extern char *get_name(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
-extern void load_all_nodes(struct meshlink_handle *mesh);
-extern bool setup_myself_reloadable(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
-extern bool setup_network(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
-extern void reset_outgoing(struct outgoing_t *);
-extern void setup_outgoing_connection(struct meshlink_handle *mesh, struct outgoing_t *);
-extern void close_network_connections(struct meshlink_handle *mesh);
-extern void main_loop(struct meshlink_handle *mesh);
-extern void terminate_connection(struct meshlink_handle *mesh, struct connection_t *, bool);
-extern bool node_read_public_key(struct meshlink_handle *mesh, struct node_t *) __attribute__((__warn_unused_result__));
-extern bool node_read_from_config(struct meshlink_handle *mesh, struct node_t *, const config_t *config) __attribute__((__warn_unused_result__));
-extern bool read_ecdsa_public_key(struct meshlink_handle *mesh, struct connection_t *) __attribute__((__warn_unused_result__));
-extern bool read_ecdsa_private_key(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
-extern bool node_write_config(struct meshlink_handle *mesh, struct node_t *) __attribute__((__warn_unused_result__));
-extern void send_mtu_probe(struct meshlink_handle *mesh, struct node_t *);
-extern void handle_meta_connection_data(struct meshlink_handle *mesh, struct connection_t *);
-extern void retry(struct meshlink_handle *mesh);
-extern int check_port(struct meshlink_handle *mesh);
+void init_outgoings(struct meshlink_handle *mesh);
+void exit_outgoings(struct meshlink_handle *mesh);
+
+void retry_outgoing(struct meshlink_handle *mesh, outgoing_t *);
+void handle_incoming_vpn_data(struct event_loop_t *loop, void *, int);
+void finish_connecting(struct meshlink_handle *mesh, struct connection_t *);
+void do_outgoing_connection(struct meshlink_handle *mesh, struct outgoing_t *);
+void handle_new_meta_connection(struct event_loop_t *loop, void *, int);
+int setup_tcp_listen_socket(struct meshlink_handle *mesh, const struct addrinfo *aip) __attribute__((__warn_unused_result__));
+int setup_udp_listen_socket(struct meshlink_handle *mesh, const struct addrinfo *aip) __attribute__((__warn_unused_result__));
+bool send_sptps_data(void *handle, uint8_t type, const void *data, size_t len);
+bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len) __attribute__((__warn_unused_result__));
+void send_packet(struct meshlink_handle *mesh, struct node_t *, struct vpn_packet_t *);
+char *get_name(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+void load_all_nodes(struct meshlink_handle *mesh);
+bool setup_myself_reloadable(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+bool setup_network(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+void reset_outgoing(struct outgoing_t *);
+void setup_outgoing_connection(struct meshlink_handle *mesh, struct outgoing_t *);
+void close_network_connections(struct meshlink_handle *mesh);
+void main_loop(struct meshlink_handle *mesh);
+void terminate_connection(struct meshlink_handle *mesh, struct connection_t *, bool);
+bool node_read_public_key(struct meshlink_handle *mesh, struct node_t *) __attribute__((__warn_unused_result__));
+bool node_read_from_config(struct meshlink_handle *mesh, struct node_t *, const config_t *config) __attribute__((__warn_unused_result__));
+bool read_ecdsa_public_key(struct meshlink_handle *mesh, struct connection_t *) __attribute__((__warn_unused_result__));
+bool read_ecdsa_private_key(struct meshlink_handle *mesh) __attribute__((__warn_unused_result__));
+bool node_write_config(struct meshlink_handle *mesh, struct node_t *) __attribute__((__warn_unused_result__));
+void send_mtu_probe(struct meshlink_handle *mesh, struct node_t *);
+void handle_meta_connection_data(struct meshlink_handle *mesh, struct connection_t *);
+void retry(struct meshlink_handle *mesh);
+int check_port(struct meshlink_handle *mesh);
 
 #ifndef HAVE_MINGW
 #define closesocket(s) close(s)
index 56012e0e36a887c9bc2e45eaebaf13e3484d4272..3ee0eaec4a4be44f6d5ec57ed69ddeb5242d4656 100644 (file)
@@ -317,14 +317,17 @@ static void choose_udp_address(meshlink_handle_t *mesh, const node_t *n, const s
        /* Otherwise, address are found in edges to this node.
           So we pick a random edge and a random socket. */
 
-       int i = 0;
-       int j = prng(mesh, n->edge_tree->count);
        edge_t *candidate = NULL;
 
-       for splay_each(edge_t, e, n->edge_tree) {
-               if(i++ == j) {
-                       candidate = e->reverse;
-                       break;
+       {
+               int i = 0;
+               int j = prng(mesh, n->edge_tree->count);
+
+               for splay_each(edge_t, e, n->edge_tree) {
+                       if(i++ == j) {
+                               candidate = e->reverse;
+                               break;
+                       }
                }
        }
 
index ceaeb0c5b1fb9f0502c65e34d23931e44f0221c4..af49ea09944092fa0b2d90575cb660c0c290924b 100644 (file)
@@ -521,7 +521,7 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) {
 /*
   Configure node_t mesh->self and set up the local sockets (listen only)
 */
-bool setup_myself(meshlink_handle_t *mesh) {
+static bool setup_myself(meshlink_handle_t *mesh) {
        /* Set some defaults */
 
        mesh->maxtimeout = 900;
index 6c777bdec39fc05647c55900520591b81ee6bf22..bce0aaee039369d6b8e9f95a210ec5abcc408595 100644 (file)
 #include "net.h"
 #include "packmsg.h"
 
-extern struct addrinfo *str2addrinfo(const char *, const char *, int) __attribute__((__malloc__));
-extern sockaddr_t str2sockaddr(const char *, const char *);
-extern void sockaddr2str(const sockaddr_t *, char **, char **);
-extern char *sockaddr2hostname(const sockaddr_t *) __attribute__((__malloc__));
-extern int sockaddrcmp(const sockaddr_t *, const sockaddr_t *) __attribute__((__warn_unused_result__));
-extern int sockaddrcmp_noport(const sockaddr_t *, const sockaddr_t *) __attribute__((__warn_unused_result__));
-extern void sockaddrunmap(sockaddr_t *);
-extern void sockaddrfree(sockaddr_t *);
-extern void sockaddrcpy(sockaddr_t *, const sockaddr_t *);
-extern void sockaddrcpy_setport(sockaddr_t *, const sockaddr_t *, uint16_t port);
-
-extern void packmsg_add_sockaddr(struct packmsg_output *out, const sockaddr_t *);
-extern sockaddr_t packmsg_get_sockaddr(struct packmsg_input *in) __attribute__((__warn_unused_result__));
+struct addrinfo *str2addrinfo(const char *, const char *, int) __attribute__((__malloc__));
+sockaddr_t str2sockaddr(const char *, const char *);
+void sockaddr2str(const sockaddr_t *, char **, char **);
+char *sockaddr2hostname(const sockaddr_t *) __attribute__((__malloc__));
+int sockaddrcmp(const sockaddr_t *, const sockaddr_t *) __attribute__((__warn_unused_result__));
+int sockaddrcmp_noport(const sockaddr_t *, const sockaddr_t *) __attribute__((__warn_unused_result__));
+void sockaddrunmap(sockaddr_t *);
+void sockaddrfree(sockaddr_t *);
+void sockaddrcpy(sockaddr_t *, const sockaddr_t *);
+void sockaddrcpy_setport(sockaddr_t *, const sockaddr_t *, uint16_t port);
+
+void packmsg_add_sockaddr(struct packmsg_output *out, const sockaddr_t *);
+sockaddr_t packmsg_get_sockaddr(struct packmsg_input *in) __attribute__((__warn_unused_result__));
 
 #endif
index 4c3f2afe72c5d808cafb41740d943490371c0969..63f3c2c8bad55132aa694981c702d760777d2b1e 100644 (file)
@@ -99,15 +99,15 @@ typedef struct node_t {
        struct splay_tree_t *edge_tree;         /* Edges with this node as one of the endpoints */
 } node_t;
 
-extern void init_nodes(struct meshlink_handle *mesh);
-extern void exit_nodes(struct meshlink_handle *mesh);
-extern node_t *new_node(void) __attribute__((__malloc__));
-extern void free_node(node_t *n);
-extern void node_add(struct meshlink_handle *mesh, node_t *n);
-extern void node_del(struct meshlink_handle *mesh, node_t *n);
-extern node_t *lookup_node(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
-extern node_t *lookup_node_udp(struct meshlink_handle *mesh, const sockaddr_t *sa) __attribute__((__warn_unused_result__));
-extern void update_node_udp(struct meshlink_handle *mesh, node_t *n, const sockaddr_t *sa);
-extern bool node_add_recent_address(struct meshlink_handle *mesh, node_t *n, const sockaddr_t *addr);
+void init_nodes(struct meshlink_handle *mesh);
+void exit_nodes(struct meshlink_handle *mesh);
+node_t *new_node(void) __attribute__((__malloc__));
+void free_node(node_t *n);
+void node_add(struct meshlink_handle *mesh, node_t *n);
+void node_del(struct meshlink_handle *mesh, node_t *n);
+node_t *lookup_node(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
+node_t *lookup_node_udp(struct meshlink_handle *mesh, const sockaddr_t *sa) __attribute__((__warn_unused_result__));
+void update_node_udp(struct meshlink_handle *mesh, node_t *n, const sockaddr_t *sa);
+bool node_add_recent_address(struct meshlink_handle *mesh, node_t *n, const sockaddr_t *addr);
 
 #endif
index 3e1b0b54e3162bf27df3eec9d965b1e515d89b79..e6fdcb60ea1ffeebf4351dc77249631649a59027 100644 (file)
--- a/src/prf.c
+++ b/src/prf.c
@@ -85,7 +85,7 @@ static bool hmac_sha512(const char *key, size_t keylen, const char *msg, size_t
    We use SHA512 instead of MD5 and SHA1.
  */
 
-bool prf(const char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, size_t outlen) {
+bool prf(const char *secret, size_t secretlen, const char *seed, size_t seedlen, char *out, size_t outlen) {
        assert(secret);
        assert(secretlen);
        assert(seed);
index 1fc0ee199c4df63291708897cd330c410e9a33f8..1494eca8fae26acd56c785d3329f51abac180b33 100644 (file)
--- a/src/prf.h
+++ b/src/prf.h
@@ -20,6 +20,6 @@
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-extern bool prf(const char *secret, size_t secretlen, char *seed, size_t seedlen, char *out, size_t outlen) __attribute__((__warn_unused_result__));
+bool prf(const char *secret, size_t secretlen, const char *seed, size_t seedlen, char *out, size_t outlen) __attribute__((__warn_unused_result__));
 
 #endif
index c8c75cfc4714b0a7c15f62c4491ebfbd0054edc1..e2842abe5c7665ab341b1af86213c3f4f981b04b 100644 (file)
@@ -42,7 +42,7 @@ static bool (*request_handlers[])(meshlink_handle_t *, connection_t *, const cha
 
 /* Request names */
 
-static char (*request_name[]) = {
+static const char *request_name[] = {
        "ID", "METAKEY", "CHALLENGE", "CHAL_REPLY", "ACK",
        "STATUS", "ERROR", "TERMREQ",
        "PING", "PONG",
@@ -66,7 +66,7 @@ bool check_id(const char *id) {
 /* Generic request routines - takes care of logging and error
    detection as well */
 
-bool send_request(meshlink_handle_t *mesh, connection_t *c, submesh_t *s, const char *format, ...) {
+bool send_request(meshlink_handle_t *mesh, connection_t *c, const submesh_t *s, const char *format, ...) {
        assert(c);
        assert(format);
        assert(*format);
@@ -106,7 +106,7 @@ bool send_request(meshlink_handle_t *mesh, connection_t *c, submesh_t *s, const
        }
 }
 
-void forward_request(meshlink_handle_t *mesh, connection_t *from, submesh_t *s, const char *request) {
+void forward_request(meshlink_handle_t *mesh, connection_t *from, const submesh_t *s, const char *request) {
        assert(from);
        assert(request);
        assert(*request);
@@ -180,7 +180,7 @@ static void age_past_requests(event_loop_t *loop, void *data) {
 
        for splay_each(past_request_t, p, mesh->past_request_tree) {
                if(p->firstseen + request_timeout <= mesh->loop.now.tv_sec) {
-                       splay_delete_node(mesh->past_request_tree, node), deleted++;
+                       splay_delete_node(mesh->past_request_tree, splay_node), deleted++;
                } else {
                        left++;
                }
index f97682a1717af4277fc460f01f31b88fd8d8a562..794b0515dec1205cff55d5408d6be127c952d7d3 100644 (file)
@@ -70,39 +70,39 @@ typedef struct past_request_t {
 
 /* Basic functions */
 
-extern bool send_request(struct meshlink_handle *mesh, struct connection_t *, struct submesh_t *s, const char *, ...) __attribute__((__format__(printf, 4, 5)));
-extern void forward_request(struct meshlink_handle *mesh, struct connection_t *, struct submesh_t *, const char *);
-extern bool receive_request(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool check_id(const char *);
+bool send_request(struct meshlink_handle *mesh, struct connection_t *, const struct submesh_t *s, const char *, ...) __attribute__((__format__(printf, 4, 5)));
+void forward_request(struct meshlink_handle *mesh, struct connection_t *, const struct submesh_t *, const char *);
+bool receive_request(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool check_id(const char *);
 
-extern void init_requests(struct meshlink_handle *mesh);
-extern void exit_requests(struct meshlink_handle *mesh);
-extern bool seen_request(struct meshlink_handle *mesh, const char *);
+void init_requests(struct meshlink_handle *mesh);
+void exit_requests(struct meshlink_handle *mesh);
+bool seen_request(struct meshlink_handle *mesh, const char *);
 
 /* Requests */
 
-extern bool send_id(struct meshlink_handle *mesh, struct connection_t *);
-extern bool send_ack(struct meshlink_handle *mesh, struct connection_t *);
-extern bool send_ping(struct meshlink_handle *mesh, struct connection_t *);
-extern bool send_pong(struct meshlink_handle *mesh, struct connection_t *);
-extern bool send_add_edge(struct meshlink_handle *mesh, struct connection_t *, const struct edge_t *, int contradictions);
-extern bool send_del_edge(struct meshlink_handle *mesh, struct connection_t *, const struct edge_t *, int contradictions);
-extern bool send_req_key(struct meshlink_handle *mesh, struct node_t *);
+bool send_id(struct meshlink_handle *mesh, struct connection_t *);
+bool send_ack(struct meshlink_handle *mesh, struct connection_t *);
+bool send_ping(struct meshlink_handle *mesh, struct connection_t *);
+bool send_pong(struct meshlink_handle *mesh, struct connection_t *);
+bool send_add_edge(struct meshlink_handle *mesh, struct connection_t *, const struct edge_t *, int contradictions);
+bool send_del_edge(struct meshlink_handle *mesh, struct connection_t *, const struct edge_t *, int contradictions);
+bool send_req_key(struct meshlink_handle *mesh, struct node_t *);
 
 /* Request handlers  */
 
-extern bool id_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool ack_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool status_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool error_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool termreq_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool ping_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool pong_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool add_edge_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool del_edge_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool key_changed_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool req_key_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool ans_key_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
-extern bool tcppacket_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool id_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool ack_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool status_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool error_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool termreq_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool ping_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool pong_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool add_edge_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool del_edge_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool key_changed_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool req_key_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool ans_key_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
+bool tcppacket_h(struct meshlink_handle *mesh, struct connection_t *, const char *);
 
 #endif
index c17d9e8214b9b196c30b4725c2a456e204142a1e..201cac9fe000eef05b17561fd4223ec31805e60b 100644 (file)
@@ -298,7 +298,7 @@ static void send_everything(meshlink_handle_t *mesh, connection_t *c) {
        /* Send all known subnets and edges */
 
        for splay_each(node_t, n, mesh->nodes) {
-               for splay_each(edge_t, e, n->edge_tree) {
+               for inner_splay_each(edge_t, e, n->edge_tree) {
                        send_add_edge(mesh, c, e, 0);
                }
        }
index c42a10d28701825adef6440f3ccd3b82a4c96e7f..38dd56f85becc94f9a86339eb4c3c1af2dc36ed4 100644 (file)
@@ -37,8 +37,8 @@
 bool send_add_edge(meshlink_handle_t *mesh, connection_t *c, const edge_t *e, int contradictions) {
        bool x;
        char *address, *port;
-       char *from_submesh, *to_submesh;
-       submesh_t *s = NULL;
+       const char *from_submesh, *to_submesh;
+       const submesh_t *s = NULL;
 
        if(c->node && c->node->submesh) {
                if(!submesh_allows_node(e->from->submesh, c->node)) {
index b614494b74b55cc2b41fdc0daaffa7f1ef00ff9a..2c741be504a71d3e91e32e555e0ab974ad7a2cd8 100644 (file)
@@ -334,12 +334,12 @@ bool ans_key_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
 
                /* Append the known UDP address of the from node, if we have a confirmed one */
                if(!*address && from->status.udp_confirmed && from->address.sa.sa_family != AF_UNSPEC) {
-                       char *address, *port;
+                       char *reflexive_address, *reflexive_port;
                        logger(mesh, MESHLINK_DEBUG, "Appending reflexive UDP address to ANS_KEY from %s to %s", from->name, to->name);
-                       sockaddr2str(&from->address, &address, &port);
-                       send_request(mesh, to->nexthop->connection, NULL, "%s %s %s", request, address, port);
-                       free(address);
-                       free(port);
+                       sockaddr2str(&from->address, &reflexive_address, &reflexive_port);
+                       send_request(mesh, to->nexthop->connection, NULL, "%s %s %s", request, reflexive_address, reflexive_port);
+                       free(reflexive_address);
+                       free(reflexive_port);
                        return true;
                }
 
index 284fc69a6733bffbda0d0b101f642c466dc3310b..92e9fe03af3d8de40be0283ccb256b0275f391bb 100644 (file)
@@ -23,6 +23,6 @@
 #include "net.h"
 #include "node.h"
 
-extern void route(struct meshlink_handle *mesh, struct node_t *, struct vpn_packet_t *);
+void route(struct meshlink_handle *mesh, struct node_t *, struct vpn_packet_t *);
 
 #endif
index ca53dc37c89d4cda66c3488e8b78340b893bbcf2..de19ab7d3f8d544d98a01d1908ed66584fe059c8 100644 (file)
@@ -63,40 +63,41 @@ typedef struct splay_tree_t {
 
 /* (De)constructors */
 
-extern splay_tree_t *splay_alloc_tree(splay_compare_t, splay_action_t) __attribute__((__malloc__));
-extern void splay_delete_tree(splay_tree_t *);
+splay_tree_t *splay_alloc_tree(splay_compare_t, splay_action_t) __attribute__((__malloc__));
+void splay_delete_tree(splay_tree_t *);
 
-extern splay_node_t *splay_alloc_node(void) __attribute__((__malloc__));
-extern void splay_free_node(splay_tree_t *tree, splay_node_t *);
+splay_node_t *splay_alloc_node(void) __attribute__((__malloc__));
+void splay_free_node(splay_tree_t *tree, splay_node_t *);
 
 /* Insertion and deletion */
 
-extern splay_node_t *splay_insert(splay_tree_t *, void *);
-extern splay_node_t *splay_insert_node(splay_tree_t *, splay_node_t *);
+splay_node_t *splay_insert(splay_tree_t *, void *);
+splay_node_t *splay_insert_node(splay_tree_t *, splay_node_t *);
 
-extern splay_node_t *splay_unlink(splay_tree_t *, void *);
-extern void splay_unlink_node(splay_tree_t *tree, splay_node_t *);
-extern void splay_delete(splay_tree_t *, void *);
-extern void splay_delete_node(splay_tree_t *, splay_node_t *);
+splay_node_t *splay_unlink(splay_tree_t *, void *);
+void splay_unlink_node(splay_tree_t *tree, splay_node_t *);
+void splay_delete(splay_tree_t *, void *);
+void splay_delete_node(splay_tree_t *, splay_node_t *);
 
 /* Searching */
 
-extern void *splay_search(splay_tree_t *, const void *);
-extern void *splay_search_closest(splay_tree_t *, const void *, int *);
-extern void *splay_search_closest_smaller(splay_tree_t *, const void *);
-extern void *splay_search_closest_greater(splay_tree_t *, const void *);
+void *splay_search(splay_tree_t *, const void *);
+void *splay_search_closest(splay_tree_t *, const void *, int *);
+void *splay_search_closest_smaller(splay_tree_t *, const void *);
+void *splay_search_closest_greater(splay_tree_t *, const void *);
 
-extern splay_node_t *splay_search_node(splay_tree_t *, const void *);
-extern splay_node_t *splay_search_closest_node(splay_tree_t *, const void *, int *);
-extern splay_node_t *splay_search_closest_node_nosplay(const splay_tree_t *, const void *, int *);
-extern splay_node_t *splay_search_closest_smaller_node(splay_tree_t *, const void *);
-extern splay_node_t *splay_search_closest_greater_node(splay_tree_t *, const void *);
+splay_node_t *splay_search_node(splay_tree_t *, const void *);
+splay_node_t *splay_search_closest_node(splay_tree_t *, const void *, int *);
+splay_node_t *splay_search_closest_node_nosplay(const splay_tree_t *, const void *, int *);
+splay_node_t *splay_search_closest_smaller_node(splay_tree_t *, const void *);
+splay_node_t *splay_search_closest_greater_node(splay_tree_t *, const void *);
 
 /* Tree walking */
 
-extern void splay_foreach(const splay_tree_t *, splay_action_t);
-extern void splay_foreach_node(const splay_tree_t *, splay_action_t);
+void splay_foreach(const splay_tree_t *, splay_action_t);
+void splay_foreach_node(const splay_tree_t *, splay_action_t);
 
-#define splay_each(type, item, tree) (type *item = (type *)1; item; item = NULL) for(splay_node_t *node = (tree)->head, *next; item = node ? node->data : NULL, next = node ? node->next : NULL, node; node = next)
+#define splay_each(type, item, tree) (type *item = (type *)1; item; item = NULL) for(splay_node_t *splay_node = (tree)->head, *splay_next; item = splay_node ? splay_node->data : NULL, splay_next = splay_node ? splay_node->next : NULL, splay_node; splay_node = splay_next)
+#define inner_splay_each(type, item, tree) (type *item = (type *)1; item; item = NULL) for(splay_node_t *inner_splay_node = (tree)->head, *inner_splay_next; item = inner_splay_node ? inner_splay_node->data : NULL, inner_splay_next = inner_splay_node ? inner_splay_node->next : NULL, inner_splay_node; inner_splay_node = inner_splay_next)
 
 #endif
index c91d3882b428d09ea5c4d4f9154941a83a0727ed..ba6bcd57c0349e4c5f185c224be0646437222c74 100644 (file)
@@ -87,14 +87,14 @@ typedef struct sptps {
 
 } sptps_t;
 
-extern void sptps_log_quiet(sptps_t *s, int s_errno, const char *format, va_list ap);
-extern void sptps_log_stderr(sptps_t *s, int s_errno, const char *format, va_list ap);
+void sptps_log_quiet(sptps_t *s, int s_errno, const char *format, va_list ap);
+void sptps_log_stderr(sptps_t *s, int s_errno, const char *format, va_list ap);
 extern void (*sptps_log)(sptps_t *s, int s_errno, const char *format, va_list ap);
-extern bool sptps_start(sptps_t *s, void *handle, bool initiator, bool datagram, ecdsa_t *mykey, ecdsa_t *hiskey, const char *label, size_t labellen, send_data_t send_data, receive_record_t receive_record) __attribute__((__warn_unused_result__));
-extern bool sptps_stop(sptps_t *s);
-extern bool sptps_send_record(sptps_t *s, uint8_t type, const void *data, uint16_t len);
-extern bool sptps_receive_data(sptps_t *s, const void *data, size_t len) __attribute__((__warn_unused_result__));
-extern bool sptps_force_kex(sptps_t *s) __attribute__((__warn_unused_result__));
-extern bool sptps_verify_datagram(sptps_t *s, const void *data, size_t len) __attribute__((__warn_unused_result__));
+bool sptps_start(sptps_t *s, void *handle, bool initiator, bool datagram, ecdsa_t *mykey, ecdsa_t *hiskey, const char *label, size_t labellen, send_data_t send_data, receive_record_t receive_record) __attribute__((__warn_unused_result__));
+bool sptps_stop(sptps_t *s);
+bool sptps_send_record(sptps_t *s, uint8_t type, const void *data, uint16_t len);
+bool sptps_receive_data(sptps_t *s, const void *data, size_t len) __attribute__((__warn_unused_result__));
+bool sptps_force_kex(sptps_t *s) __attribute__((__warn_unused_result__));
+bool sptps_verify_datagram(sptps_t *s, const void *data, size_t len) __attribute__((__warn_unused_result__));
 
 #endif
index 15720aab604747d4b9d22bc392b47710145d91f1..9366b0573121fb53ff743397551a75a61da50c9e 100644 (file)
@@ -31,11 +31,11 @@ typedef struct submesh_t {
        struct meshlink_handle *mesh;                   /* the mesh this submesh belongs to */
 } submesh_t;
 
-extern void init_submeshes(struct meshlink_handle *mesh);
-extern void exit_submeshes(struct meshlink_handle *mesh);
-extern submesh_t *create_submesh(struct meshlink_handle *mesh, const char *) __attribute__((__warn_unused_result__));
-extern submesh_t *lookup_submesh(struct meshlink_handle *mesh, const char *) __attribute__((__warn_unused_result__));
-extern submesh_t *lookup_or_create_submesh(struct meshlink_handle *mesh, const char *) __attribute__((__warn_unused_result__));
-extern bool submesh_allows_node(const submesh_t *submesh, const struct node_t *node) __attribute__((__warn_unused_result__));
+void init_submeshes(struct meshlink_handle *mesh);
+void exit_submeshes(struct meshlink_handle *mesh);
+submesh_t *create_submesh(struct meshlink_handle *mesh, const char *) __attribute__((__warn_unused_result__));
+submesh_t *lookup_submesh(struct meshlink_handle *mesh, const char *) __attribute__((__warn_unused_result__));
+submesh_t *lookup_or_create_submesh(struct meshlink_handle *mesh, const char *) __attribute__((__warn_unused_result__));
+bool submesh_allows_node(const submesh_t *submesh, const struct node_t *node) __attribute__((__warn_unused_result__));
 
 #endif
index 2a273de70463dbe4f39117cc50ed438dc46c4834..992e6f0f9b1952673705a5015601e866ceb12bda 100644 (file)
@@ -58,8 +58,8 @@ static void debug(const char *format, ...) {
 #define debug(...) do {} while(0)
 #endif
 
-static ssize_t do_recv(struct utcp_connection *c, const void *data, size_t len) {
-       (void)c;
+static ssize_t do_recv(struct utcp_connection *rc, const void *data, size_t len) {
+       (void)rc;
 
        if(!data || !len) {
                if(errno) {
index 47acf221318bca518eca4d88bdd7ba04b0982071..5ba5553bd3e2e51ac824887b2f82039a16e4b02d 100644 (file)
@@ -2455,8 +2455,8 @@ void utcp_offline(struct utcp *utcp, bool offline) {
        }
 }
 
-void utcp_set_retransmit_cb(struct utcp *utcp, utcp_retransmit_t retransmit) {
-       utcp->retransmit = retransmit;
+void utcp_set_retransmit_cb(struct utcp *utcp, utcp_retransmit_t cb) {
+       utcp->retransmit = cb;
 }
 
 void utcp_set_clock_granularity(long granularity) {
index ff509ac936e1d440fa151d32eb0a576e32d06f09..c051ff1ff460ea977573a001d78ff0ef7c16e73c 100644 (file)
@@ -63,63 +63,63 @@ typedef ssize_t (*utcp_recv_t)(struct utcp_connection *connection, const void *d
 
 typedef void (*utcp_poll_t)(struct utcp_connection *connection, size_t len);
 
-extern struct utcp *utcp_init(utcp_accept_t accept, utcp_pre_accept_t pre_accept, utcp_send_t send, void *priv);
-extern void utcp_exit(struct utcp *utcp);
-
-extern struct utcp_connection *utcp_connect_ex(struct utcp *utcp, uint16_t port, utcp_recv_t recv, void *priv, uint32_t flags);
-extern struct utcp_connection *utcp_connect(struct utcp *utcp, uint16_t port, utcp_recv_t recv, void *priv);
-extern void utcp_accept(struct utcp_connection *utcp, utcp_recv_t recv, void *priv);
-extern ssize_t utcp_send(struct utcp_connection *connection, const void *data, size_t len);
-extern ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len);
-extern int utcp_close(struct utcp_connection *connection);
-extern int utcp_abort(struct utcp_connection *connection);
-extern int utcp_shutdown(struct utcp_connection *connection, int how);
-extern struct timespec utcp_timeout(struct utcp *utcp);
-extern void utcp_set_recv_cb(struct utcp_connection *connection, utcp_recv_t recv);
-extern void utcp_set_poll_cb(struct utcp_connection *connection, utcp_poll_t poll);
-extern void utcp_set_accept_cb(struct utcp *utcp, utcp_accept_t accept, utcp_pre_accept_t pre_accept);
-extern bool utcp_is_active(struct utcp *utcp);
-extern void utcp_abort_all_connections(struct utcp *utcp);
+struct utcp *utcp_init(utcp_accept_t accept, utcp_pre_accept_t pre_accept, utcp_send_t send, void *priv);
+void utcp_exit(struct utcp *utcp);
+
+struct utcp_connection *utcp_connect_ex(struct utcp *utcp, uint16_t port, utcp_recv_t recv, void *priv, uint32_t flags);
+struct utcp_connection *utcp_connect(struct utcp *utcp, uint16_t port, utcp_recv_t recv, void *priv);
+void utcp_accept(struct utcp_connection *utcp, utcp_recv_t recv, void *priv);
+ssize_t utcp_send(struct utcp_connection *connection, const void *data, size_t len);
+ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len);
+int utcp_close(struct utcp_connection *connection);
+int utcp_abort(struct utcp_connection *connection);
+int utcp_shutdown(struct utcp_connection *connection, int how);
+struct timespec utcp_timeout(struct utcp *utcp);
+void utcp_set_recv_cb(struct utcp_connection *connection, utcp_recv_t recv);
+void utcp_set_poll_cb(struct utcp_connection *connection, utcp_poll_t poll);
+void utcp_set_accept_cb(struct utcp *utcp, utcp_accept_t accept, utcp_pre_accept_t pre_accept);
+bool utcp_is_active(struct utcp *utcp);
+void utcp_abort_all_connections(struct utcp *utcp);
 
 // Global socket options
 
-extern int utcp_get_user_timeout(struct utcp *utcp);
-extern void utcp_set_user_timeout(struct utcp *utcp, int seconds);
+int utcp_get_user_timeout(struct utcp *utcp);
+void utcp_set_user_timeout(struct utcp *utcp, int seconds);
 
-extern uint16_t utcp_get_mtu(struct utcp *utcp);
-extern uint16_t utcp_get_mss(struct utcp *utcp);
-extern void utcp_set_mtu(struct utcp *utcp, uint16_t mtu);
+uint16_t utcp_get_mtu(struct utcp *utcp);
+uint16_t utcp_get_mss(struct utcp *utcp);
+void utcp_set_mtu(struct utcp *utcp, uint16_t mtu);
 
-extern void utcp_reset_timers(struct utcp *utcp);
+void utcp_reset_timers(struct utcp *utcp);
 
-extern void utcp_offline(struct utcp *utcp, bool offline);
-extern void utcp_set_retransmit_cb(struct utcp *utcp, utcp_retransmit_t retransmit);
+void utcp_offline(struct utcp *utcp, bool offline);
+void utcp_set_retransmit_cb(struct utcp *utcp, utcp_retransmit_t retransmit);
 
 // Per-socket options
 
-extern size_t utcp_get_sndbuf(struct utcp_connection *connection);
-extern void utcp_set_sndbuf(struct utcp_connection *connection, size_t size);
-extern size_t utcp_get_sndbuf_free(struct utcp_connection *connection);
+size_t utcp_get_sndbuf(struct utcp_connection *connection);
+void utcp_set_sndbuf(struct utcp_connection *connection, size_t size);
+size_t utcp_get_sndbuf_free(struct utcp_connection *connection);
 
-extern size_t utcp_get_rcvbuf(struct utcp_connection *connection);
-extern void utcp_set_rcvbuf(struct utcp_connection *connection, size_t size);
-extern size_t utcp_get_rcvbuf_free(struct utcp_connection *connection);
+size_t utcp_get_rcvbuf(struct utcp_connection *connection);
+void utcp_set_rcvbuf(struct utcp_connection *connection, size_t size);
+size_t utcp_get_rcvbuf_free(struct utcp_connection *connection);
 
-extern size_t utcp_get_sendq(struct utcp_connection *connection);
-extern size_t utcp_get_recvq(struct utcp_connection *connection);
+size_t utcp_get_sendq(struct utcp_connection *connection);
+size_t utcp_get_recvq(struct utcp_connection *connection);
 
-extern bool utcp_get_nodelay(struct utcp_connection *connection);
-extern void utcp_set_nodelay(struct utcp_connection *connection, bool nodelay);
+bool utcp_get_nodelay(struct utcp_connection *connection);
+void utcp_set_nodelay(struct utcp_connection *connection, bool nodelay);
 
-extern bool utcp_get_keepalive(struct utcp_connection *connection);
-extern void utcp_set_keepalive(struct utcp_connection *connection, bool keepalive);
+bool utcp_get_keepalive(struct utcp_connection *connection);
+void utcp_set_keepalive(struct utcp_connection *connection, bool keepalive);
 
-extern size_t utcp_get_outq(struct utcp_connection *connection);
+size_t utcp_get_outq(struct utcp_connection *connection);
 
-extern void utcp_expect_data(struct utcp_connection *connection, bool expect);
+void utcp_expect_data(struct utcp_connection *connection, bool expect);
 
 // Completely global options
 
-extern void utcp_set_clock_granularity(long granularity);
+void utcp_set_clock_granularity(long granularity);
 
 #endif
index 6c01e6ae84262b68347dc370449d6cdabda57fab..dfbb2055a6b6f196e145438371707a83eef72a0a 100644 (file)
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-extern int hex2bin(const char *src, void *dst, int length);
-extern int bin2hex(const void *src, char *dst, int length);
+int hex2bin(const char *src, void *dst, int length);
+int bin2hex(const void *src, char *dst, int length);
 
-extern int b64encode(const void *src, char *dst, int length);
-extern int b64encode_urlsafe(const void *src, char *dst, int length);
-extern int b64decode(const char *src, void *dst, int length);
+int b64encode(const void *src, char *dst, int length);
+int b64encode_urlsafe(const void *src, char *dst, int length);
+int b64decode(const char *src, void *dst, int length);
 
 #ifdef HAVE_MINGW
-extern const char *winerror(int);
+const char *winerror(int);
 #define strerror(x) ((x)>0?strerror(x):winerror(GetLastError()))
 #define sockerrno WSAGetLastError()
 #define sockstrerror(x) winerror(x)
@@ -45,6 +45,6 @@ extern const char *winerror(int);
 #define sockinuse(x) ((x) == EADDRINUSE)
 #endif
 
-extern unsigned int bitfield_to_int(const void *bitfield, size_t size) __attribute__((__warn_unused_result__));
+unsigned int bitfield_to_int(const void *bitfield, size_t size) __attribute__((__warn_unused_result__));
 
 #endif
index 03d5620a53c8ed09e0bd0358d0357e155ee1c38d..c771c7b9209c16161bd732d12d4cd57c4351c337 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef MESHLINK_XOSHIRO_H
 #define MESHLINK_XOSHIRO_H
 
-extern uint64_t xoshiro(uint64_t s[4]) __attribute__((__warn_unused_result__));
+uint64_t xoshiro(uint64_t s[4]) __attribute__((__warn_unused_result__));
 
 #endif
index bc93de09c68e32508dab5ce5bb27391dec875bca..004e7186437fdc2b9fe8c3e64391eefb81523890 100644 (file)
@@ -13,7 +13,7 @@
 #include "meshlink.h"
 #include "utils.h"
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Check that the first time we need to supply a name
index 11a330eb86bf16c38bea443cbcf5ef48f56cf367..8b081963bf2089fc7c7e7f0f4dcad1806c5bcdca 100644 (file)
@@ -44,7 +44,7 @@ static void baz_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool r
        }
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Create three instances.
index d4644a42c00943a1d9e57d91c4975f02fb192940..3b605bb53ae4143381a14d0f8deaddb880cfb1d2 100644 (file)
@@ -79,7 +79,7 @@ static void poll_cb2(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_
        set_sync_flag(channel->priv, true);
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        meshlink_handle_t *a, *b;
index 8e17341dd8316c622de546f2edfe296e9987309d..e9b4c7ba4755280710724e72f6fa276c95218b53 100644 (file)
@@ -43,7 +43,7 @@ static void receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, con
        set_sync_flag(&receive_flag, true);
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open two meshlink instances.
index f331d0d2d4407c478cb7c5f2f81001e32bb2a7dd..30f7cf8ecb35b61d2c3e6cca9b54d945b4d40fb0 100644 (file)
@@ -186,7 +186,7 @@ static void alarm_handler(int sig) {
        assert(0);
 }
 
-int main() {
+int main(void) {
        int fda[2], fdb[2];
 
        assert(pipe2(fda, 0) != -1);
index 8071d467f6a5ca8d3bbf82858b59a4d6eecd5b8d..4e628c017fb77efbd31b2a0d243d46a47a396d65 100644 (file)
@@ -100,7 +100,7 @@ static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint
        return false;
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_cb);
 
        // Open four new meshlink instance, the server and three peers.
index 5424ae66639bf3e4929a86763a0d216339704610..3dbbaa7b08f025220518d74028a77369062be094 100644 (file)
@@ -75,7 +75,7 @@ static void poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t
        assert(meshlink_channel_send(mesh, channel, "Hello", 5) == 5);
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open two new meshlink instance.
index db2ce72a0db80540d0c8ac5aadf26b41db581465..ed3e75683822508a54a553cb445bd124daac9817 100644 (file)
@@ -18,7 +18,7 @@ static void handle_duplicate(meshlink_handle_t *mesh, meshlink_node_t *node) {
        assert(meshlink_blacklist(mesh, node));
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open meshlink instances
@@ -34,7 +34,7 @@ int main() {
                mesh[i] = meshlink_open(dirname, name[i], "duplicate", DEV_CLASS_BACKBONE);
                assert(mesh[i]);
 
-               assert(meshlink_add_address(mesh[i], "localhost"));
+               assert(meshlink_set_canonical_address(mesh[i], meshlink_get_self(mesh[i]), "localhost", NULL));
                meshlink_enable_discovery(mesh[i], false);
 
                meshlink_set_node_duplicate_cb(mesh[i], handle_duplicate);
index 94000c68cecfb157ddf70ce2395ed2ca4c9b0b99..0096c9e0fb4adc5c8611a5bccd366d7863bd2445 100644 (file)
@@ -174,7 +174,7 @@ static int main2(void) {
 }
 
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_cb);
 
        // Initialize and exchange configuration.
index c7d5bc4b7fb310c7f640ee40f2f6e64f309a9717..ac0dfa92023afdb77a47a49170444b76fc3eeb69 100644 (file)
@@ -13,7 +13,7 @@
 #include "meshlink.h"
 #include "utils.h"
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open a new meshlink instance.
index 07bb745a1720c50c7b568adaa614990ebcc2e517..07db7ebd5322acd768db53e83a752126c14e315a 100644 (file)
@@ -10,7 +10,7 @@
 #include "meshlink.h"
 #include "utils.h"
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open two ephemeral meshlink instance.
index 65a0a8a49ab166b119a39cdc81b3c71fb20e6e48..3340982b15f6f5a33a1d7371db853544a2e5d79b 100644 (file)
@@ -13,9 +13,9 @@
 #include "meshlink.h"
 #include "utils.h"
 
-struct sync_flag bar_reachable;
+static struct sync_flag bar_reachable;
 
-void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
+static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
        (void)mesh;
 
        if(reachable && !strcmp(node->name, "bar")) {
@@ -23,7 +23,7 @@ void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
        }
 }
 
-int main() {
+int main(void) {
        struct meshlink_node **nodes = NULL;
        size_t nnodes = 0;
 
index 5d37146fd09502d8711f70a592033124462c8879..599e4c1422bf004adde7097a1b54b9f0f15fcb24 100644 (file)
@@ -12,9 +12,9 @@
 #include "meshlink.h"
 #include "utils.h"
 
-struct sync_flag bar_reachable;
+static struct sync_flag bar_reachable;
 
-void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
+static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
        (void)mesh;
 
        if(reachable && !strcmp(node->name, "bar")) {
@@ -22,7 +22,7 @@ void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
        }
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open two new meshlink instance.
index 21041d8b4cb1fd107ba57779ce1c30d39ba79b56..85fb4931d05797ab52cdea8e9fb335e412d1f1ff 100644 (file)
@@ -22,7 +22,7 @@ static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reach
        }
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        assert(meshlink_destroy("invite_join_conf.1"));
index 66f4ecc387323c635122f262971dedce7bcaa76d..a9ac1157dc179c6f37340167ce337ae49716da16 100644 (file)
@@ -11,7 +11,7 @@
 #include "meshlink.h"
 #include "utils.h"
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Open two new meshlink instance.
index 4362f6da7b09fc98d9fc979e960e7107c0b31915..478dd28ee56fd768fb92c6af777c91da8ebd166f 100644 (file)
@@ -47,7 +47,7 @@ static void baz_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool r
        }
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Create three instances.
index d57af9601c29bfae753f68de4eabdb7a165baf77..328c6a95961a4c95153f3f859d68e8d10afc4ba6 100644 (file)
@@ -47,7 +47,7 @@ static void baz_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool r
        }
 }
 
-int main() {
+int main(void) {
        meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
 
        // Create three instances.