]> git.meshlink.io Git - meshlink/commitdiff
Check the return value of check_port().
authorGuus Sliepen <guus@meshlink.io>
Tue, 1 May 2018 12:10:45 +0000 (14:10 +0200)
committerGuus Sliepen <guus@meshlink.io>
Tue, 1 May 2018 12:10:45 +0000 (14:10 +0200)
When initializing a new MeshLink instance, fail if there is no port
available for listening. When starting an already configured instance,
if no Port statement is found in the local node's host config file,
select and add a new one.

src/meshlink.c
src/meshlink_internal.h
src/net_setup.c

index 769e52c6e896c8021691fe678619a424ea8ddabb..d4a833ab873122237bf7db246f8cc85fc9462e7f 100644 (file)
@@ -444,7 +444,7 @@ static bool try_bind(int port) {
        return true;
 }
 
-static int check_port(meshlink_handle_t *mesh) {
+int check_port(meshlink_handle_t *mesh) {
        for(int i = 0; i < 1000; i++) {
                int port = 0x1000 + (rand() & 0x7fff);
 
@@ -454,7 +454,8 @@ static int check_port(meshlink_handle_t *mesh) {
                        FILE *f = fopen(filename, "a");
 
                        if(!f) {
-                               logger(mesh, MESHLINK_DEBUG, "Please change MeshLink's Port manually.\n");
+                               meshlink_errno = MESHLINK_ESTORAGE;
+                               logger(mesh, MESHLINK_DEBUG, "Could not store Port.\n");
                                return 0;
                        }
 
@@ -464,7 +465,8 @@ static int check_port(meshlink_handle_t *mesh) {
                }
        }
 
-       logger(mesh, MESHLINK_DEBUG, "Please change MeshLink's Port manually.\n");
+       meshlink_errno = MESHLINK_ENETWORK;
+       logger(mesh, MESHLINK_DEBUG, "Could not find any available network port.\n");
        return 0;
 }
 
@@ -948,10 +950,15 @@ static bool meshlink_setup(meshlink_handle_t *mesh) {
 
        if(!ecdsa_keygen(mesh)) {
                meshlink_errno = MESHLINK_EINTERNAL;
+               unlink(filename);
                return false;
        }
 
-       check_port(mesh);
+       if (check_port(mesh) == 0) {
+               meshlink_errno = MESHLINK_ENETWORK;
+               unlink(filename);
+               return false;
+       }
 
        return true;
 }
index a727bb539fa7ea08b9eb62ddd777d26cd6af877f..d7d4910b18cfccf79461195d3246f137d4396445 100644 (file)
@@ -170,6 +170,7 @@ extern void meshlink_send_from_queue(event_loop_t *el, meshlink_handle_t *mesh);
 extern void update_node_status(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 int check_port(meshlink_handle_t *mesh);
 
 /// Device class traits
 typedef struct {
index a59632cfec3ff216124c229874c801fa5caf1a2b..2cd021111a204aebb37b4e0273a12ec75e19beed 100644 (file)
@@ -365,8 +365,10 @@ bool setup_myself(meshlink_handle_t *mesh) {
        read_host_config(mesh, mesh->config, name);
 
        if(!get_config_string(lookup_config(mesh->config, "Port"), &mesh->myport)) {
-               logger(mesh, MESHLINK_ERROR, "Port for MeshLink instance required!");
-               return false;
+               int port = check_port(mesh);
+               if (port == 0)
+                       return false;
+               xasprintf(&mesh->myport, "%d", port);
        }
 
        mesh->self->connection->options = 0;