X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fprocess.c;h=dcc6cb334a5b764fadb4fc17e97cb45a74c51fe7;hb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219;hp=9194bedf73cbfd0b8701ee9233078b862c41268f;hpb=6411e0d8bda8abc2cef87ca852255502f9bb03d0;p=tinc diff --git a/src/process.c b/src/process.c index 9194bedf..dcc6cb33 100644 --- a/src/process.c +++ b/src/process.c @@ -1,7 +1,7 @@ /* process.c -- process management functions - Copyright (C) 1999-2004 Ivo Timmermans , - 2000-2004 Guus Sliepen + Copyright (C) 1999-2005 Ivo Timmermans, + 2000-2006 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 @@ -36,21 +36,18 @@ /* If zero, don't detach from the terminal. */ bool do_detach = true; -bool sighup = false; bool sigalrm = false; extern char *identname; extern char *pidfilename; extern char **g_argv; extern bool use_logfile; -extern volatile bool running; sigset_t emptysigset; static int saved_debug_level = -1; -static void memory_full(int size) -{ +static void memory_full(int size) { logger(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exitting."), size); cp_trace(); exit(1); @@ -81,30 +78,30 @@ bool install_service(void) { } if(!strchr(program_name, '\\')) { - GetCurrentDirectory(sizeof(command) - 1, command + 1); - strncat(command, "\\", sizeof(command)); + GetCurrentDirectory(sizeof command - 1, command + 1); + strncat(command, "\\", sizeof command - strlen(command)); } - strncat(command, program_name, sizeof(command)); + strncat(command, program_name, sizeof command - strlen(command)); - strncat(command, "\"", sizeof(command)); + strncat(command, "\"", sizeof command - strlen(command)); for(argp = g_argv + 1; *argp; argp++) { space = strchr(*argp, ' '); - strncat(command, " ", sizeof(command)); + strncat(command, " ", sizeof command - strlen(command)); if(space) - strncat(command, "\"", sizeof(command)); + strncat(command, "\"", sizeof command - strlen(command)); - strncat(command, *argp, sizeof(command)); + strncat(command, *argp, sizeof command - strlen(command)); if(space) - strncat(command, "\"", sizeof(command)); + strncat(command, "\"", sizeof command - strlen(command)); } service = CreateService(manager, identname, identname, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, - command, "NDIS", NULL, NULL, NULL, NULL); + command, NULL, NULL, NULL, NULL, NULL); if(!service) { logger(LOG_ERR, _("Could not create %s service: %s"), identname, winerror(GetLastError())); @@ -165,23 +162,14 @@ DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID boe, LPVOID bah) { return ERROR_CALL_NOT_IMPLEMENTED; } - if(running) { - running = false; - status.dwWaitHint = 30000; - status.dwCurrentState = SERVICE_STOP_PENDING; - SetServiceStatus(statushandle, &status); - return NO_ERROR; - } else { - status.dwWaitHint = 0; - status.dwCurrentState = SERVICE_STOPPED; - SetServiceStatus(statushandle, &status); - exit(1); - } - + event_loopexit(NULL); + status.dwWaitHint = 30000; + status.dwCurrentState = SERVICE_STOP_PENDING; + SetServiceStatus(statushandle, &status); + return NO_ERROR; } -VOID WINAPI run_service(DWORD argc, LPTSTR* argv) -{ +VOID WINAPI run_service(DWORD argc, LPTSTR* argv) { int err = 1; extern int main2(int argc, char **argv); @@ -239,8 +227,7 @@ bool init_service(void) { /* check for an existing tinc for this net, and write pid to pidfile */ -static bool write_pidfile(void) -{ +static bool write_pidfile(void) { pid_t pid; cp(); @@ -269,8 +256,7 @@ static bool write_pidfile(void) /* kill older tincd for this net */ -bool kill_other(int signal) -{ +bool kill_other(int signal) { #ifndef HAVE_MINGW pid_t pid; @@ -310,8 +296,7 @@ bool kill_other(int signal) /* Detach from current terminal, write pidfile, kill parent */ -bool detach(void) -{ +bool detach(void) { cp(); setup_signals(); @@ -357,8 +342,7 @@ bool detach(void) return true; } -bool execute_script(const char *name, char **envp) -{ +bool execute_script(const char *name, char **envp) { #ifdef HAVE_SYSTEM int status, len; struct stat s; @@ -379,8 +363,10 @@ bool execute_script(const char *name, char **envp) /* First check if there is a script */ - if(stat(scriptname + 1, &s)) + if(stat(scriptname + 1, &s)) { + free(scriptname); return true; + } ifdebug(STATUS) logger(LOG_INFO, _("Executing script %s"), name); @@ -439,34 +425,14 @@ bool execute_script(const char *name, char **envp) */ #ifndef HAVE_MINGW -static RETSIGTYPE sigterm_handler(int a) -{ - logger(LOG_NOTICE, _("Got %s signal"), "TERM"); - if(running) - running = false; - else - exit(1); -} - -static RETSIGTYPE sigquit_handler(int a) -{ - logger(LOG_NOTICE, _("Got %s signal"), "QUIT"); - if(running) - running = false; - else - exit(1); -} - -static RETSIGTYPE fatal_signal_square(int a) -{ +static RETSIGTYPE fatal_signal_square(int a) { logger(LOG_ERR, _("Got another fatal signal %d (%s): not restarting."), a, strsignal(a)); cp_trace(); exit(1); } -static RETSIGTYPE fatal_signal_handler(int a) -{ +static RETSIGTYPE fatal_signal_handler(int a) { struct sigaction act; logger(LOG_ERR, _("Got fatal signal %d (%s)"), a, strsignal(a)); cp_trace(); @@ -489,62 +455,12 @@ static RETSIGTYPE fatal_signal_handler(int a) } } -static RETSIGTYPE sighup_handler(int a) -{ - logger(LOG_NOTICE, _("Got %s signal"), "HUP"); - sighup = true; -} - -static RETSIGTYPE sigint_handler(int a) -{ - logger(LOG_NOTICE, _("Got %s signal"), "INT"); - - 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 { - 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; - } -} - -static RETSIGTYPE sigalrm_handler(int a) -{ - logger(LOG_NOTICE, _("Got %s signal"), "ALRM"); - sigalrm = true; -} - -static RETSIGTYPE sigusr1_handler(int a) -{ - dump_connections(); -} - -static RETSIGTYPE sigusr2_handler(int a) -{ - dump_device_stats(); - dump_nodes(); - dump_edges(); - dump_subnets(); -} - -static RETSIGTYPE sigwinch_handler(int a) -{ - do_purge = true; -} - -static RETSIGTYPE unexpected_signal_handler(int a) -{ +static RETSIGTYPE unexpected_signal_handler(int a) { logger(LOG_WARNING, _("Got unexpected signal %d (%s)"), a, strsignal(a)); cp_trace(); } -static RETSIGTYPE ignore_signal_handler(int a) -{ +static RETSIGTYPE ignore_signal_handler(int a) { ifdebug(SCARY_THINGS) logger(LOG_DEBUG, _("Ignored signal %d (%s)"), a, strsignal(a)); } @@ -552,25 +468,16 @@ static struct { int signal; void (*handler)(int); } sighandlers[] = { - {SIGHUP, sighup_handler}, - {SIGTERM, sigterm_handler}, - {SIGQUIT, sigquit_handler}, {SIGSEGV, fatal_signal_handler}, {SIGBUS, fatal_signal_handler}, {SIGILL, fatal_signal_handler}, {SIGPIPE, ignore_signal_handler}, - {SIGINT, sigint_handler}, - {SIGUSR1, sigusr1_handler}, - {SIGUSR2, sigusr2_handler}, {SIGCHLD, ignore_signal_handler}, - {SIGALRM, sigalrm_handler}, - {SIGWINCH, sigwinch_handler}, {0, NULL} }; #endif -void setup_signals(void) -{ +void setup_signals(void) { #ifndef HAVE_MINGW int i; struct sigaction act; @@ -592,7 +499,7 @@ void setup_signals(void) /* If we didn't detach, allow coredumps */ if(!do_detach) - sighandlers[3].handler = SIG_DFL; + sighandlers[0].handler = SIG_DFL; /* Then, for each known signal that we want to catch, assign a handler to the signal, with error checking this time. */