Remove pidfile in favour of control socket.
[tinc] / src / tincd.c
index 8869cca..7efc632 100644 (file)
@@ -1,7 +1,7 @@
 /*
     tincd.c -- the main file for tincd
-    Copyright (C) 1998-2005 Ivo Timmermans <ivo@tinc-vpn.org>
-                  2000-2005 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 1998-2005 Ivo Timmermans
+                  2000-2007 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 #include <openssl/evp.h>
 #include <openssl/engine.h>
 
-#include <lzo1x.h>
+#include LZO1X_H
 
 #include <getopt.h>
-#include "pidfile.h"
 
 #include "conf.h"
+#include "control.h"
 #include "device.h"
 #include "logger.h"
 #include "net.h"
@@ -61,9 +61,6 @@ bool show_help = false;
 /* If nonzero, print the version on standard output and exit.  */
 bool show_version = false;
 
-/* If nonzero, it will attempt to kill a running tincd and exit. */
-int kill_tincd = 0;
-
 /* If nonzero, generate public/private keypair for this host/net. */
 int generate_keys = 0;
 
@@ -77,7 +74,7 @@ bool do_mlock = false;
 bool use_logfile = false;
 
 char *identname = NULL;                                /* program name for syslog */
-char *pidfilename = NULL;                      /* pid file location */
+char *controlsocketname = NULL;                        /* control socket location */
 char *logfilename = NULL;                      /* log file location */
 char **g_argv;                                 /* a copy of the cmdline arguments */
 
@@ -85,7 +82,6 @@ static int status;
 
 static struct option const long_options[] = {
        {"config", required_argument, NULL, 'c'},
-       {"kill", optional_argument, NULL, 'k'},
        {"net", required_argument, NULL, 'n'},
        {"help", no_argument, NULL, 1},
        {"version", no_argument, NULL, 2},
@@ -95,7 +91,7 @@ static struct option const long_options[] = {
        {"bypass-security", no_argument, NULL, 3},
        {"mlock", no_argument, NULL, 'L'},
        {"logfile", optional_argument, NULL, 4},
-       {"pidfile", required_argument, NULL, 5},
+       {"controlsocket", required_argument, NULL, 5},
        {NULL, 0, NULL, 0}
 };
 
@@ -110,17 +106,16 @@ static void usage(bool status)
                                program_name);
        else {
                printf(_("Usage: %s [option]...\n\n"), program_name);
-               printf(_("  -c, --config=DIR           Read configuration options from DIR.\n"
-                               "  -D, --no-detach            Don't fork and detach.\n"
-                               "  -d, --debug[=LEVEL]        Increase debug level or set it to LEVEL.\n"
-                               "  -k, --kill[=SIGNAL]        Attempt to kill a running tincd and exit.\n"
-                               "  -n, --net=NETNAME          Connect to net NETNAME.\n"
-                               "  -K, --generate-keys[=BITS] Generate public/private RSA keypair.\n"
-                               "  -L, --mlock                Lock tinc into main memory.\n"
-                               "      --logfile[=FILENAME]   Write log entries to a logfile.\n"
-                               "      --pidfile=FILENAME     Write PID to FILENAME.\n"
-                               "      --help                 Display this help and exit.\n"
-                               "      --version              Output version information and exit.\n\n"));
+               printf(_("  -c, --config=DIR                     Read configuration options from DIR.\n"
+                               "  -D, --no-detach               Don't fork and detach.\n"
+                               "  -d, --debug[=LEVEL]           Increase debug level or set it to LEVEL.\n"
+                               "  -n, --net=NETNAME             Connect to net NETNAME.\n"
+                               "  -K, --generate-keys[=BITS]    Generate public/private RSA keypair.\n"
+                               "  -L, --mlock                   Lock tinc into main memory.\n"
+                               "      --logfile[=FILENAME]      Write log entries to a logfile.\n"
+                               "      --controlsocket=FILENAME  Open control socket at FILENAME.\n"
+                               "      --help                    Display this help and exit.\n"
+                               "      --version                 Output version information and exit.\n\n"));
                printf(_("Report bugs to tinc@tinc-vpn.org.\n"));
        }
 }
@@ -130,7 +125,7 @@ static bool parse_options(int argc, char **argv)
        int r;
        int option_index = 0;
 
