From 5d1145f2c4b3b8261ca0aa0e89a2daf321640f0b Mon Sep 17 00:00:00 2001 From: Ivo Timmermans Date: Thu, 16 Nov 2000 22:12:23 +0000 Subject: [PATCH] Move more functions from tincd.c into process.c. --- src/process.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++--- src/process.h | 9 ++++- src/tincd.c | 81 +------------------------------------- 3 files changed, 111 insertions(+), 86 deletions(-) diff --git a/src/process.c b/src/process.c index f221a9aa..2135036f 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.2 2000/11/16 22:12:23 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; @@ -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,6 +135,8 @@ int detach(void) int fd; pid_t pid; + setup_signals(); + if(do_detach) { ppid = getpid(); @@ -95,12 +194,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 +281,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 +330,6 @@ void check_children(void) } - /* Signal handlers. */ diff --git a/src/process.h b/src/process.h index c3514dc4..4f501b2f 100644 --- a/src/process.h +++ b/src/process.h @@ -17,14 +17,21 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: process.h,v 1.1.2.1 2000/11/16 17:54:28 zarq Exp $ + $Id: process.h,v 1.1.2.2 2000/11/16 22:12:23 zarq Exp $ */ #ifndef __TINC_PROCESS_H__ #define __TINC_PROCESS_H__ +#include "config.h" #include extern list_t *child_pids; +extern RETSIGTYPE parent_exit(int a); +extern void setup_signals(void); +extern int execute_script(const char *); +extern void check_children(void); +extern int detach(void); + #endif /* __TINC_PROCESS_H__ */ diff --git a/src/tincd.c b/src/tincd.c index 9f229b30..0b02aad4 100644 --- a/src/tincd.c +++ b/src/tincd.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: tincd.c,v 1.10.4.29 2000/11/16 17:54:29 zarq Exp $ + $Id: tincd.c,v 1.10.4.30 2000/11/16 22:12:23 zarq Exp $ */ #include "config.h" @@ -58,7 +58,6 @@ -#include #include #include @@ -90,17 +89,13 @@ static int generate_keys = 0; char *identname; /* program name for syslog */ char *pidfilename; /* pid file location */ -static pid_t ppid; /* pid of non-detached part */ char **g_argv; /* a copy of the cmdline arguments */ char **environment; /* A pointer to the environment on startup */ void cleanup_and_exit(int); -int detach(void); int kill_other(void); void make_names(void); -RETSIGTYPE parent_exit(int a); -void setup_signals(void); int write_pidfile(void); static struct option const long_options[] = @@ -244,78 +239,6 @@ int keygen(int bits) return 0; } -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; -} - /* Set all files and paths according to netname */ @@ -397,8 +320,6 @@ main(int argc, char **argv, char **envp) if(read_server_config()) return 1; - setup_signals(); - if(detach()) exit(0); -- 2.39.5