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