open5gs/main.c

163 lines
3.5 KiB
C

/**
* @file main.c
*/
/* Core library */
#define TRACE_MODULE _main_
#include "core_general.h"
#include "core_debug.h"
#include "core_signal.h"
/* Server */
#include "app.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdate-time"
static char *compile_time = __DATE__ " " __TIME__;
#pragma GCC diagnostic pop
static void show_version()
{
printf("NextEPC daemon v%s - %s\n", PACKAGE_VERSION, compile_time);
}
static void show_help(const char *name)
{
show_version();
printf("\n"
"Usage: %s [arguments]\n"
"\n"
"Arguments:\n"
" -v Show version\n"
" -h Show help\n"
" -d Start as daemon\n"
" -f Set configuration file name\n"
" -l log_file Log file path to be logged to\n"
" -p pid_file PID file path\n"
"\n", name);
}
static int check_signal(int signum)
{
switch (signum)
{
case SIGTERM:
case SIGINT:
{
d_info("%s received",
signum == SIGTERM ? "SIGTERM" : "SIGINT");
return 1;
}
case SIGHUP:
{
d_info("SIGHUP received");
app_logger_restart();
break;
}
case SIGUSR1:
{
break;
}
default:
{
d_error("Unknown signal number = %d\n", signum);
break;
}
}
return 0;
}
void terminate()
{
app_terminate();
core_terminate();
}
int main(int argc, char *argv[])
{
/**************************************************************************
* Starting up process.
*
* Keep the order of starting-up
*/
status_t rv;
char *config_path = NULL;
char *log_path = NULL;
char *pid_path = NULL;
while (1)
{
int opt = getopt (argc, argv, "vhdf:l:p:");
if (opt == -1)
break;
switch (opt)
{
case 'v':
show_version();
return EXIT_SUCCESS;
case 'h':
show_help(argv[0]);
return EXIT_SUCCESS;
case 'd':
{
pid_t pid;
pid = fork();
d_assert(pid >= 0, return EXIT_FAILURE, "fork() failed");
if (pid != 0)
{
/* Parent */
return EXIT_SUCCESS;
}
/* Child */
setsid();
umask(027);
break;
}
case 'f':
config_path = optarg;
break;
case 'l':
log_path = optarg;
break;
case 'p':
pid_path = optarg;
break;
default:
show_help(argv[0]);
return EXIT_FAILURE;
}
}
show_version();
d_print("\n");
atexit(terminate);
core_initialize();
app_log_pid(pid_path);
rv = app_initialize(config_path, log_path);
if (rv != CORE_OK)
{
if (rv == CORE_EAGAIN)
return EXIT_SUCCESS;
d_fatal("NextEPC initialization failed. Aborted");
return EXIT_FAILURE;
}
d_print("\n\n");
d_info("NextEPC daemon start");
signal_thread(check_signal);
d_info("NextEPC daemon terminating...");
return EXIT_SUCCESS;
}