X-Git-Url: https://git.librecmc.org/?p=oweals%2Ftinc.git;a=blobdiff_plain;f=src%2Fprocess.c;h=264b21dc349345ada752b398aa3e6cfbac315a1a;hp=f221a9aa1c17537c67504fd7bfde9859ebb11dcc;hb=785684f0ec5c9250788b4b32c0eab3f358c9db61;hpb=2764532ea72200d0a27ad2d79e6e299c00c62404 diff --git a/src/process.c b/src/process.c index f221a9a..264b21d 100644 --- a/src/process.c +++ b/src/process.c @@ -17,19 +17,124 @@ 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.9 2000/11/22 17:49:16 zarq 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; +list_t *child_pids = NULL; /* 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 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); + cp_trace(); + exit(1); +} + +/* + Close network connections, and terminate neatly +*/ +void cleanup_and_exit(int c) +{ +cp + 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; +cp + 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; +cp + return 0; +} + +/* + kill older tincd for this net +*/ +int kill_other(void) +{ + int pid; +cp + 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); +cp + return 0; +} + /* Detach from current terminal, write pidfile, kill parent */ @@ -37,46 +142,14 @@ int detach(void) { int fd; pid_t pid; +cp + setup_signals(); - if(do_detach) - { - 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(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); @@ -87,7 +160,7 @@ int detach(void) syslog(LOG_NOTICE, _("tincd %s starting"), VERSION); xalloc_fail_func = memory_full; - +cp return 0; } @@ -95,13 +168,15 @@ 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; - + +cp if(netname) { asprintf(&s, "NETNAME=%s", netname); @@ -134,14 +209,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 */ @@ -172,7 +253,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"), @@ -182,12 +263,11 @@ int execute_script(const char *name) if(pid) { - list_append(child_pids, pid); + list_append(child_pids, &pid); return 0; } - +cp /* Child here */ - _execute_script(name); } @@ -200,7 +280,7 @@ int check_child(void *data) { pid_t pid; int status; - +cp pid = (pid_t) data; pid = waitpid(pid, &status, WNOHANG); if(WIFEXITED(status)) @@ -218,7 +298,7 @@ int check_child(void *data) } return -1; } - +cp /* Child is still running */ return 0; } @@ -232,7 +312,6 @@ void check_children(void) } - /* Signal handlers. */ @@ -302,7 +381,7 @@ sigint_handler(int a) RETSIGTYPE sigusr1_handler(int a) { - dump_conn_list(); + dump_connection_list(); } RETSIGTYPE