-       while((r = getopt_long(argc, argv, "c:DLd::k::n:K::", long_options, &option_index)) != EOF) {
+       while((r = getopt_long(argc, argv, "c:DLd::n:K::", long_options, &option_index)) != EOF) {
                switch (r) {
                        case 0:                         /* long option */
                                break;
@@ -154,42 +149,6 @@ static bool parse_options(int argc, char **argv)
                                        debug_level++;
                                break;
 
-                       case 'k':                               /* kill old tincds */
-#ifndef HAVE_MINGW
-                               if(optarg) {
-                                       if(!strcasecmp(optarg, "HUP"))
-                                               kill_tincd = SIGHUP;
-                                       else if(!strcasecmp(optarg, "TERM"))
-                                               kill_tincd = SIGTERM;
-                                       else if(!strcasecmp(optarg, "KILL"))
-                                               kill_tincd = SIGKILL;
-                                       else if(!strcasecmp(optarg, "USR1"))
-                                               kill_tincd = SIGUSR1;
-                                       else if(!strcasecmp(optarg, "USR2"))
-                                               kill_tincd = SIGUSR2;
-                                       else if(!strcasecmp(optarg, "WINCH"))
-                                               kill_tincd = SIGWINCH;
-                                       else if(!strcasecmp(optarg, "INT"))
-                                               kill_tincd = SIGINT;
-                                       else if(!strcasecmp(optarg, "ALRM"))
-                                               kill_tincd = SIGALRM;
-                                       else {
-                                               kill_tincd = atoi(optarg);
-
-                                               if(!kill_tincd) {
-                                                       fprintf(stderr, _("Invalid argument `%s'; SIGNAL must be a number or one of HUP, TERM, KILL, USR1, USR2, WINCH, INT or ALRM.\n"),
-                                                                       optarg);
-                                                       usage(true);
-                                                       return false;
-                                               }
-                                       }
-                               } else
-                                       kill_tincd = SIGTERM;
-#else
-                                       kill_tincd = 1;
-#endif
-                               break;
-
                        case 'n':                               /* net name given */
                                netname = xstrdup(optarg);
                                break;
@@ -228,8 +187,8 @@ static bool parse_options(int argc, char **argv)
                                        logfilename = xstrdup(optarg);
                                break;
 
-                       case 5:                                 /* write PID to a file */
-                               pidfilename = xstrdup(optarg);
+                       case 5:                                 /* open control socket here */
+                               controlsocketname = xstrdup(optarg);
                                break;
 
                        case '?':
@@ -375,8 +334,8 @@ static void make_names(void)
        }
 #endif
 
-       if(!pidfilename)
-               asprintf(&pidfilename, LOCALSTATEDIR "/run/%s.pid", identname);
+       if(!controlsocketname)
+               asprintf(&controlsocketname, LOCALSTATEDIR "/run/%s.control", identname);
 
        if(!logfilename)
                asprintf(&logfilename, LOCALSTATEDIR "/log/%s.log", identname);
@@ -408,7 +367,7 @@ int main(int argc, char **argv)
        if(show_version) {
                printf(_("%s version %s (built %s %s, protocol %d)\n"), PACKAGE,
                           VERSION, __DATE__, __TIME__, PROT_CURRENT);
-               printf(_("Copyright (C) 1998-2005 Ivo Timmermans, Guus Sliepen and others.\n"
+               printf(_("Copyright (C) 1998-2007 Ivo Timmermans, Guus Sliepen and others.\n"
                                "See the AUTHORS file for a complete list.\n\n"
                                "tinc comes with ABSOLUTELY NO WARRANTY.  This is free software,\n"
                                "and you are welcome to redistribute it under certain conditions;\n"
@@ -422,11 +381,16 @@ int main(int argc, char **argv)
                return 0;
        }
 
-       if(kill_tincd)
-               return !kill_other(kill_tincd);
-
        openlogger("tinc", use_logfile?LOGMODE_FILE:LOGMODE_STDERR);
 
+       if(!event_init()) {
+               logger(LOG_ERR, _("Error initializing libevent!"));
+               return 1;
+       }
+
+       if(!init_control())
+               return 1;
+
        /* Lock all pages into memory if requested */
 
        if(do_mlock)
@@ -447,6 +411,7 @@ int main(int argc, char **argv)
 
        /* Slllluuuuuuurrrrp! */
 
+       srand(time(NULL));
        RAND_load_file("/dev/urandom", 1024);
 
        ENGINE_load_builtin_engines();
@@ -507,7 +472,7 @@ end:
        logger(LOG_NOTICE, _("Terminating"));
 
 #ifndef HAVE_MINGW
-       remove_pid(pidfilename);
+       exit_control();
 #endif
 
        EVP_cleanup();