diff options
author | Thomas Snider <tjps636@gmail.com> | 2017-03-22 13:29:41 -0700 |
---|---|---|
committer | Thomas Snider <tjps636@gmail.com> | 2017-03-24 10:32:56 -0700 |
commit | 81a3857c4e94137d3fab7f8ec78c32d190195acb (patch) | |
tree | 402efbe5147b360b594023fa0a5a7fec606987df /src/init.cpp | |
parent | 02d64bd929c9663ba38e96721c6dbd89972d043d (diff) |
Deduplicated sigaction() boilerplate
Diffstat (limited to 'src/init.cpp')
-rw-r--r-- | src/init.cpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/init.cpp b/src/init.cpp index 246d5f340a..81a12d431e 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -265,18 +265,31 @@ void Shutdown() } /** - * Signal handlers are very limited in what they are allowed to do, so: + * Signal handlers are very limited in what they are allowed to do. + * The execution context the handler is invoked in is not guaranteed, + * so we restrict handler operations to just touching variables: */ -void HandleSIGTERM(int) +static void HandleSIGTERM(int) { fRequestShutdown = true; } -void HandleSIGHUP(int) +static void HandleSIGHUP(int) { fReopenDebugLog = true; } +#ifndef WIN32 +static void registerSignalHandler(int signal, void(*handler)(int)) +{ + struct sigaction sa; + sa.sa_handler = handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sigaction(signal, &sa, NULL); +} +#endif + bool static Bind(CConnman& connman, const CService &addr, unsigned int flags) { if (!(flags & BF_EXPLICIT) && IsLimited(addr)) return false; @@ -848,19 +861,11 @@ bool AppInitBasicSetup() } // Clean shutdown on SIGTERM - struct sigaction sa; - sa.sa_handler = HandleSIGTERM; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); + registerSignalHandler(SIGTERM, HandleSIGTERM); + registerSignalHandler(SIGINT, HandleSIGTERM); // Reopen debug.log on SIGHUP - struct sigaction sa_hup; - sa_hup.sa_handler = HandleSIGHUP; - sigemptyset(&sa_hup.sa_mask); - sa_hup.sa_flags = 0; - sigaction(SIGHUP, &sa_hup, NULL); + registerSignalHandler(SIGHUP, HandleSIGHUP); // Ignore SIGPIPE, otherwise it will bring the daemon down if the client closes unexpectedly signal(SIGPIPE, SIG_IGN); |