X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprocess.c;h=9194bedf73cbfd0b8701ee9233078b862c41268f;hp=35296f041b8a18f1b37f7599ee000d57b2a6b2a7;hb=6411e0d8bda8abc2cef87ca852255502f9bb03d0;hpb=5ac4179df66747a7013a10d576c23531d2b4fc58 diff --git a/src/process.c b/src/process.c index 35296f04..9194bedf 100644 --- a/src/process.c +++ b/src/process.c @@ -1,7 +1,7 @@ /* process.c -- process management functions - Copyright (C) 1999-2003 Ivo Timmermans , - 2000-2003 Guus Sliepen + Copyright (C) 1999-2004 Ivo Timmermans , + 2000-2004 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.73 2003/08/17 12:05:08 guus Exp $ + $Id$ */ #include "system.h" @@ -58,19 +58,6 @@ static void memory_full(int size) /* Some functions the less gifted operating systems might lack... */ -#ifndef HAVE_FCLOSEALL -static int fcloseall(void) -{ - fflush(stdin); - fflush(stdout); - fflush(stderr); - fclose(stdin); - fclose(stdout); - fclose(stderr); - return 0; -} -#endif - #ifdef HAVE_MINGW extern char *identname; extern char *program_name; @@ -82,7 +69,7 @@ static SERVICE_STATUS status = {0}; static SERVICE_STATUS_HANDLE statushandle = 0; bool install_service(void) { - char command[4096] = ""; + char command[4096] = "\""; char **argp; bool space; SERVICE_DESCRIPTION description = {"Virtual Private Network daemon"}; @@ -93,10 +80,8 @@ bool install_service(void) { return false; } - strncat(command, "\"", sizeof(command)); - if(!strchr(program_name, '\\')) { - GetCurrentDirectory(sizeof(command), command); + GetCurrentDirectory(sizeof(command) - 1, command + 1); strncat(command, "\\", sizeof(command)); } @@ -256,7 +241,7 @@ bool init_service(void) { */ static bool write_pidfile(void) { - int pid; + pid_t pid; cp(); @@ -264,16 +249,18 @@ static bool write_pidfile(void) if(pid) { if(netname) - fprintf(stderr, _("A tincd is already running for net `%s' with pid %d.\n"), - netname, pid); + fprintf(stderr, _("A tincd is already running for net `%s' with pid %ld.\n"), + netname, (long)pid); else - fprintf(stderr, _("A tincd is already running with pid %d.\n"), pid); + fprintf(stderr, _("A tincd is already running with pid %ld.\n"), (long)pid); return false; } /* if it's locked, write-protected, or whatever */ - if(!write_pid(pidfilename)) + if(!write_pid(pidfilename)) { + fprintf(stderr, _("Could write pid file %s: %s\n"), pidfilename, strerror(errno)); return false; + } return true; } @@ -285,7 +272,7 @@ static bool write_pidfile(void) bool kill_other(int signal) { #ifndef HAVE_MINGW - int pid; + pid_t pid; cp(); @@ -350,8 +337,10 @@ bool detach(void) /* Now UPDATE the pid in the pidfile, because we changed it... */ - if(!write_pid(pidfilename)) + if(!write_pid(pidfilename)) { + fprintf(stderr, _("Could not write pid file %s: %s\n"), pidfilename, strerror(errno)); return false; + } #else if(!statushandle) exit(install_service()); @@ -373,7 +362,8 @@ bool execute_script(const char *name, char **envp) #ifdef HAVE_SYSTEM int status, len; struct stat s; - char *scriptname; + char *scriptname, *p; + int i; cp(); @@ -397,8 +387,8 @@ bool execute_script(const char *name, char **envp) #ifdef HAVE_PUTENV /* Set environment */ - while(*envp) - putenv(*envp++); + for(i = 0; envp[i]; i++) + putenv(envp[i]); #endif scriptname[len - 1] = '\"'; @@ -406,7 +396,17 @@ bool execute_script(const char *name, char **envp) free(scriptname); - /* Unset environment? */ + /* Unset environment */ + + for(i = 0; envp[i]; i++) { + char *e = strchr(envp[i], '='); + if(e) { + p = alloca(e - envp[i] + 1); + strncpy(p, envp[i], e - envp[i]); + p[e - envp[i]] = '\0'; + putenv(p); + } + } #ifdef WEXITSTATUS if(status != -1) { @@ -442,13 +442,19 @@ bool execute_script(const char *name, char **envp) static RETSIGTYPE sigterm_handler(int a) { logger(LOG_NOTICE, _("Got %s signal"), "TERM"); - running = false; + if(running) + running = false; + else + exit(1); } static RETSIGTYPE sigquit_handler(int a) { logger(LOG_NOTICE, _("Got %s signal"), "QUIT"); - running = false; + if(running) + running = false; + else + exit(1); } static RETSIGTYPE fatal_signal_square(int a)