From bfa76b7a61235ad916e984b624ea6999518631e6 Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Fri, 26 Oct 2012 21:02:50 +0200 Subject: [PATCH] natd(8): Add exit_delay (daemon exit delay after signal), from FreeBSD. --- sbin/natd/natd.8 | 6 +++++- sbin/natd/natd.c | 27 ++++++++++++++++++++++----- sbin/natd/natd.h | 4 +++- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/sbin/natd/natd.8 b/sbin/natd/natd.8 index 0b957f1534..3eb56f7a29 100644 --- a/sbin/natd/natd.8 +++ b/sbin/natd/natd.8 @@ -1,5 +1,4 @@ .\" $FreeBSD: src/sbin/natd/natd.8,v 1.27.2.13 2003/02/23 21:17:43 trhodes Exp $ -.\" $DragonFly: src/sbin/natd/natd.8,v 1.3 2004/03/11 12:28:54 hmp Exp $ .Dd June 27, 2000 .Dt NATD 8 .Os @@ -33,6 +32,7 @@ .Op Fl log_facility Ar facility_name .Op Fl punch_fw Ar firewall_range .Op Fl log_ipfw_denied +.Op Fl exit_delay | P Ar ms .Ek .Sh DESCRIPTION The @@ -471,6 +471,10 @@ Log when a packet cannot be re-injected because an rule blocks it. This is the default with .Fl verbose . +.It Fl exit_delay Ar ms +Specify delay in ms before daemon exit after signal. +The default is +.Pa 10000 . .El .Sh RUNNING NATD The following steps are necessary before attempting to run diff --git a/sbin/natd/natd.c b/sbin/natd/natd.c index f75b03e934..933120f9de 100644 --- a/sbin/natd/natd.c +++ b/sbin/natd/natd.c @@ -10,7 +10,6 @@ * Ari Suutari * * $FreeBSD: src/sbin/natd/natd.c,v 1.25.2.5 2002/02/01 09:18:32 ru Exp $ - * $DragonFly: src/sbin/natd/natd.c,v 1.11 2006/08/03 16:40:46 swildner Exp $ */ #define SYSLOG_NAMES @@ -121,6 +120,7 @@ static int dropIgnoredIncoming; static int logDropped; static int logFacility; static int logIpfwDenied; +static int exitDelay; int main(int argc, char **argv) @@ -157,6 +157,7 @@ main(int argc, char **argv) logDropped = 0; logFacility = LOG_DAEMON; logIpfwDenied = -1; + exitDelay = EXIT_DELAY; ParseArgs(argc, argv); /* @@ -286,9 +287,12 @@ main(int argc, char **argv) * Catch signals to manage shutdown and * refresh of interface address. */ - sa.sa_handler = InitiateShutdown; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); + if (exitDelay) + sa.sa_handler = InitiateShutdown; + else + sa.sa_handler = Shutdown; sigaction(SIGTERM, &sa, NULL); sa.sa_handler = RefreshAddr; sigaction(SIGHUP, &sa, NULL); @@ -797,7 +801,7 @@ InitiateShutdown(int sig __unused) sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaction(SIGALRM, &sa, NULL); - alarm(10); + ualarm(exitDelay*1000, 1000); } static void @@ -828,7 +832,8 @@ enum Option { LogDenied, LogFacility, PunchFW, - LogIpfwDenied + LogIpfwDenied, + ExitDelay }; enum Param { @@ -1052,6 +1057,13 @@ static struct OptionInfo optionTable[] = { "log packets converted by natd, but denied by ipfw", "log_ipfw_denied", NULL }, + { ExitDelay, + 0, + Numeric, + "ms", + "delay in ms before daemon exit after signal", + "exit_delay", + NULL }, }; static void @@ -1061,7 +1073,7 @@ ParseOption(const char *option, const char *parms) struct OptionInfo* info; int yesNoValue; int aliasValue; - int __unused numValue; + int numValue; u_short uNumValue; const char* strValue; struct in_addr addrValue; @@ -1235,6 +1247,11 @@ ParseOption(const char *option, const char *parms) case LogIpfwDenied: logIpfwDenied = yesNoValue; break; + case ExitDelay: + if (numValue < 0 || numValue > MAX_EXIT_DELAY) + errx(1, "Incorrect exit delay: %d", numValue); + exitDelay = numValue; + break; } } diff --git a/sbin/natd/natd.h b/sbin/natd/natd.h index bc44ee4c85..3e53d95920 100644 --- a/sbin/natd/natd.h +++ b/sbin/natd/natd.h @@ -10,7 +10,6 @@ * Ari Suutari * * $FreeBSD: src/sbin/natd/natd.h,v 1.4 1999/08/28 00:13:46 peter Exp $ - * $DragonFly: src/sbin/natd/natd.h,v 1.3 2005/06/07 20:21:23 swildner Exp $ */ #define PIDFILE "/var/run/natd.pid" @@ -18,6 +17,9 @@ #define OUTPUT 2 #define DONT_KNOW 3 +#define EXIT_DELAY 10000 +#define MAX_EXIT_DELAY 999999 + extern void Quit(const char *); extern void Warn(const char *); extern int SendNeedFragIcmp(int, struct ip *, int); -- 2.41.0