daemon.c (2926B)
1 #include "daemon.h" 2 3 #include <fcntl.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <sys/stat.h> 8 #include <unistd.h> 9 10 #include "../common.h" 11 #include "cofyc/argparse.h" 12 #include "common/resp.h" 13 #include "common/scheduler.h" 14 #include "domain/config.h" 15 #include "domain/daemon/session.h" 16 #include "infrastructure/config.h" 17 #include "interface/api/server.h" 18 #include "rxi/log.h" 19 20 static void register_domain_commands(void) { 21 api_register_domain_cmd("session.create", domain_session_create); 22 api_register_domain_cmd("session.list", domain_session_list); 23 api_register_domain_cmd("session.info", domain_session_info); 24 api_register_domain_cmd("session.destroy", domain_session_destroy); 25 api_register_domain_cmd("session.socket.create.listen", domain_socket_create_listen); 26 api_register_domain_cmd("session.socket.create.connect", domain_socket_create_connect); 27 api_register_domain_cmd("session.socket.destroy", domain_socket_destroy); 28 api_register_domain_cmd("session.forward.list", domain_forward_list); 29 api_register_domain_cmd("session.forward.create", domain_forward_create); 30 api_register_domain_cmd("session.forward.destroy", domain_forward_destroy); 31 api_register_domain_cmd("session.count", domain_session_count); 32 api_register_domain_cmd("system.load", domain_system_load); 33 log_info("udphole: registered session.* commands"); 34 } 35 36 static int do_daemonize(void) { 37 pid_t pid = fork(); 38 if (pid < 0) { 39 log_fatal("fork: %m"); 40 return -1; 41 } 42 if (pid > 0) _exit(0); 43 if (setsid() < 0) { 44 log_fatal("setsid: %m"); 45 _exit(1); 46 } 47 pid = fork(); 48 if (pid < 0) { 49 log_fatal("fork: %m"); 50 _exit(1); 51 } 52 if (pid > 0) _exit(0); 53 if (chdir("/") != 0) { 54 } 55 int fd; 56 for (fd = 0; fd < 3; fd++) (void)close(fd); 57 fd = open("/dev/null", O_RDWR); 58 if (fd >= 0) { 59 dup2(fd, STDIN_FILENO); 60 dup2(fd, STDOUT_FILENO); 61 dup2(fd, STDERR_FILENO); 62 if (fd > 2) close(fd); 63 } 64 return 0; 65 } 66 67 int cli_cmd_daemon(int argc, const char **argv) { 68 int daemonize_flag = 0; 69 int no_daemonize_flag = 0; 70 71 struct argparse argparse; 72 struct argparse_option options[] = { 73 OPT_HELP(), 74 OPT_BOOLEAN('d', "daemonize", &daemonize_flag, "run in background", NULL, 0, 0), 75 OPT_BOOLEAN('D', "no-daemonize", &no_daemonize_flag, "force foreground", NULL, 0, 0), 76 OPT_END(), 77 }; 78 argparse_init(&argparse, options, (const char *const[]){"udphole daemon", NULL}, ARGPARSE_STOP_AT_NON_OPTION); 79 argparse_parse(&argparse, argc, argv); 80 81 if (!no_daemonize_flag && daemonize_flag) { 82 do_daemonize(); 83 } 84 85 domain_config_init(); 86 87 register_domain_commands(); 88 89 log_info("udphole: starting daemon"); 90 91 session_manager_udata_t *session_udata = calloc(1, sizeof(session_manager_udata_t)); 92 93 sched_create(api_server_pt, NULL); 94 sched_create(session_manager_pt, session_udata); 95 96 log_info("udphole: daemon started"); 97 98 return sched_main(); 99 }