Cleanups, spelling fixes, allow symbol names for signals (-k option),

don't remove pidfile if other tincd is still running.
This commit is contained in:
Guus Sliepen 2002-03-11 11:23:04 +00:00
parent 5ffeb13d65
commit 4fda4560bb
4 changed files with 94 additions and 62 deletions

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: net.c,v 1.35.4.161 2002/03/01 14:25:10 guus Exp $ $Id: net.c,v 1.35.4.162 2002/03/11 11:23:04 guus Exp $
*/ */
#include "config.h" #include "config.h"
@ -444,14 +444,14 @@ cp
close_network_connections(); close_network_connections();
exit_configuration(&config_tree); exit_configuration(&config_tree);
syslog(LOG_INFO, _("Rereading configuration file and restarting in 5 seconds")); syslog(LOG_INFO, _("Rereading configuration file and restarting in 5 seconds..."));
sleep(5); sleep(5);
init_configuration(&config_tree); init_configuration(&config_tree);
if(read_server_config()) if(read_server_config())
{ {
syslog(LOG_ERR, _("Unable to reread configuration file, exiting")); syslog(LOG_ERR, _("Unable to reread configuration file, exitting."));
exit(1); exit(1);
} }

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: process.c,v 1.1.2.35 2002/02/18 16:25:16 guus Exp $ $Id: process.c,v 1.1.2.36 2002/03/11 11:23:04 guus Exp $
*/ */
#include "config.h" #include "config.h"
@ -65,7 +65,7 @@ extern int do_purge;
void memory_full(int size) void memory_full(int size)
{ {
syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), size); syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exitting."), size);
cp_trace(); cp_trace();
exit(1); exit(1);
} }
@ -144,8 +144,15 @@ cp
errno = 0; /* No error, sometimes errno is only changed on error */ errno = 0; /* No error, sometimes errno is only changed on error */
/* ESRCH is returned when no process with that pid is found */ /* ESRCH is returned when no process with that pid is found */
if(kill(pid, signal) && errno == ESRCH) if(kill(pid, signal) && errno == ESRCH)
fprintf(stderr, _("Removing stale lock file.\n")); {
remove_pid(pidfilename); if(netname)
fprintf(stderr, _("The tincd for net `%s' is no longer running. "), netname);
else
fprintf(stderr, _("The tincd is no longer running. "));
fprintf(stderr, _("Removing stale lock file.\n"));
remove_pid(pidfilename);
}
cp cp
return 0; return 0;
} }
@ -323,25 +330,25 @@ sigquit_handler(int a)
} }
RETSIGTYPE RETSIGTYPE
sigsegv_square(int a) fatal_signal_square(int a)
{ {
syslog(LOG_ERR, _("Got another SEGV signal: not restarting")); syslog(LOG_ERR, _("Got another fatal signal %d (%s): not restarting."), a, strsignal(a));
cp_trace(); cp_trace();
exit(1); exit(1);
} }
RETSIGTYPE RETSIGTYPE
sigsegv_handler(int a) fatal_signal_handler(int a)
{ {
struct sigaction act; struct sigaction act;
syslog(LOG_ERR, _("Got SEGV signal")); syslog(LOG_ERR, _("Got fatal signal %d (%s)"), a, strsignal(a));
cp_trace(); cp_trace();
if(do_detach) if(do_detach)
{ {
syslog(LOG_NOTICE, _("Trying to re-execute in 5 seconds...")); syslog(LOG_NOTICE, _("Trying to re-execute in 5 seconds..."));
act.sa_handler = sigsegv_square; act.sa_handler = fatal_signal_square;
act.sa_mask = emptysigset; act.sa_mask = emptysigset;
act.sa_flags = 0; act.sa_flags = 0;
sigaction(SIGSEGV, &act, NULL); sigaction(SIGSEGV, &act, NULL);
@ -439,7 +446,9 @@ struct {
{ SIGHUP, sighup_handler }, { SIGHUP, sighup_handler },
{ SIGTERM, sigterm_handler }, { SIGTERM, sigterm_handler },
{ SIGQUIT, sigquit_handler }, { SIGQUIT, sigquit_handler },
{ SIGSEGV, sigsegv_handler }, { SIGSEGV, fatal_signal_handler },
{ SIGBUS, fatal_signal_handler },
{ SIGILL, fatal_signal_handler },
{ SIGPIPE, ignore_signal_handler }, { SIGPIPE, ignore_signal_handler },
{ SIGINT, sigint_handler }, { SIGINT, sigint_handler },
{ SIGUSR1, sigusr1_handler }, { SIGUSR1, sigusr1_handler },

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: subnet.c,v 1.1.2.31 2002/02/20 17:16:15 guus Exp $ $Id: subnet.c,v 1.1.2.32 2002/03/11 11:23:04 guus Exp $
*/ */
#include "config.h" #include "config.h"
@ -233,7 +233,7 @@ cp
subnet->type = SUBNET_IPV6; subnet->type = SUBNET_IPV6;
subnet->net.ipv6.masklength = 128; subnet->net.ipv6.masklength = 128;
for(i = 0; i < 8; i++) for(i = 0; i < 8; i++)
subnet->net.ipv6.address.x[i] = htons(x[i]); subnet->net.ipv6.address.x[i] = htons(x[i]);
return subnet; return subnet;
} }

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: tincd.c,v 1.10.4.57 2002/02/10 21:57:54 guus Exp $ $Id: tincd.c,v 1.10.4.58 2002/03/11 11:23:04 guus Exp $
*/ */
#include "config.h" #include "config.h"
@ -102,13 +102,13 @@ usage(int status)
{ {
printf(_("Usage: %s [option]...\n\n"), program_name); printf(_("Usage: %s [option]...\n\n"), program_name);
printf(_(" -c, --config=DIR Read configuration options from DIR.\n" printf(_(" -c, --config=DIR Read configuration options from DIR.\n"
" -D, --no-detach Don't fork and detach.\n" " -D, --no-detach Don't fork and detach.\n"
" -d, --debug[=LEVEL] Increase debug level or set it to LEVEL.\n" " -d, --debug[=LEVEL] Increase debug level or set it to LEVEL.\n"
" -k, --kill[=SIGNAL] Attempt to kill a running tincd and exit.\n" " -k, --kill[=SIGNAL] Attempt to kill a running tincd and exit.\n"
" -n, --net=NETNAME Connect to net NETNAME.\n")); " -n, --net=NETNAME Connect to net NETNAME.\n"));
printf(_(" -K, --generate-keys[=BITS] Generate public/private RSA keypair.\n" printf(_(" -K, --generate-keys[=BITS] Generate public/private RSA keypair.\n"
" --help Display this help and exit.\n" " --help Display this help and exit.\n"
" --version Output version information and exit.\n\n")); " --version Output version information and exit.\n\n"));
printf(_("Report bugs to tinc@nl.linux.org.\n")); printf(_("Report bugs to tinc@nl.linux.org.\n"));
} }
exit(status); exit(status);
@ -126,41 +126,70 @@ parse_options(int argc, char **argv, char **envp)
{ {
case 0: /* long option */ case 0: /* long option */
break; break;
case 'c': /* config file */ case 'c': /* config file */
confbase = xmalloc(strlen(optarg)+1); confbase = xmalloc(strlen(optarg)+1);
strcpy(confbase, optarg); strcpy(confbase, optarg);
break; break;
case 'D': /* no detach */ case 'D': /* no detach */
do_detach = 0; do_detach = 0;
break; break;
case 'd': /* inc debug level */ case 'd': /* inc debug level */
if(optarg) if(optarg)
debug_lvl = atoi(optarg); debug_lvl = atoi(optarg);
else else
debug_lvl++; debug_lvl++;
break; break;
case 'k': /* kill old tincds */ case 'k': /* kill old tincds */
kill_tincd = optarg?atoi(optarg):SIGTERM; if(optarg)
break; {
case 'n': /* net name given */ if(!strcasecmp(optarg, "HUP"))
netname = xmalloc(strlen(optarg)+1); kill_tincd = SIGHUP;
strcpy(netname, optarg); else if(!strcasecmp(optarg, "TERM"))
break; kill_tincd = SIGTERM;
case 'K': /* generate public/private keypair */ else if(!strcasecmp(optarg, "KILL"))
kill_tincd = SIGKILL;
else if(!strcasecmp(optarg, "USR1"))
kill_tincd = SIGUSR1;
else if(!strcasecmp(optarg, "USR2"))
kill_tincd = SIGUSR2;
else if(!strcasecmp(optarg, "WINCH"))
kill_tincd = SIGWINCH;
else if(!strcasecmp(optarg, "INT"))
kill_tincd = SIGINT;
else if(!strcasecmp(optarg, "ALRM"))
kill_tincd = SIGALRM;
else
{
kill_tincd = atoi(optarg);
if(!kill_tincd)
{
fprintf(stderr, _("Invalid argument `%s'; SIGNAL must be a number or one of HUP, TERM, KILL, USR1, USR2, WINCH, INT or ALRM.\n"), optarg);
usage(1);
}
}
}
else
kill_tincd = SIGTERM;
break;
case 'n': /* net name given */
netname = xmalloc(strlen(optarg)+1);
strcpy(netname, optarg);
break;
case 'K': /* generate public/private keypair */
if(optarg) if(optarg)
{ {
generate_keys = atoi(optarg); generate_keys = atoi(optarg);
if(generate_keys < 512) if(generate_keys < 512)
{ {
fprintf(stderr, _("Invalid argument `%s'; BITS must be a number equal to or greater than 512.\n"), fprintf(stderr, _("Invalid argument `%s'; BITS must be a number equal to or greater than 512.\n"),
optarg); optarg);
usage(1); usage(1);
} }
generate_keys &= ~7; /* Round it to bytes */ generate_keys &= ~7; /* Round it to bytes */
} }
else else
generate_keys = 1024; generate_keys = 1024;
break; break;
case '?': case '?':
usage(1); usage(1);
default: default:
@ -298,10 +327,10 @@ main(int argc, char **argv, char **envp)
{ {
printf(_("%s version %s (built %s %s, protocol %d)\n"), PACKAGE, VERSION, __DATE__, __TIME__, PROT_CURRENT); printf(_("%s version %s (built %s %s, protocol %d)\n"), PACKAGE, VERSION, __DATE__, __TIME__, PROT_CURRENT);
printf(_("Copyright (C) 1998-2002 Ivo Timmermans, Guus Sliepen and others.\n" printf(_("Copyright (C) 1998-2002 Ivo Timmermans, Guus Sliepen and others.\n"
"See the AUTHORS file for a complete list.\n\n" "See the AUTHORS file for a complete list.\n\n"
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
"and you are welcome to redistribute it under certain conditions;\n" "and you are welcome to redistribute it under certain conditions;\n"
"see the file COPYING for details.\n")); "see the file COPYING for details.\n"));
return 0; return 0;
} }
@ -309,12 +338,6 @@ main(int argc, char **argv, char **envp)
if(show_help) if(show_help)
usage(0); usage(0);
if(geteuid())
{
fprintf(stderr, _("You must be root to run this program.\n"));
return 1;
}
#ifdef HAVE_SOLARIS #ifdef HAVE_SOLARIS
openlog("tinc", LOG_CONS, LOG_DAEMON); /* Catch all syslog() calls issued before detaching */ openlog("tinc", LOG_CONS, LOG_DAEMON); /* Catch all syslog() calls issued before detaching */
#else #else