X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprocess.c;h=326d3ff915f3e28328740da9464a08a6b3749311;hp=46a8de8d7543bf61d0ec44f5a98ed3bb37697cd4;hb=5db596c6844169f1eb5f804b72abe99d067aaa5a;hpb=6f9f6779e6bd1dd7bb795b42dad550863a386ca8 diff --git a/src/process.c b/src/process.c index 46a8de8d..326d3ff9 100644 --- a/src/process.c +++ b/src/process.c @@ -1,7 +1,7 @@ /* process.c -- process management functions - Copyright (C) 1999-2002 Ivo Timmermans , - 2000-2002 Guus Sliepen + Copyright (C) 1999-2003 Ivo Timmermans , + 2000-2003 Guus Sliepen 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 @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: process.c,v 1.1.2.47 2002/09/09 22:32:49 guus Exp $ + $Id: process.c,v 1.1.2.54 2003/07/12 17:41:46 guus Exp $ */ #include "config.h" @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -46,6 +45,7 @@ #include "device.h" #include "connection.h" #include "device.h" +#include "logger.h" #include "system.h" @@ -55,18 +55,19 @@ int do_detach = 1; extern char *identname; extern char *pidfilename; extern char **g_argv; +extern int use_logfile; sigset_t emptysigset; -static int saved_debug_lvl = 0; +static int saved_debug_level = -1; extern int sighup; extern int sigalrm; extern int do_purge; -void memory_full(int size) +static void memory_full(int size) { - syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exitting."), size); + logger(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exitting."), size); cp_trace(); exit(1); } @@ -74,7 +75,7 @@ void memory_full(int size) /* Some functions the less gifted operating systems might lack... */ #ifndef HAVE_FCLOSEALL -int fcloseall(void) +static int fcloseall(void) { fflush(stdin); fflush(stdout); @@ -95,10 +96,10 @@ void cleanup_and_exit(int c) close_network_connections(); - if(debug_lvl > DEBUG_NOTHING) + ifdebug(CONNECTIONS) dump_device_stats(); - syslog(LOG_NOTICE, _("Terminating")); + logger(LOG_NOTICE, _("Terminating")); closelog(); exit(c); @@ -107,7 +108,7 @@ void cleanup_and_exit(int c) /* check for an existing tinc for this net, and write pid to pidfile */ -int write_pidfile(void) +static int write_pidfile(void) { int pid; @@ -199,13 +200,10 @@ int detach(void) return -1; } - openlog(identname, LOG_CONS | LOG_PID, LOG_DAEMON); + openlogger(identname, use_logfile?LOGMODE_FILE:(do_detach?LOGMODE_SYSLOG:LOGMODE_STDERR)); - if(debug_lvl > DEBUG_NOTHING) - syslog(LOG_NOTICE, _("tincd %s (%s %s) starting, debug level %d"), - VERSION, __DATE__, __TIME__, debug_lvl); - else - syslog(LOG_NOTICE, _("tincd %s starting"), VERSION); + logger(LOG_NOTICE, _("tincd %s (%s %s) starting, debug level %d"), + VERSION, __DATE__, __TIME__, debug_level); xalloc_fail_func = memory_full; @@ -213,14 +211,13 @@ int detach(void) } /* - Execute the program name, with sane environment. All output will be - redirected to syslog. + Execute the program name, with sane environment. */ -void _execute_script(const char *scriptname, char **envp) +static void _execute_script(const char *scriptname, char **envp) __attribute__ ((noreturn)); -void _execute_script(const char *scriptname, char **envp) +static void _execute_script(const char *scriptname, char **envp) { - char *s; + int save_errno; cp(); @@ -229,17 +226,20 @@ void _execute_script(const char *scriptname, char **envp) chdir("/"); + closelogger(); + /* Close all file descriptors */ - closelog(); /* <- this means we cannot use syslog() here anymore! */ fcloseall(); execl(scriptname, NULL); /* No return on success */ - openlog("tinc", LOG_CONS | LOG_PID, LOG_DAEMON); - syslog(LOG_ERR, _("Could not execute `%s': %s"), scriptname, - strerror(errno)); - exit(errno); + save_errno = errno; + + openlogger(identname, use_logfile?LOGMODE_FILE:(do_detach?LOGMODE_SYSLOG:LOGMODE_STDERR)); + logger(LOG_ERR, _("Could not execute `%s': %s"), scriptname, + strerror(save_errno)); + exit(save_errno); } /* @@ -264,40 +264,41 @@ int execute_script(const char *name, char **envp) pid = fork(); if(pid < 0) { - syslog(LOG_ERR, _("System call `%s' failed: %s"), "fork", + logger(LOG_ERR, _("System call `%s' failed: %s"), "fork", strerror(errno)); return -1; } if(pid) { - if(debug_lvl >= DEBUG_STATUS) - syslog(LOG_INFO, _("Executing script %s"), name); + ifdebug(STATUS) logger(LOG_INFO, _("Executing script %s"), name); free(scriptname); if(waitpid(pid, &status, 0) == pid) { if(WIFEXITED(status)) { /* Child exited by itself */ if(WEXITSTATUS(status)) { - syslog(LOG_ERR, _("Process %d (%s) exited with non-zero status %d"), + logger(LOG_ERR, _("Process %d (%s) exited with non-zero status %d"), pid, name, WEXITSTATUS(status)); return -1; } else return 0; } else if(WIFSIGNALED(status)) { /* Child was killed by a signal */ - syslog(LOG_ERR, _("Process %d (%s) was killed by signal %d (%s)"), pid, + logger(LOG_ERR, _("Process %d (%s) was killed by signal %d (%s)"), pid, name, WTERMSIG(status), strsignal(WTERMSIG(status))); return -1; } else { /* Something strange happened */ - - syslog(LOG_ERR, _("Process %d (%s) terminated abnormally"), pid, + logger(LOG_ERR, _("Process %d (%s) terminated abnormally"), pid, name); return -1; } - } else { - syslog(LOG_ERR, _("System call `%s' failed: %s"), "waitpid", + } else if (errno != EINTR) { + logger(LOG_ERR, _("System call `%s' failed: %s"), "waitpid", strerror(errno)); return -1; } + + /* Why do we get EINTR? */ + return 0; } /* Child here */ @@ -310,37 +311,35 @@ int execute_script(const char *name, char **envp) Signal handlers. */ -RETSIGTYPE sigterm_handler(int a) +static RETSIGTYPE sigterm_handler(int a) { - if(debug_lvl > DEBUG_NOTHING) - syslog(LOG_NOTICE, _("Got TERM signal")); + logger(LOG_NOTICE, _("Got TERM signal")); cleanup_and_exit(0); } -RETSIGTYPE sigquit_handler(int a) +static RETSIGTYPE sigquit_handler(int a) { - if(debug_lvl > DEBUG_NOTHING) - syslog(LOG_NOTICE, _("Got QUIT signal")); + logger(LOG_NOTICE, _("Got QUIT signal")); cleanup_and_exit(0); } -RETSIGTYPE fatal_signal_square(int a) +static RETSIGTYPE fatal_signal_square(int a) { - syslog(LOG_ERR, _("Got another fatal signal %d (%s): not restarting."), a, + logger(LOG_ERR, _("Got another fatal signal %d (%s): not restarting."), a, strsignal(a)); cp_trace(); exit(1); } -RETSIGTYPE fatal_signal_handler(int a) +static RETSIGTYPE fatal_signal_handler(int a) { struct sigaction act; - syslog(LOG_ERR, _("Got fatal signal %d (%s)"), a, strsignal(a)); + logger(LOG_ERR, _("Got fatal signal %d (%s)"), a, strsignal(a)); cp_trace(); if(do_detach) { - syslog(LOG_NOTICE, _("Trying to re-execute in 5 seconds...")); + logger(LOG_NOTICE, _("Trying to re-execute in 5 seconds...")); act.sa_handler = fatal_signal_square; act.sa_mask = emptysigset; @@ -352,48 +351,45 @@ RETSIGTYPE fatal_signal_handler(int a) remove_pid(pidfilename); execvp(g_argv[0], g_argv); } else { - syslog(LOG_NOTICE, _("Not restarting.")); + logger(LOG_NOTICE, _("Not restarting.")); exit(1); } } -RETSIGTYPE sighup_handler(int a) +static RETSIGTYPE sighup_handler(int a) { - if(debug_lvl > DEBUG_NOTHING) - syslog(LOG_NOTICE, _("Got HUP signal")); + logger(LOG_NOTICE, _("Got HUP signal")); sighup = 1; } -RETSIGTYPE sigint_handler(int a) +static RETSIGTYPE sigint_handler(int a) { - if(saved_debug_lvl) { - syslog(LOG_NOTICE, _("Reverting to old debug level (%d)"), - saved_debug_lvl); - debug_lvl = saved_debug_lvl; - saved_debug_lvl = 0; + if(saved_debug_level != -1) { + logger(LOG_NOTICE, _("Reverting to old debug level (%d)"), + saved_debug_level); + debug_level = saved_debug_level; + saved_debug_level = -1; } else { - syslog(LOG_NOTICE, - _ - ("Temporarily setting debug level to 5. Kill me with SIGINT again to go back to level %d."), - debug_lvl); - saved_debug_lvl = debug_lvl; - debug_lvl = 5; + logger(LOG_NOTICE, + _("Temporarily setting debug level to 5. Kill me with SIGINT again to go back to level %d."), + debug_level); + saved_debug_level = debug_level; + debug_level = 5; } } -RETSIGTYPE sigalrm_handler(int a) +static RETSIGTYPE sigalrm_handler(int a) { - if(debug_lvl > DEBUG_NOTHING) - syslog(LOG_NOTICE, _("Got ALRM signal")); + logger(LOG_NOTICE, _("Got ALRM signal")); sigalrm = 1; } -RETSIGTYPE sigusr1_handler(int a) +static RETSIGTYPE sigusr1_handler(int a) { dump_connections(); } -RETSIGTYPE sigusr2_handler(int a) +static RETSIGTYPE sigusr2_handler(int a) { dump_device_stats(); dump_nodes(); @@ -401,27 +397,24 @@ RETSIGTYPE sigusr2_handler(int a) dump_subnets(); } -RETSIGTYPE sigwinch_handler(int a) +static RETSIGTYPE sigwinch_handler(int a) { extern int do_purge; do_purge = 1; } -RETSIGTYPE unexpected_signal_handler(int a) +static RETSIGTYPE unexpected_signal_handler(int a) { - syslog(LOG_WARNING, _("Got unexpected signal %d (%s)"), a, strsignal(a)); + logger(LOG_WARNING, _("Got unexpected signal %d (%s)"), a, strsignal(a)); cp_trace(); } -RETSIGTYPE ignore_signal_handler(int a) +static RETSIGTYPE ignore_signal_handler(int a) { - if(debug_lvl >= DEBUG_SCARY_THINGS) { - syslog(LOG_DEBUG, _("Ignored signal %d (%s)"), a, strsignal(a)); - cp_trace(); - } + ifdebug(SCARY_THINGS) logger(LOG_DEBUG, _("Ignored signal %d (%s)"), a, strsignal(a)); } -struct { +static struct { int signal; void (*handler)(int); } sighandlers[] = { @@ -471,9 +464,7 @@ void setup_signals(void) for(i = 0; sighandlers[i].signal; i++) { act.sa_handler = sighandlers[i].handler; if(sigaction(sighandlers[i].signal, &act, NULL) < 0) - fprintf(stderr, - _ - ("Installing signal handler for signal %d (%s) failed: %s\n"), + fprintf(stderr, _("Installing signal handler for signal %d (%s) failed: %s\n"), sighandlers[i].signal, strsignal(sighandlers[i].signal), strerror(errno)); }