Blame SOURCES/0010-Improve-daemonizing.patch

ab00cd
From 569e7078244470ac0fcc2af3947c2735338555ec Mon Sep 17 00:00:00 2001
ab00cd
From: Martin Sehnoutka <msehnout@redhat.com>
ab00cd
Date: Wed, 7 Sep 2016 11:29:29 +0200
ab00cd
Subject: [PATCH 10/59] Improve daemonizing
ab00cd
ab00cd
Init script gets correct return code if binding fails.
ab00cd
---
ab00cd
 standalone.c | 38 +++++++++++++++++++++++++++++++++++++-
ab00cd
 sysutil.c    | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ab00cd
 sysutil.h    |  7 ++++++-
ab00cd
 3 files changed, 102 insertions(+), 2 deletions(-)
ab00cd
ab00cd
diff --git a/standalone.c b/standalone.c
ab00cd
index e0f2d5b..3b65ea2 100644
ab00cd
--- a/standalone.c
ab00cd
+++ b/standalone.c
ab00cd
@@ -26,6 +26,8 @@ static unsigned int s_ipaddr_size;
ab00cd
 
ab00cd
 static void handle_sigchld(void*  duff);
ab00cd
 static void handle_sighup(void*  duff);
ab00cd
+static void handle_sigusr1(int sig);
ab00cd
+static void handle_sigalrm(int sig);
ab00cd
 static void prepare_child(int sockfd);
ab00cd
 static unsigned int handle_ip_count(void* p_raw_addr);
ab00cd
 static void drop_ip_count(void* p_raw_addr);
ab00cd
@@ -46,11 +48,23 @@ vsf_standalone_main(void)
ab00cd
   }
ab00cd
   if (tunable_background)
ab00cd
   {
ab00cd
+    vsf_sysutil_sigaction(kVSFSysUtilSigALRM, handle_sigalrm);
ab00cd
+    vsf_sysutil_sigaction(kVSFSysUtilSigUSR1, handle_sigusr1);
ab00cd
+
ab00cd
     int forkret = vsf_sysutil_fork();
ab00cd
     if (forkret > 0)
ab00cd
     {
ab00cd
       /* Parent, just exit */
ab00cd
-      vsf_sysutil_exit(0);
ab00cd
+      vsf_sysutil_set_alarm(3);
ab00cd
+      vsf_sysutil_pause();
ab00cd
+
ab00cd
+      vsf_sysutil_exit(1);
ab00cd
+    }
ab00cd
+    else if (forkret == 0)
ab00cd
+    {
ab00cd
+      // Son, restore original signal handler
ab00cd
+      vsf_sysutil_sigaction(kVSFSysUtilSigALRM, 0L);
ab00cd
+      vsf_sysutil_sigaction(kVSFSysUtilSigUSR1, 0L);
ab00cd
     }
ab00cd
     /* Son, close standard FDs to avoid SSH hang-on-exit */
ab00cd
     vsf_sysutil_reopen_standard_fds();
ab00cd
@@ -99,6 +113,10 @@ vsf_standalone_main(void)
ab00cd
     {
ab00cd
       die("could not bind listening IPv4 socket");
ab00cd
     }
ab00cd
+    if (tunable_background)
ab00cd
+    {
ab00cd
+      vsf_sysutil_kill(vsf_sysutil_getppid(), kVSFSysUtilSigUSR1);
ab00cd
+    }
ab00cd
   }
ab00cd
   else
ab00cd
   {
ab00cd
@@ -129,6 +147,10 @@ vsf_standalone_main(void)
ab00cd
     {
ab00cd
       die("could not bind listening IPv6 socket");
ab00cd
     }
ab00cd
+    if (tunable_background)
ab00cd
+    {
ab00cd
+      vsf_sysutil_kill(vsf_sysutil_getppid(), kVSFSysUtilSigUSR1);
ab00cd
+    }
ab00cd
   }
ab00cd
   vsf_sysutil_close(0);
ab00cd
   vsf_sysutil_close(1);
ab00cd
@@ -268,6 +290,20 @@ handle_sighup(void* duff)
ab00cd
   vsf_parseconf_load_file(0, 0);
ab00cd
 }
ab00cd
 
ab00cd
+static void
ab00cd
+handle_sigalrm(int sig)
ab00cd
+{
ab00cd
+  (void)sig; // avoid unused parameter error
ab00cd
+  vsf_sysutil_exit(1);
ab00cd
+}
ab00cd
+
ab00cd
+static void
ab00cd
+handle_sigusr1(int sig)
ab00cd
+{
ab00cd
+  (void)sig; // avoid unused parameter error
ab00cd
+  vsf_sysutil_exit(0);
ab00cd
+}
ab00cd
+
ab00cd
 static unsigned int
ab00cd
 hash_ip(unsigned int buckets, void* p_key)
