refactor amfd/fmd/rded to use daemon_sighup_install
---
 src/amf/amfd/main.cc     | 27 +++++----------------------
 src/base/daemon.c        | 36 +++++++++++++++++++++++++++++++++++-
 src/base/daemon.h        |  3 +++
 src/fm/fmd/fm_main.cc    | 28 +++++-----------------------
 src/rde/rded/rde_main.cc | 28 +++++-----------------------
 5 files changed, 53 insertions(+), 69 deletions(-)

diff --git a/src/amf/amfd/main.cc b/src/amf/amfd/main.cc
index a86e536..50daa59 100644
--- a/src/amf/amfd/main.cc
+++ b/src/amf/amfd/main.cc
@@ -84,16 +84,12 @@ AVD_CL_CB *avd_cb = &_control_block;
 static nfds_t nfds = FD_IMM + 1;
 static struct pollfd fds[FD_IMM + 1];
 
-static NCS_SEL_OBJ sighup_sel_obj;
-
 static void process_event(AVD_CL_CB *cb_now, AVD_EVT *evt);
 static void invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 static void standby_invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 static void qsd_invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 static void qsd_ignore_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 
-static void sighup_handler(int signum, siginfo_t *info, void *ptr);
-
 /* list of all the function pointers related to handling the events
  * for active director.
  */
@@ -624,6 +620,8 @@ static void main_loop(void) {
   AVD_STBY_SYNC_STATE old_sync_state = cb->stby_sync_state;
   int polltmo = -1;
   int term_fd;
+  int hangup_fd;
+  NCS_SEL_OBJ *hangup_sel_obj = nullptr;
 
   // function to be called if new fails. The alternative of using catch of
   // std::bad_alloc will unwind the stack and thus no call chain will be
@@ -633,22 +631,11 @@ static void main_loop(void) {
   mbx_fd = ncs_ipc_get_sel_obj(&cb->avd_mbx);
   daemon_sigterm_install(&term_fd);
 
-  int rc = ncs_sel_obj_create(&sighup_sel_obj);
-  osafassert(rc == NCSCC_RC_SUCCESS);
-
-  struct sigaction sighup;
-  sigemptyset(&sighup.sa_mask);
-  sighup.sa_sigaction = sighup_handler;
-  sighup.sa_flags = SA_SIGINFO;
-
-  if (sigaction(SIGHUP, &sighup, NULL) != 0) {
-    osafassert(false);
-  }
-
+  hangup_sel_obj = daemon_sighup_install(&hangup_fd);
 
   fds[FD_TERM].fd = term_fd;
   fds[FD_TERM].events = POLLIN;
-  fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+  fds[FD_SIGHUP].fd = hangup_fd;
   fds[FD_SIGHUP].events = POLLIN;
   fds[FD_MBX].fd = mbx_fd.rmv_obj;
   fds[FD_MBX].events = POLLIN;
@@ -691,7 +678,7 @@ static void main_loop(void) {
     }
 
     if (fds[FD_SIGHUP].revents & POLLIN) {
-      ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+      ncs_sel_obj_rmv_ind(hangup_sel_obj, true, true);
       Consensus consensus_service;
       consensus_service.ReloadConfiguration();
     }
@@ -851,10 +838,6 @@ static void process_event(AVD_CL_CB *cb_now, AVD_EVT *evt) 
{
   TRACE_LEAVE();
 }
 
-static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
-  ncs_sel_obj_ind(&sighup_sel_obj);
-}
-
 /**
  * Entry point for the AMF Director process
  * @param argc
diff --git a/src/base/daemon.c b/src/base/daemon.c
index f5a43c9..2f7f37f 100644
--- a/src/base/daemon.c
+++ b/src/base/daemon.c
@@ -46,7 +46,6 @@
 #include "base/logtrace.h"
 
 #include "base/ncsgl_defs.h"
-#include "base/os_defs.h"
 #include "base/osaf_gcov.h"
 #include "base/osaf_secutil.h"
 #include "base/osaf_time.h"
@@ -515,6 +514,7 @@ void daemonize_as_user(const char *username, int argc, char 
*argv[])
 }
 
 static NCS_SEL_OBJ term_sel_obj; /* Selection object for TERM signal events */
+static NCS_SEL_OBJ hangup_sel_obj; /* Selection object for HUP signal */
 
 // symbols from ncs_osprm.h, don't pull in that file here!
 extern uint32_t ncs_sel_obj_create(NCS_SEL_OBJ *o_sel_obj);
@@ -534,6 +534,15 @@ static void sigterm_handler(int signum, siginfo_t *info, 
void *ptr)
 }
 
 /**
+ * HUP signal handler
+ * @param sig
+ */
+static void sighup_handler(int signum, siginfo_t *info, void *ptr)
+{
+       ncs_sel_obj_ind(&hangup_sel_obj);
+}
+
+/**
  * Exit calling process with exit(0) using a standard syslog message.
  * This function should be called from the main thread of a server process in
  * a "safe" context for calling exit(). Any service specific thing should be
@@ -581,6 +590,31 @@ void daemon_sigterm_install(int *term_fd)
        *term_fd = term_sel_obj.rmv_obj;
 }
 
+/**
+ * Install HUP signal handler and return descriptor to monitor
+ * @param[out] term_fd  socket descriptor to monitor for SIGHUP event
+ */
+NCS_SEL_OBJ* daemon_sighup_install(int *hangup_fd)
+{
+       struct sigaction act;
+
+       if (ncs_sel_obj_create(&hangup_sel_obj) != NCSCC_RC_SUCCESS) {
+               syslog(LOG_ERR, "ncs_sel_obj_create failed");
+               exit(EXIT_FAILURE);
+       }
+
+       sigemptyset(&act.sa_mask);
+       act.sa_sigaction = sighup_handler;
+       act.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGHUP, &act, NULL) < 0) {
+               syslog(LOG_ERR, "sigaction HUP failed: %s", strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       *hangup_fd = hangup_sel_obj.rmv_obj;
+       return &hangup_sel_obj;
+}
+
 static char *bt_filename = 0;
 
 static int (*plibc_backtrace)(void **buffer, int size) = NULL;
diff --git a/src/base/daemon.h b/src/base/daemon.h
index 3fc8217..dbfa372 100644
--- a/src/base/daemon.h
+++ b/src/base/daemon.h
@@ -25,6 +25,8 @@
 #ifndef BASE_DAEMON_H_
 #define BASE_DAEMON_H_
 
+#include "base/os_defs.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -33,6 +35,7 @@ void daemonize(int argc, char *argv[]);
 void daemonize_as_user(const char *username, int argc, char *argv[]);
 void daemon_exit(void);
 void daemon_sigterm_install(int *term_fd);
+NCS_SEL_OBJ* daemon_sighup_install(int *hangup_fd);
 
 #ifdef __cplusplus
 }
