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.
This commit is contained in:
Guus Sliepen 2013-12-05 15:01:30 +01:00
parent 3e924045cc
commit 06943e828c

View file

@ -649,6 +649,7 @@ bool setup_myself_reloadable(void) {
static bool setup_myself(void) { static bool setup_myself(void) {
char *name, *hostname, *cipher, *digest, *type; char *name, *hostname, *cipher, *digest, *type;
char *address = NULL; char *address = NULL;
bool port_specified = false;
if(!(name = get_name())) { if(!(name = get_name())) {
logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!"); 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)) if(!get_config_string(lookup_config(config_tree, "Port"), &myport))
myport = xstrdup("655"); myport = xstrdup("655");
else
xasprintf(&myself->hostname, "MYSELF port %s", myport); port_specified = true;
myself->connection->hostname = xstrdup(myself->hostname);
myself->connection->options = 0; myself->connection->options = 0;
myself->connection->protocol_major = PROT_MAJOR; myself->connection->protocol_major = PROT_MAJOR;
@ -681,6 +681,8 @@ static bool setup_myself(void) {
if(!read_rsa_private_key()) if(!read_rsa_private_key())
return false; return false;
/* Ensure myport is numeric */
if(!atoi(myport)) { if(!atoi(myport)) {
struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM); struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM);
sockaddr_t sa; sockaddr_t sa;
@ -953,6 +955,24 @@ static bool setup_myself(void) {
return false; 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; last_config_check = now.tv_sec;
return true; return true;