ab00cd
 {
ab00cd
diff --git a/sysutil.c b/sysutil.c
ab00cd
index 428a34a..c848356 100644
ab00cd
--- a/sysutil.c
ab00cd
+++ b/sysutil.c
ab00cd
@@ -201,6 +201,9 @@ vsf_sysutil_translate_sig(const enum EVSFSysUtilSignal sig)
ab00cd
     case kVSFSysUtilSigHUP:
ab00cd
       realsig = SIGHUP;
ab00cd
       break;
ab00cd
+    case kVSFSysUtilSigUSR1:
ab00cd
+      realsig = SIGUSR1;
ab00cd
+      break;
ab00cd
     default:
ab00cd
       bug("unknown signal in vsf_sysutil_translate_sig");
ab00cd
       break;
ab00cd
@@ -549,6 +552,12 @@ vsf_sysutil_getpid(void)
ab00cd
   return (unsigned int) s_current_pid;
ab00cd
 }
ab00cd
 
ab00cd
+unsigned int
ab00cd
+vsf_sysutil_getppid(void)
ab00cd
+{
ab00cd
+  return (unsigned int)getppid();
ab00cd
+}
ab00cd
+
ab00cd
 int
ab00cd
 vsf_sysutil_fork(void)
ab00cd
 {
ab00cd
@@ -2871,3 +2880,53 @@ vsf_sysutil_post_fork()
ab00cd
     s_sig_details[i].pending = 0;
ab00cd
   }
ab00cd
 }
ab00cd
+
ab00cd
+static struct sigaction sigalr, sigusr1;
ab00cd
+
ab00cd
+void
ab00cd
+vsf_sysutil_sigaction(const enum EVSFSysUtilSignal sig, void (*p_handlefunc)(int))
ab00cd
+{
ab00cd
+  int realsig = vsf_sysutil_translate_sig(sig);
ab00cd
+  int retval;
ab00cd
+  struct sigaction sigact, *origsigact=NULL;
ab00cd
+  if (realsig==SIGALRM)
ab00cd
+  {
ab00cd
+    origsigact = &sigalr;
ab00cd
+  }
ab00cd
+  else if (realsig==SIGUSR1)
ab00cd
+  {
ab00cd
+    origsigact = &sigusr1;
ab00cd
+  }
ab00cd
+  vsf_sysutil_memclr(&sigact, sizeof(sigact));
ab00cd
+  if (p_handlefunc != NULL)
ab00cd
+  {
ab00cd
+    sigact.sa_handler = p_handlefunc;
ab00cd
+    retval = sigfillset(&sigact.sa_mask);
ab00cd
+    if (retval != 0)
ab00cd
+    {
ab00cd
+      die("sigfillset");
ab00cd
+    }
ab00cd
+    retval = sigaction(realsig, &sigact, origsigact);
ab00cd
+  }
ab00cd
+  else
ab00cd
+  {
ab00cd
+    retval = sigaction(realsig, origsigact, NULL);
ab00cd
+  }
ab00cd
+  if (retval != 0)
ab00cd
+  {
ab00cd
+    die("sigaction");
ab00cd
+  }
ab00cd
+}
ab00cd
+
ab00cd
+int
ab00cd
+vsf_sysutil_kill(int pid, int sig)
ab00cd
+{
ab00cd
+  int realsig = vsf_sysutil_translate_sig(sig);
ab00cd
+  return kill(pid, realsig);
ab00cd
+}
ab00cd
+
ab00cd
+int
ab00cd
+vsf_sysutil_pause()
ab00cd
+{
ab00cd
+  return pause();
ab00cd
+}
ab00cd
diff --git a/sysutil.h b/sysutil.h
ab00cd
index c2ddd15..bfc92cb 100644
ab00cd
--- a/sysutil.h
ab00cd
+++ b/sysutil.h
ab00cd
@@ -30,7 +30,8 @@ enum EVSFSysUtilSignal
ab00cd
   kVSFSysUtilSigCHLD,
ab00cd
   kVSFSysUtilSigPIPE,
ab00cd
   kVSFSysUtilSigURG,
ab00cd
-  kVSFSysUtilSigHUP
ab00cd
+  kVSFSysUtilSigHUP,
ab00cd
+  kVSFSysUtilSigUSR1
ab00cd
 };
ab00cd
 enum EVSFSysUtilInterruptContext
ab00cd
 {
ab00cd
@@ -165,6 +166,7 @@ void vsf_sysutil_free(void* p_ptr);
ab00cd
 
ab00cd
 /* Process creation/exit/process handling */
ab00cd
 unsigned int vsf_sysutil_getpid(void);
ab00cd
+unsigned int vsf_sysutil_getppid(void);
ab00cd
 void vsf_sysutil_post_fork(void);
ab00cd
 int vsf_sysutil_fork(void);
ab00cd
 int vsf_sysutil_fork_failok(void);
ab00cd
@@ -182,6 +184,9 @@ int vsf_sysutil_wait_exited_normally(
ab00cd
   const struct vsf_sysutil_wait_retval* p_waitret);
ab00cd
 int vsf_sysutil_wait_get_exitcode(
ab00cd
   const struct vsf_sysutil_wait_retval* p_waitret);
ab00cd
+void vsf_sysutil_sigaction(const enum EVSFSysUtilSignal sig, void (*p_handlefunc)(int));
ab00cd
+int vsf_sysutil_kill(int pid, int sig);
ab00cd
+int vsf_sysutil_pause();
ab00cd
 
ab00cd
 /* Various string functions */
ab00cd
 unsigned int vsf_sysutil_strlen(const char* p_text);
ab00cd
-- 
ab00cd
2.14.4
ab00cd