Choose a different Port when 655 isn't available when doing "tinc join".
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 26 Jul 2013 12:53:36 +0000 (14:53 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 26 Jul 2013 12:53:36 +0000 (14:53 +0200)
src/invitation.c
src/tincctl.c
src/tincctl.h

index bd1fb94022f95d1f470613b75e64219044fe3bd0..a5454bf449af45b14dd518a138c501fce8ac8c97 100644 (file)
@@ -695,6 +695,8 @@ ask_netname:
        ecdsa_free(key);
        rsa_free(rsa);
 
+       check_port(name);
+
        fprintf(stderr, "Invitation succesfully accepted.\n");
        shutdown(sock, SHUT_RDWR);
        success = true;
index 16fa4b18bc4896cd00bba02f6db9f670d8bbbdf9..1c96524dc71fe1da4da645b71459206b2c248333 100644 (file)
@@ -1686,6 +1686,37 @@ static bool try_bind(int port) {
        return true;
 }
 
+int check_port(char *name) {
+       if(try_bind(655))
+               return 655;
+
+       fprintf(stderr, "Warning: could not bind to port 655. ");
+
+       srand(time(NULL));
+
+       for(int i = 0; i < 100; i++) {
+               int port = 0x1000 + (rand() & 0x7fff);
+               if(try_bind(port)) {
+                       char *filename;
+                       xasprintf(&filename, "%s" SLASH "hosts" SLASH "%s", confbase, name);
+                       FILE *f = fopen(filename, "a");
+                       free(filename);
+                       if(!f) {
+                               fprintf(stderr, "Please change tinc's Port manually.\n");
+                               return 0;
+                       }
+
+                       fprintf(f, "Port = %d\n", port);
+                       fclose(f);
+                       fprintf(stderr, "Tinc will instead listen on port %d.\n", port);
+                       return port;
+               }
+       }
+
+       fprintf(stderr, "Please change tinc's Port manually.\n");
+       return 0;
+}
+
 static int cmd_init(int argc, char *argv[]) {
        if(!access(tinc_conf, F_OK)) {
                fprintf(stderr, "Configuration file %s already exists!\n", tinc_conf);
@@ -1754,34 +1785,7 @@ static int cmd_init(int argc, char *argv[]) {
        if(!rsa_keygen(2048, false) || !ecdsa_keygen(false))
                return 1;
 
-
-       if(!try_bind(655)) {
-               srand(time(NULL));
-               int port = 0;
-               for(int i = 0; i < 100; i++) {
-                       port = 0x1000 + (rand() & 0x7fff);
-                       if(try_bind(port))
-                               break;
-                       port = 0;
-               }
-               if(port) {
-                       char *filename;
-                       xasprintf(&filename, "%s" SLASH "hosts" SLASH "%s", confbase, name);
-                       FILE *f = fopen(filename, "a");
-                       free(filename);
-                       if(!f) {
-                               port = 0;
-                       } else {
-                               fprintf(f, "Port = %d\n", port);
-                               fclose(f);
-                       }
-               }
-
-               if(!port)
-                       fprintf(stderr, "Warning: could not bind to port 655. Please change tinc's Port manually.\n");
-               else
-                       fprintf(stderr, "Warning: could not bind to port 655. Tinc will instead listen on port %d.\n", port);
-       }
+       check_port(name);
 
 #ifndef HAVE_MINGW
        char *filename;
index 64413a39ffdf8c052dfe7070f9556bd7d2195e06..aa840cec3d01e11a9d153f700eb71e1235988ccb 100644 (file)
@@ -47,6 +47,7 @@ extern char *get_my_name(bool verbose);
 extern bool connect_tincd(bool verbose);
 extern bool sendline(int fd, char *format, ...);
 extern bool recvline(int fd, char *line, size_t len);
+extern int check_port(char *name);
 
 #endif