Make pid files backwards compatible and add address of listening socket.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 25 Jun 2011 19:35:27 +0000 (21:35 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 25 Jun 2011 19:35:27 +0000 (21:35 +0200)
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
src/tincctl.c

index 01f25aa..bcafc09 100644 (file)
@@ -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;
index 7ed79b1..98f4a1b 100644 (file)
@@ -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;
        }