]> git.meshlink.io Git - meshlink/blobdiff - src/net_setup.c
Never automatically try to bind to ports >= 32768.
[meshlink] / src / net_setup.c
index af49ea09944092fa0b2d90575cb660c0c290924b..a7a538f01c75d1b4ed66fa77114391bbce123ce1 100644 (file)
@@ -93,6 +93,11 @@ bool node_read_public_key(meshlink_handle_t *mesh, node_t *n) {
        // While we are at it, read known address information
        if(!n->canonical_address) {
                n->canonical_address = packmsg_get_str_dup(&in);
+
+               if(!*n->canonical_address) {
+                       free(n->canonical_address);
+                       n->canonical_address = NULL;
+               }
        } else {
                packmsg_skip_element(&in);
        }
@@ -191,6 +196,12 @@ bool node_read_from_config(meshlink_handle_t *mesh, node_t *n, const config_t *c
        }
 
        n->canonical_address = packmsg_get_str_dup(&in);
+
+       if(!*n->canonical_address) {
+               free(n->canonical_address);
+               n->canonical_address = NULL;
+       }
+
        uint32_t count = packmsg_get_array(&in);
 
        for(uint32_t i = 0; i < count; i++) {
@@ -207,11 +218,26 @@ bool node_read_from_config(meshlink_handle_t *mesh, node_t *n, const config_t *c
        return packmsg_done(&in);
 }
 
-bool node_write_config(meshlink_handle_t *mesh, node_t *n) {
+bool node_write_config(meshlink_handle_t *mesh, node_t *n, bool new_key) {
        if(!mesh->confbase) {
                return true;
        }
 
+       switch(mesh->storage_policy) {
+       case MESHLINK_STORAGE_KEYS_ONLY:
+               if(!new_key) {
+                       return true;
+               }
+
+               break;
+
+       case MESHLINK_STORAGE_DISABLED:
+               return true;
+
+       default:
+               break;
+       }
+
        uint8_t buf[4096];
        packmsg_output_t out = {buf, sizeof(buf)};
 
@@ -260,6 +286,7 @@ bool node_write_config(meshlink_handle_t *mesh, node_t *n) {
                return false;
        }
 
+       n->status.dirty = false;
        return true;
 }
 
@@ -267,6 +294,15 @@ static bool load_node(meshlink_handle_t *mesh, const char *name, void *priv) {
        (void)priv;
 
        if(!check_id(name)) {
+               // Check if this is a temporary file, if so remove it
+               const char *suffix = strstr(name, ".tmp");
+
+               if(suffix && !suffix[4]) {
+                       char filename[PATH_MAX];
+                       snprintf(filename, sizeof(filename), "%s" SLASH "current" SLASH "hosts", mesh->confbase);
+                       unlink(filename);
+               }
+
                return true;
        }
 
@@ -312,6 +348,25 @@ int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip)
        fcntl(nfd, F_SETFD, FD_CLOEXEC);
 #endif
 
+#ifdef O_NONBLOCK
+       int flags = fcntl(nfd, F_GETFL);
+
+       if(fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0) {
+               closesocket(nfd);
+               logger(mesh, MESHLINK_ERROR, "System call `%s' failed: %s", "fcntl", strerror(errno));
+               return -1;
+       }
+
+#elif defined(WIN32)
+       unsigned long arg = 1;
+
+       if(ioctlsocket(nfd, FIONBIO, &arg) != 0) {
+               closesocket(nfd);
+               logger(mesh, MESHLINK_ERROR, "Call to `%s' failed: %s", "ioctlsocket", sockstrerror(sockerrno));
+               return -1;
+       }
+
+#endif
        int option = 1;
        setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&option, sizeof(option));
 
@@ -508,8 +563,8 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) {
                for(int i = 0; i < mesh->listen_sockets; i++) {
                        io_del(&mesh->loop, &mesh->listen_socket[i].tcp);
                        io_del(&mesh->loop, &mesh->listen_socket[i].udp);
-                       close(mesh->listen_socket[i].tcp.fd);
-                       close(mesh->listen_socket[i].udp.fd);
+                       closesocket(mesh->listen_socket[i].tcp.fd);
+                       closesocket(mesh->listen_socket[i].udp.fd);
                }
 
                mesh->listen_sockets = 0;
@@ -522,12 +577,6 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) {
   Configure node_t mesh->self and set up the local sockets (listen only)
 */
 static bool setup_myself(meshlink_handle_t *mesh) {
-       /* Set some defaults */
-
-       mesh->maxtimeout = 900;
-
-       /* Done */
-
        mesh->self->nexthop = mesh->self;
 
        node_add(mesh, mesh->self);
@@ -603,8 +652,8 @@ void close_network_connections(meshlink_handle_t *mesh) {
        for(int i = 0; i < mesh->listen_sockets; i++) {
                io_del(&mesh->loop, &mesh->listen_socket[i].tcp);
                io_del(&mesh->loop, &mesh->listen_socket[i].udp);
-               close(mesh->listen_socket[i].tcp.fd);
-               close(mesh->listen_socket[i].udp.fd);
+               closesocket(mesh->listen_socket[i].tcp.fd);
+               closesocket(mesh->listen_socket[i].udp.fd);
        }
 
        exit_requests(mesh);