]> git.meshlink.io Git - meshlink/blobdiff - src/net_setup.c
Stop using global variable mesh in net_setup.[ch].
[meshlink] / src / net_setup.c
index e168f6acd4d8a7416378ea0d962821ed730d2060..1ebacffa5863e84a98e553fdfdb9c94630a416c2 100644 (file)
@@ -34,7 +34,7 @@
 
 int autoconnect = 3;
 
-bool node_read_ecdsa_public_key(node_t *n) {
+bool node_read_ecdsa_public_key(meshlink_handle_t *mesh, node_t *n) {
        if(ecdsa_active(n->ecdsa))
                return true;
 
@@ -42,7 +42,7 @@ bool node_read_ecdsa_public_key(node_t *n) {
        char *p;
 
        init_configuration(&config_tree);
-       if(!read_host_config(config_tree, n->name))
+       if(!read_host_config(mesh, config_tree, n->name))
                goto exit;
 
        /* First, check for simple ECDSAPublicKey statement */
@@ -57,7 +57,7 @@ exit:
        return n->ecdsa;
 }
 
-bool read_ecdsa_public_key(connection_t *c) {
+bool read_ecdsa_public_key(meshlink_handle_t *mesh, connection_t *c) {
        if(ecdsa_active(c->ecdsa))
                return true;
 
@@ -65,7 +65,7 @@ bool read_ecdsa_public_key(connection_t *c) {
 
        if(!c->config_tree) {
                init_configuration(&c->config_tree);
-               if(!read_host_config(c->config_tree, c->name))
+               if(!read_host_config(mesh, c->config_tree, c->name))
                        return false;
        }
 
@@ -80,13 +80,12 @@ bool read_ecdsa_public_key(connection_t *c) {
        return false;
 }
 
-static bool read_ecdsa_private_key(void) {
+static bool read_ecdsa_private_key(meshlink_handle_t *mesh) {
        FILE *fp;
-       char *fname;
+       char filename[PATH_MAX];
 
-       xasprintf(&fname, "%s" SLASH "ecdsa_key.priv", mesh->confbase);
-       fp = fopen(fname, "r");
-       free(fname);
+       snprintf(filename,PATH_MAX, "%s" SLASH "ecdsa_key.priv", mesh->confbase);
+       fp = fopen(filename, "r");
 
        if(!fp) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Error reading ECDSA private key file: %s", strerror(errno));
@@ -102,40 +101,38 @@ static bool read_ecdsa_private_key(void) {
        return mesh->self->connection->ecdsa;
 }
 
-static bool read_invitation_key(void) {
+static bool read_invitation_key(meshlink_handle_t *mesh) {
        FILE *fp;
-       char *fname;
+       char filename[PATH_MAX];
 
        if(mesh->invitation_key) {
                ecdsa_free(mesh->invitation_key);
                mesh->invitation_key = NULL;
        }
 
-       xasprintf(&fname, "%s" SLASH "invitations" SLASH "ecdsa_key.priv", mesh->confbase);
+       snprintf(filename,PATH_MAX, "%s" SLASH "invitations" SLASH "ecdsa_key.priv", mesh->confbase);
 
-       fp = fopen(fname, "r");
+       fp = fopen(filename, "r");
 
        if(fp) {
                mesh->invitation_key = ecdsa_read_pem_private_key(fp);
                fclose(fp);
                if(!mesh->invitation_key)
-                       logger(DEBUG_ALWAYS, LOG_ERR, "Reading ECDSA private key file `%s' failed: %s", fname, strerror(errno));
+                       logger(DEBUG_ALWAYS, LOG_ERR, "Reading ECDSA private key file `%s' failed: %s", filename, strerror(errno));
        }
 
-       free(fname);
        return mesh->invitation_key;
 }
 
-void load_all_nodes(void) {
+static void load_all_nodes(meshlink_handle_t *mesh) {
        DIR *dir;
        struct dirent *ent;
-       char *dname;
+       char dname[PATH_MAX];
 
-       xasprintf(&dname, "%s" SLASH "hosts", mesh->confbase);
+       snprintf(dname,PATH_MAX, "%s" SLASH "hosts", mesh->confbase);
        dir = opendir(dname);
        if(!dir) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Could not open %s: %s", dname, strerror(errno));
-               free(dname);
                return;
        }
 
@@ -156,7 +153,7 @@ void load_all_nodes(void) {
 }
 
 
-char *get_name(void) {
+char *get_name(meshlink_handle_t *mesh) {
        char *name = NULL;
 
        get_config_string(lookup_config(mesh->config, "Name"), &name);
@@ -173,14 +170,14 @@ char *get_name(void) {
        return name;
 }
 
-bool setup_myself_reloadable(void) {
+bool setup_myself_reloadable(meshlink_handle_t *mesh) {
        mesh->localdiscovery = true;
        keylifetime = 3600; // TODO: check if this can be removed as well
        mesh->maxtimeout = 900;
        autoconnect = 3;
        mesh->self->options |= OPTION_PMTU_DISCOVERY;
 
-       read_invitation_key();
+       read_invitation_key(mesh);
 
        return true;
 }
@@ -188,7 +185,7 @@ bool setup_myself_reloadable(void) {
 /*
   Add listening sockets.
 */
-static bool add_listen_address(char *address, bool bindto) {
+static bool add_listen_address(meshlink_handle_t *mesh, char *address, bool bindto) {
        char *port = mesh->myport;
 
        if(address) {
@@ -246,8 +243,8 @@ static bool add_listen_address(char *address, bool bindto) {
                        continue;
                }
 
-               io_add(&mesh->listen_socket[mesh->listen_sockets].tcp, handle_new_meta_connection, &mesh->listen_socket[mesh->listen_sockets], tcp_fd, IO_READ);
-               io_add(&mesh->listen_socket[mesh->listen_sockets].udp, handle_incoming_vpn_data, &mesh->listen_socket[mesh->listen_sockets], udp_fd, IO_READ);
+               io_add(&mesh->loop, &mesh->listen_socket[mesh->listen_sockets].tcp, handle_new_meta_connection, &mesh->listen_socket[mesh->listen_sockets], tcp_fd, IO_READ);
+               io_add(&mesh->loop, &mesh->listen_socket[mesh->listen_sockets].udp, handle_incoming_vpn_data, &mesh->listen_socket[mesh->listen_sockets], udp_fd, IO_READ);
 
                if(mesh->debug_level >= DEBUG_CONNECTIONS) {
                        char *hostname = sockaddr2hostname((sockaddr_t *) aip->ai_addr);
@@ -267,12 +264,12 @@ static bool add_listen_address(char *address, bool bindto) {
 /*
   Configure node_t mesh->self and set up the local sockets (listen only)
 */
-bool setup_myself(void) {
+bool setup_myself(meshlink_handle_t *mesh) {
        char *name, *hostname, *cipher, *digest, *type;
        char *address = NULL;
        bool port_specified = false;
 
-       if(!(name = get_name())) {
+       if(!(name = get_name(mesh))) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!");
                return false;
        }
@@ -281,7 +278,7 @@ bool setup_myself(void) {
        mesh->self->connection = new_connection();
        mesh->self->name = name;
        mesh->self->connection->name = xstrdup(name);
-       read_host_config(mesh->config, name);
+       read_host_config(mesh, mesh->config, name);
 
        if(!get_config_string(lookup_config(mesh->config, "Port"), &mesh->myport))
                mesh->myport = xstrdup("655");
@@ -294,7 +291,7 @@ bool setup_myself(void) {
 
        mesh->self->options |= PROT_MINOR << 24;
 
-       if(!read_ecdsa_private_key())
+       if(!read_ecdsa_private_key(mesh))
                return false;
 
        /* Ensure mesh->myport is numeric */
@@ -311,7 +308,7 @@ bool setup_myself(void) {
 
        /* Check some options */
 
-       if(!setup_myself_reloadable())
+       if(!setup_myself_reloadable(mesh))
                return false;
 
        /* Compression */
@@ -325,20 +322,20 @@ bool setup_myself(void) {
        mesh->self->nexthop = mesh->self;
        mesh->self->via = mesh->self;
        mesh->self->status.reachable = true;
-       mesh->self->last_state_change = now.tv_sec;
+       mesh->self->last_state_change = mesh->loop.now.tv_sec;
        node_add(mesh->self);
 
        graph();
 
        if(autoconnect)
-               load_all_nodes();
+               load_all_nodes(mesh);
 
        /* Open sockets */
 
        mesh->listen_sockets = 0;
        int cfgs = 0;
 
-       if(!add_listen_address(address, NULL))
+       if(!add_listen_address(mesh, address, NULL))
                return false;
 
        if(!mesh->listen_sockets) {
@@ -356,7 +353,7 @@ bool setup_myself(void) {
 
        /* Done. */
 
-       mesh->last_config_check = now.tv_sec;
+       mesh->last_config_check = mesh->loop.now.tv_sec;
 
        return true;
 }
@@ -364,7 +361,7 @@ bool setup_myself(void) {
 /*
   initialize network
 */
-bool setup_network(void) {
+bool setup_network(meshlink_handle_t *mesh) {
        init_connections();
        init_nodes();
        init_edges();
@@ -374,7 +371,7 @@ bool setup_network(void) {
        mesh->pingtimeout = 5;
        maxoutbufsize = 10 * MTU;
 
-       if(!setup_myself())
+       if(!setup_myself(mesh))
                return false;
 
        return true;
@@ -400,8 +397,8 @@ void close_network_connections(void) {
        }
 
        for(int i = 0; i < mesh->listen_sockets; i++) {
-               io_del(&mesh->listen_socket[i].tcp);
-               io_del(&mesh->listen_socket[i].udp);
+               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);
        }