mirror of
				https://github.com/open5gs/open5gs.git
				synced 2025-11-04 05:53:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			164 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			164 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;
 | 
						|
}
 |