X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprocess.c;h=5d31b8d5fb2fc0910dc93b647f0c72f27aad3365;hp=f221a9aa1c17537c67504fd7bfde9859ebb11dcc;hb=7fcc0c6415488ed6ce0089a67ab7cfdd5d0d83ca;hpb=2764532ea72200d0a27ad2d79e6e299c00c62404 diff --git a/src/process.c b/src/process.c index f221a9aa..5d31b8d5 100644 --- a/src/process.c +++ b/src/process.c @@ -17,12 +17,31 @@ 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.1 2000/11/16 17:54:28 zarq Exp $ + $Id: process.c,v 1.1.2.4 2000/11/17 10:03:02 guus Exp $ */ #include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include +#include +#include +#include + +#include "conf.h" +#include "process.h" + +#include "system.h" /* A list containing all our children */ list_t *child_pids; @@ -30,6 +49,84 @@ list_t *child_pids; /* If zero, don't detach from the terminal. */ int do_detach = 1; +static pid_t ppid; + +extern char *identname; +extern char *pidfilename; +extern char **g_argv; + +void memory_full(int size) +{ + syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), size); + cp_trace(); + exit(1); +} + +/* + Close network connections, and terminate neatly +*/ +void cleanup_and_exit(int c) +{ + close_network_connections(); + + if(debug_lvl > DEBUG_NOTHING) + syslog(LOG_INFO, _("Total bytes written: tap %d, socket %d; bytes read: tap %d, socket %d"), + total_tap_out, total_socket_out, total_tap_in, total_socket_in); + + closelog(); + kill(ppid, SIGTERM); + exit(c); +} + +/* + check for an existing tinc for this net, and write pid to pidfile +*/ +int write_pidfile(void) +{ + int pid; + + if((pid = check_pid(pidfilename))) + { + if(netname) + fprintf(stderr, _("A tincd is already running for net `%s' with pid %d.\n"), + netname, pid); + else + fprintf(stderr, _("A tincd is already running with pid %d.\n"), pid); + return 1; + } + + /* if it's locked, write-protected, or whatever */ + if(!write_pid(pidfilename)) + return 1; + + return 0; +} + +/* + kill older tincd for this net +*/ +int kill_other(void) +{ + int pid; + + if(!(pid = read_pid(pidfilename))) + { + if(netname) + fprintf(stderr, _("No other tincd is running for net `%s'.\n"), netname); + else + fprintf(stderr, _("No other tincd is running.\n")); + return 1; + } + + errno = 0; /* No error, sometimes errno is only changed on error */ + /* ESRCH is returned when no process with that pid is found */ + if(kill(pid, SIGTERM) && errno == ESRCH) + fprintf(stderr, _("Removing stale lock file.\n")); + remove_pid(pidfilename); + + return 0; +} + /* Detach from current terminal, write pidfile, kill parent */ @@ -38,45 +135,13 @@ int detach(void) int fd; pid_t pid; - if(do_detach) - { - ppid = getpid(); + setup_signals(); - if((pid = fork()) < 0) - { - perror("fork"); - return -1; - } - if(pid) /* parent process */ - { - signal(SIGTERM, parent_exit); - sleep(600); /* wait 10 minutes */ - exit(1); - } - } - if(write_pidfile()) return -1; if(do_detach) - { - 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("/"); /* avoid keeping a mointpoint busy */ + daemon(0, 0); openlog(identname, LOG_CONS | LOG_PID, LOG_DAEMON); @@ -95,12 +160,12 @@ int detach(void) Execute the program name, with sane environment. All output will be redirected to syslog. */ +void _execute_script(const char *name) __attribute__ ((noreturn)); void _execute_script(const char *name) { int error = 0; char *scriptname; char *s; - int fd; if(netname) { @@ -182,12 +247,11 @@ int execute_script(const char *name) if(pid) { - list_append(child_pids, pid); + list_append(child_pids, (void*)(int)pid); return 0; } /* Child here */ - _execute_script(name); } @@ -232,7 +296,6 @@ void check_children(void) } - /* Signal handlers. */