Move more functions from tincd.c into process.c.
This commit is contained in:
parent
485f7a5043
commit
5d1145f2c4
3 changed files with 111 additions and 86 deletions
107
src/process.c
107
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 <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <list.h>
|
||||
#include <pidfile.h>
|
||||
#include <utils.h>
|
||||
#include <xalloc.h>
|
||||
|
||||
#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.
|
||||
*/
|
||||
|
|
|
@ -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 <list.h>
|
||||
|
||||
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__ */
|
||||
|
|
81
src/tincd.c
81
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 <pidfile.h>
|
||||
#include <utils.h>
|
||||
#include <xalloc.h>
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue