Fix reloading Subnets when StrictSubnets is set.
[tinc] / src / net_setup.c
index 6e51b2e..cb70926 100644 (file)
@@ -204,14 +204,14 @@ bool read_rsa_private_key(void) {
 /*
   Read Subnets from all host config files
 */
-static void load_all_subnets(void) {
+void load_all_subnets(void) {
        DIR *dir;
        struct dirent *ent;
        char *dname;
        char *fname;
        avl_tree_t *config_tree;
        config_t *cfg;
-       subnet_t *s;
+       subnet_t *s, *s2;
        node_t *n;
        bool result;
 
@@ -228,9 +228,6 @@ static void load_all_subnets(void) {
                        continue;
 
                n = lookup_node(ent->d_name);
-               if(n)
-                       continue;
-
                #ifdef _DIRENT_HAVE_D_TYPE
                //if(ent->d_type != DT_REG)
                //      continue;
@@ -243,15 +240,21 @@ static void load_all_subnets(void) {
                if(!result)
                        continue;
 
-               n = new_node();
-               n->name = xstrdup(ent->d_name);
-               node_add(n);
+               if(!n) {
+                       n = new_node();
+                       n->name = xstrdup(ent->d_name);
+                       node_add(n);
+               }
 
                for(cfg = lookup_config(config_tree, "Subnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
                        if(!get_config_subnet(cfg, &s))
                                continue;
 
-                       subnet_add(n, s);
+                       if((s2 = lookup_subnet(n, s))) {
+                               s2->expires = -1;
+                       } else {
+                               subnet_add(n, s);
+                       }
                }
 
                exit_configuration(&config_tree);
@@ -309,6 +312,16 @@ bool setup_myself(void) {
                        && !get_config_string(lookup_config(myself->connection->config_tree, "Port"), &myport))
                myport = xstrdup("655");
 
+       if(!atoi(myport)) {
+               struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM);
+               sockaddr_t sa;
+               if(!ai || !ai->ai_addr)
+                       return false;
+               free(myport);
+               memcpy(&sa, ai->ai_addr, ai->ai_addrlen);
+               sockaddr2str(&sa, NULL, &myport);
+       }
+
        /* Read in all the subnets specified in the host configuration file */
 
        cfg = lookup_config(myself->connection->config_tree, "Subnet");
@@ -339,6 +352,7 @@ bool setup_myself(void) {
        if(myself->options & OPTION_TCPONLY)
                myself->options |= OPTION_INDIRECT;
 
+       get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
        get_config_bool(lookup_config(config_tree, "StrictSubnets"), &strictsubnets);
        get_config_bool(lookup_config(config_tree, "TunnelServer"), &tunnelserver);
        strictsubnets |= tunnelserver;
@@ -359,11 +373,11 @@ bool setup_myself(void) {
 
        if(get_config_string(lookup_config(config_tree, "Forwarding"), &mode)) {
                if(!strcasecmp(mode, "off"))
-                       routing_mode = FMODE_OFF;
+                       forwarding_mode = FMODE_OFF;
                else if(!strcasecmp(mode, "internal"))
-                       routing_mode = FMODE_INTERNAL;
+                       forwarding_mode = FMODE_INTERNAL;
                else if(!strcasecmp(mode, "kernel"))
-                       routing_mode = FMODE_KERNEL;
+                       forwarding_mode = FMODE_KERNEL;
                else {
                        logger(LOG_ERR, "Invalid forwarding mode!");
                        return false;