diff --git a/src/invitation.c b/src/invitation.c index bd1fb940..a5454bf4 100644 --- a/src/invitation.c +++ b/src/invitation.c @@ -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; diff --git a/src/tincctl.c b/src/tincctl.c index 16fa4b18..1c96524d 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -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; diff --git a/src/tincctl.h b/src/tincctl.h index 64413a39..aa840cec 100644 --- a/src/tincctl.h +++ b/src/tincctl.h @@ -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