diff --git a/lib/s6a/s6a_fd_init.c b/lib/s6a/s6a_fd_init.c index 0983a4f470..05c52c867d 100644 --- a/lib/s6a/s6a_fd_init.c +++ b/lib/s6a/s6a_fd_init.c @@ -2,6 +2,7 @@ #include "core_debug.h" #include "core_lib.h" +#include "core_signal.h" #include "s6a_app.h" #include "s6a_lib.h" @@ -13,7 +14,9 @@ static void s6a_gnutls_log_func(int level, const char *str); static void s6a_fd_logger(int printlevel, const char *format, va_list ap); -status_t s6a_fd_init(const char *conffile) +static int check_signal(int signum); + +static status_t s6a_fd_init_internal(const char *conffile) { int ret; @@ -66,6 +69,32 @@ error: return CORE_ERROR; } +status_t s6a_fd_init() +{ + status_t rv; + + pid_t pid; + pid = fork(); + + d_assert(pid != -1, _exit(EXIT_FAILURE), "fork() failed"); + + if (pid == 0) + { + /* Child */ + rv = s6a_fd_init_internal(s6a_fd_hss_config()); + d_assert(rv == CORE_OK, _exit(EXIT_FAILURE), "s6a_fd_init() failed"); + signal_thread(check_signal); + s6a_fd_final(); + + _exit(EXIT_SUCCESS); + } + + /* Parent */ + rv = s6a_fd_init_internal(s6a_fd_mme_config()); + if (rv != CORE_OK) return rv; + return CORE_OK; +} + void s6a_fd_final() { s6a_app_final(); @@ -120,3 +149,25 @@ static void s6a_fd_logger(int printlevel, const char *format, va_list ap) break; } } + +static int check_signal(int signum) +{ + switch (signum) + { + case SIGTERM: + case SIGINT: + { + d_info("%s received", + signum == SIGTERM ? "SIGTERM" : "SIGINT"); + + return 1; + } + default: + { + d_error("Unknown Signal Number = %d\n", signum); + break; + } + + } + return 0; +} diff --git a/lib/s6a/s6a_lib.h b/lib/s6a/s6a_lib.h index 87dccd81fb..67de3299d9 100644 --- a/lib/s6a/s6a_lib.h +++ b/lib/s6a/s6a_lib.h @@ -27,7 +27,7 @@ struct s6a_fd_config_t { extern struct s6a_fd_config_t *s6a_fd_config; -CORE_DECLARE(status_t) s6a_fd_init(const char *conffile); +CORE_DECLARE(status_t) s6a_fd_init(); CORE_DECLARE(void) s6a_fd_final(); CORE_DECLARE(char *) s6a_fd_hss_config(); diff --git a/main.c b/main.c index 2f25c2305f..de93f2cb24 100644 --- a/main.c +++ b/main.c @@ -154,6 +154,7 @@ int main(int argc, char *argv[]) if (pid == 0) { /* Child */ + setsid(); umask(027); core_signal(SIGINT, logger_signal); @@ -166,27 +167,6 @@ int main(int argc, char *argv[]) /* Parent */ } - { - pid_t pid; - pid = fork(); - - d_assert(pid != -1, return EXIT_FAILURE, "fork() failed"); - - if (pid == 0) - { - /* Child */ - signal_init(); - - s6a_fd_init(s6a_fd_hss_config()); - signal_thread(check_signal); - s6a_fd_final(); - - return EXIT_SUCCESS; - } - - /* Parent */ - } - { extern int _mme_sm; extern int _enb_s1_sm; diff --git a/src/init.c b/src/init.c index 18e6d5f0f2..82cc9f5c40 100644 --- a/src/init.c +++ b/src/init.c @@ -26,8 +26,9 @@ status_t cellwire_initialize(char *config_path) rv = context_init(); if (rv != CORE_OK) return rv; - rv = s6a_fd_init(s6a_fd_mme_config()); + rv = s6a_fd_init(); if (rv != CORE_OK) return rv; + return CORE_OK; }