Add a new --syslog option for tincd.
[tinc] / src / tincd.c
index 5f1447e..c707f54 100644 (file)
@@ -1,7 +1,7 @@
 /*
     tincd.c -- the main file for tincd
     Copyright (C) 1998-2005 Ivo Timmermans
-                  2000-2013 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2014 Guus Sliepen <guus@tinc-vpn.org>
                   2008      Max Rijevski <maksuf@gmail.com>
                   2009      Michael Tokarev <mjt@tls.msk.ru>
                   2010      Julien Muchembled <jm@jmuchemb.eu>
@@ -83,6 +83,9 @@ static const char *switchuser = NULL;
 /* If nonzero, write log entries to a separate file. */
 bool use_logfile = false;
 
+/* If nonzero, use syslog instead of stderr in no-detach mode. */
+bool use_syslog = false;
+
 char **g_argv;                  /* a copy of the cmdline arguments */
 
 static int status = 1;
@@ -99,6 +102,7 @@ static struct option const long_options[] = {
        {"chroot", no_argument, NULL, 'R'},
        {"user", required_argument, NULL, 'U'},
        {"logfile", optional_argument, NULL, 4},
+       {"syslog", no_argument, NULL, 's'},
        {"pidfile", required_argument, NULL, 5},
        {"option", required_argument, NULL, 'o'},
        {NULL, 0, NULL, 0}
@@ -124,6 +128,7 @@ static void usage(bool status) {
                                "  -L, --mlock                   Lock tinc into main memory.\n"
 #endif
                                "      --logfile[=FILENAME]      Write log entries to a logfile.\n"
+                               "  -s  --syslog                  Use syslog instead of stderr with --no-detach.\n"
                                "      --pidfile=FILENAME        Write PID and control socket cookie to FILENAME.\n"
                                "      --bypass-security         Disables meta protocol security, for debugging.\n"
                                "  -o, --option[HOST.]KEY=VALUE  Set global/host configuration value.\n"
@@ -145,7 +150,7 @@ static bool parse_options(int argc, char **argv) {
 
        cmdline_conf = list_alloc((list_action_t)free_config);
 
-       while((r = getopt_long(argc, argv, "c:DLd::n:o:RU:", long_options, &option_index)) != EOF) {
+       while((r = getopt_long(argc, argv, "c:DLd::n:so:RU:", long_options, &option_index)) != EOF) {
                switch (r) {
                        case 0:   /* long option */
                                break;
@@ -180,6 +185,10 @@ static bool parse_options(int argc, char **argv) {
                                netname = xstrdup(optarg);
                                break;
 
+                       case 's': /* syslog */
+                               use_syslog = true;
+                               break;
+
                        case 'o': /* option */
                                cfg = parse_config_line(optarg, NULL, ++lineno);
                                if (!cfg)
@@ -321,7 +330,7 @@ int main(int argc, char **argv) {
        if(show_version) {
                printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
                           VERSION, __DATE__, __TIME__, PROT_MAJOR, PROT_MINOR);
-               printf("Copyright (C) 1998-2012 Ivo Timmermans, Guus Sliepen and others.\n"
+               printf("Copyright (C) 1998-2014 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"
@@ -400,14 +409,7 @@ int main2(int argc, char **argv) {
        /* Setup sockets and open device. */
 
        if(!setup_network())
-               goto end_nonet;
-
-       if(!init_control())
-               goto end_nonet;
-
-       /* Initiate all outgoing connections. */
-
-       try_outgoing_connections();
+               goto end;
 
        /* Change process priority */
 
@@ -439,19 +441,17 @@ int main2(int argc, char **argv) {
 
        /* Start main loop. It only exits when tinc is killed. */
 
-       status = main_loop();
+       logger(DEBUG_ALWAYS, LOG_NOTICE, "Ready");
 
-       /* Shutdown properly. */
+       try_outgoing_connections();
 
-       if(debug_level >= DEBUG_CONNECTIONS)
-               devops.dump_stats();
+       status = main_loop();
 
-       close_network_connections();
+       /* Shutdown properly. */
 
 end:
-       exit_control();
+       close_network_connections();
 
-end_nonet:
        logger(DEBUG_ALWAYS, LOG_NOTICE, "Terminating");
 
        free(priority);