Move more functions from tincd.c into process.c.

This commit is contained in:
Ivo Timmermans 2000-11-16 22:12:23 +00:00
parent 485f7a5043
commit 5d1145f2c4
3 changed files with 111 additions and 86 deletions

View file

@ -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.
*/

View file

@ -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__ */

View file

@ -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);