diff --git a/src/fm/fmd/fm_main.cc b/src/fm/fmd/fm_main.cc
index ea70f24..2eb3c16 100644
--- a/src/fm/fmd/fm_main.cc
+++ b/src/fm/fmd/fm_main.cc
@@ -71,7 +71,6 @@ void rda_cb(uint32_t cb_hdl, PCS_RDA_CB_INFO *cb_info,
             PCSRDA_RETURN_CODE error_code);
 uint32_t gl_fm_hdl;
 static NCS_SEL_OBJ usr1_sel_obj;
-static NCS_SEL_OBJ sighup_sel_obj;
 
 /**
  * USR1 signal is used when AMF wants instantiate us as a
@@ -86,10 +85,6 @@ static void sigusr1_handler(int sig) {
   ncs_sel_obj_ind(&usr1_sel_obj);
 }
 
-static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
-  ncs_sel_obj_ind(&sighup_sel_obj);
-}
-
 /**
  * Callback from RDA. Post a message/event to the FM mailbox.
  * @param cb_hdl
@@ -136,6 +131,8 @@ int main(int argc, char *argv[]) {
   int ret = 0;
   int rc = NCSCC_RC_FAILURE;
   int term_fd;
+  int hangup_fd;
+  NCS_SEL_OBJ* hangup_sel_obj = nullptr;
   bool nid_started = false;
   char *control_tipc = NULL;
 
@@ -222,22 +219,6 @@ int main(int argc, char *argv[]) {
     goto fm_init_failed;
   }
 
-  rc = ncs_sel_obj_create(&sighup_sel_obj);
-  if (rc != NCSCC_RC_SUCCESS) {
-    LOG_ER("ncs_sel_obj_create FAILED");
-    goto fm_init_failed;
-  }
-
-  struct sigaction sighup;
-  sigemptyset(&sighup.sa_mask);
-  sighup.sa_sigaction = sighup_handler;
-  sighup.sa_flags = SA_SIGINFO;
-
-  if (sigaction(SIGHUP, &sighup, NULL) != 0) {
-    LOG_ER("registering SIGHUP FAILED: %s", strerror(errno));
-    goto fm_init_failed;
-  }
-
   if (!nid_started && fm_amf_init(&fm_cb->fm_amf_cb) != NCSCC_RC_SUCCESS)
     goto fm_init_failed;
 
@@ -254,6 +235,7 @@ int main(int argc, char *argv[]) {
   ncshm_give_hdl(gl_fm_hdl);
 
   daemon_sigterm_install(&term_fd);
+  hangup_sel_obj = daemon_sighup_install(&hangup_fd);
 
   fds[FD_TERM].fd = term_fd;
   fds[FD_TERM].events = POLLIN;
@@ -266,7 +248,7 @@ int main(int argc, char *argv[]) {
   fds[FD_MBX].fd = mbx_sel_obj.rmv_obj;
   fds[FD_MBX].events = POLLIN;
 
-  fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+  fds[FD_SIGHUP].fd = hangup_fd;
   fds[FD_SIGHUP].events = POLLIN;
 
   /* notify the NID */
