udphole

Basic UDP wormhole proxy
git clone git://git.finwo.net/app/udphole
Log | Files | Refs | README | LICENSE

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 }