From ab4d289fafd1d391583935ab4c306f1f508ea1d0 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sat, 25 Jun 2011 21:35:27 +0200 Subject: [PATCH] Make pid files backwards compatible and add address of listening socket. The pid is now written first, so that a version 1.0.x tincd can be used to stop a running version 1.1 tincd. Getsockname() is used to determine the address of the first listening socket, so that tincctl can connect to the local tincd even if AddressFamily = ipv6, or if BindToAddress or BindToInterface is used. --- src/control.c | 15 ++++++++++++++- src/tincctl.c | 11 +++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/control.c b/src/control.c index 01f25aab..bcafc09f 100644 --- a/src/control.c +++ b/src/control.c @@ -26,6 +26,7 @@ #include "logger.h" #include "meta.h" #include "net.h" +#include "netutl.h" #include "protocol.h" #include "route.h" #include "splay_tree.h" @@ -146,8 +147,20 @@ bool init_control(void) { #else chmod(pidfilename, 0600); #endif + // Get the address and port of the first listening socket - fprintf(f, "%s %s %d\n", controlcookie, myport, getpid()); + char *localhost = NULL; + sockaddr_t sa; + socklen_t len = sizeof sa; + + if(getsockname(listen_socket[0].tcp, (struct sockaddr *)&sa, &len)) + xasprintf(&localhost, "127.0.0.1 port %d", myport); + else + localhost = sockaddr2hostname(&sa); + + fprintf(f, "%d %s %s\n", (int)getpid(), controlcookie, localhost); + + free(localhost); fclose(f); return true; diff --git a/src/tincctl.c b/src/tincctl.c index 7ed79b1a..98f4a1b9 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -44,7 +44,6 @@ static char *pidfilename = NULL; /* pid file location */ static char controlcookie[1024]; char *netname = NULL; char *confbase = NULL; -static char *host = NULL; #ifdef HAVE_MINGW static struct WSAData wsa_state; @@ -52,7 +51,6 @@ static struct WSAData wsa_state; static struct option const long_options[] = { {"config", required_argument, NULL, 'c'}, - {"host", required_argument, NULL, 'h'}, {"net", required_argument, NULL, 'n'}, {"help", no_argument, NULL, 1}, {"version", no_argument, NULL, 2}, @@ -104,7 +102,7 @@ static bool parse_options(int argc, char **argv) { int r; int option_index = 0; - while((r = getopt_long(argc, argv, "c:n:h:", long_options, &option_index)) != EOF) { + while((r = getopt_long(argc, argv, "c:n:", long_options, &option_index)) != EOF) { switch (r) { case 0: /* long option */ break; @@ -113,10 +111,6 @@ static bool parse_options(int argc, char **argv) { confbase = xstrdup(optarg); break; - case 'h': /* alternative host to connect to */ - host = xstrdup(optarg); - break; - case 'n': /* net name given */ netname = xstrdup(optarg); break; @@ -429,6 +423,7 @@ void pcap(int fd, FILE *out) { int main(int argc, char *argv[], char *envp[]) { int fd; int result; + char host[128]; char port[128]; int pid; @@ -487,7 +482,7 @@ int main(int argc, char *argv[], char *envp[]) { fprintf(stderr, "Could not open pid file %s: %s\n", pidfilename, strerror(errno)); return 1; } - if(fscanf(f, "%1024s %128s %20d", controlcookie, port, &pid) != 3) { + if(fscanf(f, "%20d %1024s %128s port %128s", &pid, controlcookie, host, port) != 4) { fprintf(stderr, "Could not parse pid file %s\n", pidfilename); return 1; } -- 2.20.1