Option to specify pidfile location.
[tinc] / src / tincd.c
index 185a96a..e71c321 100644 (file)
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: tincd.c,v 1.10.4.72 2003/07/12 17:41:47 guus Exp $
+    $Id: tincd.c,v 1.10.4.75 2003/07/22 12:58:34 guus Exp $
 */
 
-#include "config.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <signal.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <signal.h>
-#include <string.h>
-#include <termios.h>
+#include "system.h"
 
 /* Darwin (MacOS/X) needs the following definition... */
 #ifndef _P1003_1B_VISIBLE
 #define _P1003_1B_VISIBLE
 #endif
 
+#ifdef HAVE_SYS_MMAN_H
 #include <sys/mman.h>
-
-#ifdef HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
 #endif
 
 #include <openssl/rand.h>
 
 #include <lzo1x.h>
 
-#include <utils.h>
-#include <xalloc.h>
-
 #include "conf.h"
+#include "logger.h"
 #include "net.h"
 #include "netutl.h"
 #include "process.h"
 #include "protocol.h"
-#include "subnet.h"
-#include "logger.h"
-
-#include "system.h"
+#include "utils.h"
+#include "xalloc.h"
 
 /* The name this program was run with. */
 char *program_name = NULL;
@@ -107,6 +90,7 @@ static struct option const long_options[] = {
        {"bypass-security", no_argument, &bypass_security, 1},
        {"mlock", no_argument, &do_mlock, 1},
        {"logfile", optional_argument, NULL, 'F'},
+       {"pidfile", required_argument, NULL, 'P'},
        {NULL, 0, NULL, 0}
 };
 
@@ -124,7 +108,8 @@ static void usage(int status)
                                "  -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"
-                               "  -F, --logfile[=FILENAME]   Write log entries to a logfile.\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(_("Report bugs to tinc@nl.linux.org.\n"));
@@ -138,14 +123,13 @@ static void parse_options(int argc, char **argv, char **envp)
        int r;
        int option_index = 0;
 
-       while((r = getopt_long(argc, argv, "c:DLd::k::n:K::F::", long_options, &option_index)) != EOF) {
+       while((r = getopt_long(argc, argv, "c:DLd::k::n:K::", long_options, &option_index)) != EOF) {
                switch (r) {
                        case 0:                         /* long option */
                                break;
 
                        case 'c':                               /* config file */
-                               confbase = xmalloc(strlen(optarg) + 1);
-                               strcpy(confbase, optarg);
+                               confbase = xstrdup(optarg);
                                break;
 
                        case 'D':                               /* no detach */
@@ -219,6 +203,10 @@ static void parse_options(int argc, char **argv, char **envp)
                                        logfilename = xstrdup(optarg);
                                break;
 
+                       case 'P':                               /* write PID to a file */
+                               pidfilename = xstrdup(optarg);
+                               break;
+
                        case '?':
                                usage(1);
 
@@ -325,30 +313,25 @@ static int keygen(int bits)
 */
 static void make_names(void)
 {
-       if(netname) {
-               if(!pidfilename)
-                       asprintf(&pidfilename, LOCALSTATEDIR "/run/tinc.%s.pid", netname);
-               if(!logfilename)
-                       asprintf(&logfilename, LOCALSTATEDIR "/log/tinc.%s.log", netname);
+       if(netname)
+               asprintf(&identname, "tinc.%s", netname);
+       else
+               identname = xstrdup("tinc");
+
+       if(!pidfilename)
+               asprintf(&pidfilename, LOCALSTATEDIR "/run/%s.pid", identname);
+
+       if(!logfilename)
+               asprintf(&logfilename, LOCALSTATEDIR "/log/%s.log", identname);
 
+       if(netname) {
                if(!confbase)
                        asprintf(&confbase, "%s/tinc/%s", CONFDIR, netname);
                else
                        logger(LOG_INFO, _("Both netname and configuration directory given, using the latter..."));
-
-               if(!identname)
-                       asprintf(&identname, "tinc.%s", netname);
        } else {
-               if(!pidfilename)
-                       pidfilename = LOCALSTATEDIR "/run/tinc.pid";
-               if(!logfilename)
-                       logfilename = LOCALSTATEDIR "/log/tinc.log";
-
                if(!confbase)
                        asprintf(&confbase, "%s/tinc", CONFDIR);
-
-               if(!identname)
-                       identname = "tinc";
        }
 }