From 06943e828c45d8f4f1da6dc51907499f92957a39 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Thu, 5 Dec 2013 15:01:30 +0100 Subject: [PATCH] If no Port is specified, set myport to actual port of first listening socket. If the Port statement is not used, there are two other ways to let tinc listen on a non-default port: either by specifying one or more BindToAddress statements including port numbers, or by starting it from systemd with socket activation. Tinc announces its own port to other nodes, but before it only announced what was set using the Port statement. --- src/net_setup.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/net_setup.c b/src/net_setup.c index 6157993c..0085598e 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -649,6 +649,7 @@ bool setup_myself_reloadable(void) { static bool setup_myself(void) { char *name, *hostname, *cipher, *digest, *type; char *address = NULL; + bool port_specified = false; if(!(name = get_name())) { logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!"); @@ -663,9 +664,8 @@ static bool setup_myself(void) { if(!get_config_string(lookup_config(config_tree, "Port"), &myport)) myport = xstrdup("655"); - - xasprintf(&myself->hostname, "MYSELF port %s", myport); - myself->connection->hostname = xstrdup(myself->hostname); + else + port_specified = true; myself->connection->options = 0; myself->connection->protocol_major = PROT_MAJOR; @@ -681,6 +681,8 @@ static bool setup_myself(void) { if(!read_rsa_private_key()) return false; + /* Ensure myport is numeric */ + if(!atoi(myport)) { struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM); sockaddr_t sa; @@ -953,6 +955,24 @@ static bool setup_myself(void) { return false; } + /* If no Port option was specified, set myport to the port used by the first listening socket. */ + + if(!port_specified) { + sockaddr_t sa; + socklen_t salen = sizeof sa; + if(!getsockname(listen_socket[0].udp.fd, &sa.sa, &salen)) { + free(myport); + sockaddr2str(&sa, NULL, &myport); + if(!myport) + myport = xstrdup("655"); + } + } + + xasprintf(&myself->hostname, "MYSELF port %s", myport); + myself->connection->hostname = xstrdup(myself->hostname); + + /* Done. */ + last_config_check = now.tv_sec; return true; -- 2.20.1