From 2ee7f37628c9a058ef5d75c44957a23f0a56d857 Mon Sep 17 00:00:00 2001 From: mav Date: Sun, 22 Jun 2008 22:14:02 +0000 Subject: Add exit_delay parameter to control daemon exit delay after signal. PR: bin/58696 Submitted by: sp@alkor.ru --- sbin/natd/natd.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'sbin/natd/natd.c') diff --git a/sbin/natd/natd.c b/sbin/natd/natd.c index 64d612e..3a5a644 100644 --- a/sbin/natd/natd.c +++ b/sbin/natd/natd.c @@ -147,6 +147,8 @@ static const char* pidName; static int routeSock; static int globalPort; static int divertGlobal; +static int exitDelay; + int main (int argc, char** argv) { @@ -174,6 +176,7 @@ int main (int argc, char** argv) icmpSock = -1; fdMax = -1; divertGlobal = -1; + exitDelay = EXIT_DELAY; ParseArgs (argc, argv); /* @@ -347,7 +350,10 @@ int main (int argc, char** argv) */ siginterrupt(SIGTERM, 1); siginterrupt(SIGHUP, 1); - signal (SIGTERM, InitiateShutdown); + if (exitDelay) + signal(SIGTERM, InitiateShutdown); + else + signal(SIGTERM, Shutdown); signal (SIGHUP, RefreshAddr); /* * Set alias address if it has been given. @@ -984,7 +990,7 @@ static void InitiateShutdown (int sig __unused) */ siginterrupt(SIGALRM, 1); signal (SIGALRM, Shutdown); - alarm (10); + ualarm(exitDelay*1000, 1000); } static void Shutdown (int sig __unused) @@ -1019,7 +1025,8 @@ enum Option { PunchFW, SkinnyPort, LogIpfwDenied, - PidFile + PidFile, + ExitDelay }; enum Param { @@ -1277,6 +1284,13 @@ static struct OptionInfo optionTable[] = { "name of aliasing engine instance", "instance", NULL }, + { ExitDelay, + 0, + Numeric, + "ms", + "delay in ms before daemon exit after signal", + "exit_delay", + NULL }, }; static void ParseOption (const char* option, const char* parms) @@ -1479,6 +1493,11 @@ static void ParseOption (const char* option, const char* parms) case Instance: NewInstance(strValue); break; + case ExitDelay: + if (numValue < 0 || numValue > MAX_EXIT_DELAY) + errx(1, "Incorrect exit delay: %d", numValue); + exitDelay = numValue; + break; } } -- cgit v1.1