X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprocess.c;h=33828bbc8f4ad0f55cf3e23730bb35b353e8a3af;hp=5d31b8d5fb2fc0910dc93b647f0c72f27aad3365;hb=b0ff879e7c68edd447328f3d806c1ad9e336fece;hpb=7fcc0c6415488ed6ce0089a67ab7cfdd5d0d83ca diff --git a/src/process.c b/src/process.c index 5d31b8d5..33828bbc 100644 --- a/src/process.c +++ b/src/process.c @@ -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.4 2000/11/17 10:03:02 guus Exp $ + $Id: process.c,v 1.1.2.13 2000/11/24 12:44:39 zarq Exp $ */ #include "config.h" @@ -31,7 +31,9 @@ #include #include #include +#include #include +#include #include #include @@ -40,11 +42,13 @@ #include "conf.h" #include "process.h" +#include "subnet.h" +#include "connection.h" #include "system.h" /* A list containing all our children */ -list_t *child_pids; +list_t *child_pids = NULL; /* If zero, don't detach from the terminal. */ int do_detach = 1; @@ -55,6 +59,13 @@ extern char *identname; extern char *pidfilename; extern char **g_argv; +void init_processes(void) +{ +cp + child_pids = list_new(); +cp +} + void memory_full(int size) { syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), size); @@ -62,11 +73,64 @@ void memory_full(int size) exit(1); } +/* Some functions the less gifted operating systems might lack... */ + +#ifndef HAVE_FCLOSEALL +int fcloseall(void) +{ + fflush(stdin); + fflush(stdout); + fflush(stderr); + fclose(stdin); + fclose(stdout); + fclose(stderr); +} +#endif + +int become_daemon(void) +{ + pid_t pid; + int fd; + + ppid = getpid(); + + if((pid = fork()) < 0) + { + perror("fork"); + return -1; + } + if(pid) /* parent process */ + { + signal(SIGTERM, parent_exit); + sleep(600); /* wait 10 minutes */ + exit(1); + } + + if((fd = open("/dev/tty", O_RDWR)) >= 0) + { + if(ioctl(fd, TIOCNOTTY, NULL)) + { + perror("ioctl"); + return -1; + } + close(fd); + } + + if(setsid() < 0) + return -1; + + kill(ppid, SIGTERM); + + chdir("/"); + fcloseall(); +} + /* Close network connections, and terminate neatly */ void cleanup_and_exit(int c) { +cp close_network_connections(); if(debug_lvl > DEBUG_NOTHING) @@ -84,7 +148,7 @@ void cleanup_and_exit(int c) int write_pidfile(void) { int pid; - +cp if((pid = check_pid(pidfilename))) { if(netname) @@ -98,7 +162,7 @@ int write_pidfile(void) /* if it's locked, write-protected, or whatever */ if(!write_pid(pidfilename)) return 1; - +cp return 0; } @@ -108,7 +172,7 @@ int write_pidfile(void) int kill_other(void) { int pid; - +cp if(!(pid = read_pid(pidfilename))) { if(netname) @@ -123,7 +187,7 @@ int kill_other(void) if(kill(pid, SIGTERM) && errno == ESRCH) fprintf(stderr, _("Removing stale lock file.\n")); remove_pid(pidfilename); - +cp return 0; } @@ -132,17 +196,16 @@ int kill_other(void) */ int detach(void) { - int fd; - pid_t pid; - +cp setup_signals(); + if(do_detach) + if(become_daemon() < 0) + return -1; + if(write_pidfile()) return -1; - if(do_detach) - daemon(0, 0); - openlog(identname, LOG_CONS | LOG_PID, LOG_DAEMON); if(debug_lvl > DEBUG_NOTHING) @@ -152,7 +215,7 @@ int detach(void) syslog(LOG_NOTICE, _("tincd %s starting"), VERSION); xalloc_fail_func = memory_full; - +cp return 0; } @@ -166,7 +229,9 @@ void _execute_script(const char *name) int error = 0; char *scriptname; char *s; - + int fd; + +cp if(netname) { asprintf(&s, "NETNAME=%s", netname); @@ -199,14 +264,20 @@ void _execute_script(const char *name) fcloseall(); /* Open standard input */ - if(open("/dev/null", O_RDONLY) < 0) + if((fd = open("/dev/null", O_RDONLY)) < 0) { syslog(LOG_ERR, _("Opening `/dev/null' failed: %m")); error = 1; } + if(dup2(fd, 0) != 0) + { + syslog(LOG_ERR, _("Couldn't assign /dev/null to standard input: %m")); + error = 1; + } if(!error) { + close(1); /* fd #1 should be the first available filedescriptor now. */ /* Standard output directly goes to syslog */ openlog(name, LOG_CONS | LOG_PID, LOG_DAEMON); /* Standard error as well */ @@ -237,7 +308,7 @@ void _execute_script(const char *name) int execute_script(const char *name) { pid_t pid; - +cp if((pid = fork()) < 0) { syslog(LOG_ERR, _("System call `%s' failed: %m"), @@ -247,10 +318,10 @@ int execute_script(const char *name) if(pid) { - list_append(child_pids, (void*)(int)pid); + list_append(child_pids, &pid); return 0; } - +cp /* Child here */ _execute_script(name); } @@ -264,7 +335,7 @@ int check_child(void *data) { pid_t pid; int status; - +cp pid = (pid_t) data; pid = waitpid(pid, &status, WNOHANG); if(WIFEXITED(status)) @@ -282,7 +353,7 @@ int check_child(void *data) } return -1; } - +cp /* Child is still running */ return 0; } @@ -365,7 +436,7 @@ sigint_handler(int a) RETSIGTYPE sigusr1_handler(int a) { - dump_conn_list(); + dump_connection_list(); } RETSIGTYPE