Merge remote-tracking branch 'seehuhn/1.1' into 1.1
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 14 Mar 2015 11:45:55 +0000 (11:45 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 14 Mar 2015 11:45:55 +0000 (11:45 +0000)
1  2 
src/process.c
src/tincd.c

diff --combined src/process.c
@@@ -34,7 -34,6 +34,7 @@@
  #include "subnet.h"
  #include "utils.h"
  #include "xalloc.h"
 +#include "version.h"
  
  /* If zero, don't detach from the terminal. */
  bool do_detach = true;
@@@ -42,6 -41,7 +42,7 @@@ bool sigalrm = false
  
  extern char **g_argv;
  extern bool use_logfile;
+ extern bool use_syslog;
  
  /* Some functions the less gifted operating systems might lack... */
  
@@@ -109,8 -109,6 +110,8 @@@ static bool install_service(void) 
        return true;
  }
  
 +io_t stop_io;
 +
  DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID boe, LPVOID bah) {
        switch(request) {
                case SERVICE_CONTROL_INTERROGATE:
                        return ERROR_CALL_NOT_IMPLEMENTED;
        }
  
 -      event_exit();
 -      status.dwWaitHint = 30000;
 +      status.dwWaitHint = 1000;
        status.dwCurrentState = SERVICE_STOP_PENDING;
        SetServiceStatus(statushandle, &status);
 +      if (WSASetEvent(stop_io.event) == FALSE)
 +              abort();
        return NO_ERROR;
  }
  
@@@ -189,6 -186,8 +190,8 @@@ bool init_service(void) 
    Detach from current terminal
  */
  bool detach(void) {
+       logmode_t logmode;
  #ifndef HAVE_MINGW
        signal(SIGPIPE, SIG_IGN);
        signal(SIGUSR1, SIG_IGN);
  #endif
        }
  
-       openlogger(identname, use_logfile?LOGMODE_FILE:(do_detach?LOGMODE_SYSLOG:LOGMODE_STDERR));
+       logmode = use_logfile?LOGMODE_FILE:LOGMODE_SYSLOG;
+       if(do_detach && !use_syslog)
+               logmode = LOGMODE_STDERR;
+       openlogger(identname, logmode);
  
        logger(DEBUG_ALWAYS, LOG_NOTICE, "tincd %s (%s %s) starting, debug level %d",
 -                         VERSION, __DATE__, __TIME__, debug_level);
 +                         VERSION, BUILD_DATE, BUILD_TIME, debug_level);
  
        return true;
  }
diff --combined src/tincd.c
@@@ -49,7 -49,6 +49,7 @@@
  #include "control.h"
  #include "crypto.h"
  #include "device.h"
 +#include "event.h"
  #include "logger.h"
  #include "names.h"
  #include "net.h"
@@@ -58,7 -57,6 +58,7 @@@
  #include "protocol.h"
  #include "utils.h"
  #include "xalloc.h"
 +#include "version.h"
  
  /* If nonzero, display usage information and exit. */
  static bool show_help = false;
@@@ -85,6 -83,9 +85,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;
@@@ -101,6 -102,7 +104,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}
  
  #ifdef HAVE_MINGW
  static struct WSAData wsa_state;
 -CRITICAL_SECTION mutex;
  int main2(int argc, char **argv);
  #endif
  
@@@ -125,6 -128,7 +129,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"
@@@ -146,7 -150,7 +151,7 @@@ static bool parse_options(int argc, cha
  
        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;
                                netname = xstrdup(optarg);
                                break;
  
+                       case 's': /* syslog */
+                               use_syslog = true;
+                               break;
                        case 'o': /* option */
                                cfg = parse_config_line(optarg, NULL, ++lineno);
                                if (!cfg)
@@@ -304,17 -312,6 +313,17 @@@ static bool drop_privs(void) 
  
  #ifdef HAVE_MINGW
  # define setpriority(level) !SetPriorityClass(GetCurrentProcess(), (level))
 +
 +static void stop_handler(void *data, int flags) {
 +      event_exit();
 +}
 +
 +static BOOL WINAPI console_ctrl_handler(DWORD type) {
 +      logger(DEBUG_ALWAYS, LOG_NOTICE, "Got console shutdown request");
 +      if (WSASetEvent(stop_io.event) == FALSE)
 +              abort();
 +      return TRUE;
 +}
  #else
  # define NORMAL_PRIORITY_CLASS 0
  # define BELOW_NORMAL_PRIORITY_CLASS 10
@@@ -332,7 -329,7 +341,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);
 +                         VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
                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"
  #endif
  
  #ifdef HAVE_MINGW
 -      if(!do_detach || !init_service())
 -              return main2(argc, argv);
 -      else
 -              return 1;
 +      io_add_event(&stop_io, stop_handler, NULL, WSACreateEvent());
 +      if (stop_io.event == FALSE)
 +              abort();
 +
 +      int result;
 +      if(!do_detach || !init_service()) {
 +              SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
 +              result = main2(argc, argv);
 +      } else
 +              result = 1;
 +
 +      if (WSACloseEvent(stop_io.event) == FALSE)
 +              abort();
 +      io_del(&stop_io);
 +      return result;
  }
  
  int main2(int argc, char **argv) {
 -      InitializeCriticalSection(&mutex);
 -      EnterCriticalSection(&mutex);
  #endif
        char *priority = NULL;