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.
This commit is contained in:
Guus Sliepen 2011-06-25 21:35:27 +02:00
parent a05fa7f882
commit ab4d289faf
2 changed files with 17 additions and 9 deletions

View 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;

View 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;
}