@@ -304,7 +286,7 @@ int main(int argc, char *argv[]) {
     }
 
     if (fds[FD_SIGHUP].revents & POLLIN) {
-      ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+      ncs_sel_obj_rmv_ind(hangup_sel_obj, true, true);
       reload_configuration(fm_cb);
       Consensus consensus_service;
       consensus_service.ReloadConfiguration();
diff --git a/src/rde/rded/rde_main.cc b/src/rde/rded/rde_main.cc
index 33ed5c4..f511814 100644
--- a/src/rde/rded/rde_main.cc
+++ b/src/rde/rded/rde_main.cc
@@ -64,7 +64,6 @@ const char *rde_msg_name[] = {"-",
 static RDE_CONTROL_BLOCK _rde_cb;
 static RDE_CONTROL_BLOCK *rde_cb = &_rde_cb;
 static NCS_SEL_OBJ usr1_sel_obj;
-static NCS_SEL_OBJ sighup_sel_obj;
 static NODE_ID own_node_id;
 static Role *role;
 
@@ -83,10 +82,6 @@ static void sigusr1_handler(int sig) {
   ncs_sel_obj_ind(&usr1_sel_obj);
 }
 
-static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
-  ncs_sel_obj_ind(&sighup_sel_obj);
-}
-
 static int fd_to_client_ixd(int fd) {
   int i;
   RDE_RDA_CB *rde_rda_cb = &rde_cb->rde_rda_cb;
@@ -315,12 +310,6 @@ static int initialize_rde() {
     goto init_failed;
   }
 
-  rc = ncs_sel_obj_create(&sighup_sel_obj);
-  if (rc != NCSCC_RC_SUCCESS) {
-    LOG_ER("ncs_sel_obj_create FAILED");
-    goto init_failed;
-  }
-
   if ((rc = ncs_ipc_create(&rde_cb->mbx)) != NCSCC_RC_SUCCESS) {
     LOG_ER("ncs_ipc_create FAILED");
     goto init_failed;
@@ -337,16 +326,6 @@ static int initialize_rde() {
     goto init_failed;
   }
 
-  struct sigaction sighup;
-  sigemptyset(&sighup.sa_mask);
-  sighup.sa_sigaction = sighup_handler;
-  sighup.sa_flags = SA_SIGINFO;
-
-  if (sigaction(SIGHUP, &sighup, NULL) != 0) {
-    LOG_ER("registering SIGHUP FAILED: %s", strerror(errno));
-    goto init_failed;
-  }
-
   if (rde_discovery_mds_register() != NCSCC_RC_SUCCESS) {
     LOG_ER("rde_discovery_mds_register() failed");
     rc = NCSCC_RC_FAILURE;
@@ -365,6 +344,8 @@ int main(int argc, char *argv[]) {
   NCS_SEL_OBJ mbx_sel_obj;
   RDE_RDA_CB *rde_rda_cb = &rde_cb->rde_rda_cb;
   int term_fd;
+  int hangup_fd;
+  NCS_SEL_OBJ *hangup_sel_obj = nullptr;
   opensaf_reboot_prepare();
 
   daemonize(argc, argv);
@@ -382,6 +363,7 @@ int main(int argc, char *argv[]) {
   }
 
   daemon_sigterm_install(&term_fd);
+  hangup_sel_obj = daemon_sighup_install(&hangup_fd);
 
   fds[FD_TERM].fd = term_fd;
   fds[FD_TERM].events = POLLIN;
@@ -391,7 +373,7 @@ int main(int argc, char *argv[]) {
                                                   : rde_cb->rde_amf_cb.amf_fd;
   fds[FD_AMF].events = POLLIN;
 
-  fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+  fds[FD_SIGHUP].fd = hangup_fd;
   fds[FD_SIGHUP].events = POLLIN;
 
   /* Mailbox */
@@ -455,7 +437,7 @@ int main(int argc, char *argv[]) {
     }
 
     if (fds[FD_SIGHUP].revents & POLLIN) {
-      ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+      ncs_sel_obj_rmv_ind(hangup_sel_obj, true, true);
       Consensus consensus_service;
       bool old_setting = consensus_service.IsEnabled();
       consensus_service.ReloadConfiguration();
-- 
2.7.4



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to