diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipcpd/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/ipcpd/config.h.in | 2 | ||||
| -rw-r--r-- | src/ipcpd/ipcp.c | 112 | ||||
| -rw-r--r-- | src/irmd/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/irmd/config.h.in | 1 | ||||
| -rw-r--r-- | src/irmd/main.c | 116 | 
6 files changed, 95 insertions, 140 deletions
| diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt index 3fa3bb0f..1c6f6ae9 100644 --- a/src/ipcpd/CMakeLists.txt +++ b/src/ipcpd/CMakeLists.txt @@ -1,5 +1,3 @@ -set(IPCP_ACCEPT_TIMEOUT 100 CACHE STRING -  "Timeout for accept in IPCP mainloop threads (ms)")  set(IPCP_QOS_CUBE_BE_PRIO 50 CACHE STRING    "Priority for best effort QoS cube (0-99)")  set(IPCP_QOS_CUBE_VIDEO_PRIO 90 CACHE STRING diff --git a/src/ipcpd/config.h.in b/src/ipcpd/config.h.in index f7af0808..43307d87 100644 --- a/src/ipcpd/config.h.in +++ b/src/ipcpd/config.h.in @@ -26,8 +26,6 @@  #define PROG_RES_FDS        @PROG_RES_FDS@  #define PROG_MAX_FLOWS      @PROG_MAX_FLOWS@ -#define IPCP_ACCEPT_TIMEOUT @IPCP_ACCEPT_TIMEOUT@ -  #define SOCKET_TIMEOUT      @SOCKET_TIMEOUT@  #define CONNECT_TIMEOUT     @CONNECT_TIMEOUT@ diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index f8df5640..8640bf6e 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -71,29 +71,6 @@ struct cmd {          int              fd;  }; -static void ipcp_sig_handler(int         sig, -                             siginfo_t * info, -                             void *      c) -{ -        (void) c; - -        switch(sig) { -        case SIGINT: -        case SIGTERM: -        case SIGHUP: -        case SIGQUIT: -                if (info->si_pid == ipcpi.irmd_pid) { -                        if (ipcp_get_state() == IPCP_INIT) -                                ipcp_set_state(IPCP_NULL); - -                        if (ipcp_get_state() == IPCP_OPERATIONAL) -                                ipcp_set_state(IPCP_SHUTDOWN); -                } -        default: -                return; -        } -} -  uint8_t * ipcp_hash_dup(const uint8_t * hash)  {          uint8_t * dup = malloc(hash_len(ipcpi.dir_hash_algo)); @@ -120,28 +97,23 @@ void ipcp_hash_str(char *          buf,          buf[2 * i] = '\0';  } +static void close_ptr(void * o) +{ +        close(*((int *) o)); +} +  static void * acceptloop(void * o)  {          int            csockfd;          struct timeval tv = {(SOCKET_TIMEOUT / 1000),                               (SOCKET_TIMEOUT % 1000) * 1000}; -#if defined(__FreeBSD__) || defined(__APPLE__) -        fd_set         fds; -        struct timeval timeout = {(IPCP_ACCEPT_TIMEOUT / 1000), -                                  (IPCP_ACCEPT_TIMEOUT % 1000) * 1000}; -#endif +          (void) o;          while (ipcp_get_state() != IPCP_SHUTDOWN &&                 ipcp_get_state() != IPCP_NULL) {                  struct cmd * cmd; -#if defined(__FreeBSD__) || defined(__APPLE__) -                FD_ZERO(&fds); -                FD_SET(ipcpi.sockfd, &fds); -                if (select(ipcpi.sockfd + 1, &fds, NULL, NULL, &timeout) <= 0) -                        continue; -#endif                  csockfd = accept(ipcpi.sockfd, 0, 0);                  if (csockfd < 0)                          continue; @@ -157,7 +129,14 @@ static void * acceptloop(void * o)                          break;                  } +                pthread_cleanup_push(close_ptr, &csockfd); +                pthread_cleanup_push(free, cmd); +                  cmd->len = read(csockfd, cmd->cbuf, SOCK_BUF_SIZE); + +                pthread_cleanup_pop(false); +                pthread_cleanup_pop(false); +                  if (cmd->len <= 0) {                          log_err("Failed to read from socket.");                          close(csockfd); @@ -179,11 +158,6 @@ static void * acceptloop(void * o)          return (void *) 0;  } -static void close_ptr(void * o) -{ -        close(*((int *) o)); -} -  static void free_msg(void * o)  {          ipcp_msg__free_unpacked((ipcp_msg_t *) o, NULL); @@ -572,8 +546,6 @@ int ipcp_init(int               argc,  {          bool               log;          pthread_condattr_t cattr; -        struct timeval     tv  = {(IPCP_ACCEPT_TIMEOUT / 1000), -                                  (IPCP_ACCEPT_TIMEOUT % 1000) * 1000};          int                ret = -1;          if (parse_args(argc, argv, &log)) @@ -594,10 +566,6 @@ int ipcp_init(int               argc,                  goto fail_serv_sock;          } -        if (setsockopt(ipcpi.sockfd, SOL_SOCKET, SO_RCVTIMEO, -                       (void *) &tv, sizeof(tv))) -                log_warn("Failed to set timeout on socket."); -          ipcpi.ops = ops;          if (pthread_mutex_init(&ipcpi.state_mtx, NULL)) { @@ -668,7 +636,6 @@ int ipcp_init(int               argc,  int ipcp_boot()  { -        struct sigaction sig_act;          sigset_t  sigset;          sigemptyset(&sigset);          sigaddset(&sigset, SIGINT); @@ -676,18 +643,6 @@ int ipcp_boot()          sigaddset(&sigset, SIGHUP);          sigaddset(&sigset, SIGPIPE); -        /* init sig_act */ -        memset(&sig_act, 0, sizeof(sig_act)); - -        /* install signal traps */ -        sig_act.sa_sigaction = &ipcp_sig_handler; -        sig_act.sa_flags     = SA_SIGINFO; - -        sigaction(SIGINT,  &sig_act, NULL); -        sigaction(SIGTERM, &sig_act, NULL); -        sigaction(SIGHUP,  &sig_act, NULL); -        sigaction(SIGPIPE, &sig_act, NULL); -          ipcpi.tpm = tpm_create(IPCP_MIN_THREADS, IPCP_ADD_THREADS,                                 mainloop, NULL);          if (ipcpi.tpm == NULL) @@ -706,8 +661,6 @@ int ipcp_boot()                  goto fail_acceptor;          } -        pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); -          return 0;   fail_acceptor: @@ -720,6 +673,45 @@ int ipcp_boot()  void ipcp_shutdown()  { +        siginfo_t info; +        sigset_t  sigset; + +        sigemptyset(&sigset); +        sigaddset(&sigset, SIGINT); +        sigaddset(&sigset, SIGQUIT); +        sigaddset(&sigset, SIGHUP); +        sigaddset(&sigset, SIGTERM); +        sigaddset(&sigset, SIGPIPE); + +        while(ipcp_get_state() != IPCP_NULL && +              ipcp_get_state() != IPCP_SHUTDOWN) { +                if (sigwaitinfo(&sigset, &info) < 0) { +                        log_warn("Bad signal."); +                        continue; +                } + +                switch(info.si_signo) { +                case SIGINT: +                case SIGTERM: +                case SIGHUP: +                case SIGQUIT: +                        if (info.si_pid == ipcpi.irmd_pid) { +                                if (ipcp_get_state() == IPCP_INIT) +                                        ipcp_set_state(IPCP_NULL); + +                                if (ipcp_get_state() == IPCP_OPERATIONAL) +                                        ipcp_set_state(IPCP_SHUTDOWN); +                        } +                        break; +                case SIGPIPE: +                        log_dbg("Ignored SIGPIPE."); +                default: +                        continue; +                } +        } + +        pthread_cancel(ipcpi.acceptor); +          pthread_join(ipcpi.acceptor, NULL);          tpm_stop(ipcpi.tpm);          tpm_destroy(ipcpi.tpm); diff --git a/src/irmd/CMakeLists.txt b/src/irmd/CMakeLists.txt index 458e1efa..59d0d103 100644 --- a/src/irmd/CMakeLists.txt +++ b/src/irmd/CMakeLists.txt @@ -4,8 +4,6 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})  include_directories(${CMAKE_SOURCE_DIR}/include)  include_directories(${CMAKE_BINARY_DIR}/include) -set(IRMD_ACCEPT_TIMEOUT 100 CACHE STRING -  "Timeout for accept in IRMD mainloop threads (ms)")  set(IRMD_REQ_ARR_TIMEOUT 500 CACHE STRING    "Timeout for an application to respond to a new flow (ms)")  set(IRMD_FLOW_TIMEOUT 5000 CACHE STRING diff --git a/src/irmd/config.h.in b/src/irmd/config.h.in index 0ac961f8..a4c7128e 100644 --- a/src/irmd/config.h.in +++ b/src/irmd/config.h.in @@ -33,7 +33,6 @@  #define SOCKET_TIMEOUT          @SOCKET_TIMEOUT@ -#define IRMD_ACCEPT_TIMEOUT     @IRMD_ACCEPT_TIMEOUT@  #define IRMD_REQ_ARR_TIMEOUT    @IRMD_REQ_ARR_TIMEOUT@  #define IRMD_FLOW_TIMEOUT       @IRMD_FLOW_TIMEOUT@ diff --git a/src/irmd/main.c b/src/irmd/main.c index d3f7a09e..673e47db 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1661,32 +1661,6 @@ static void irm_fini(void)  #endif  } -void irmd_sig_handler(int         sig, -                      siginfo_t * info, -                      void *      c) -{ -        (void) info; -        (void) c; - -        switch(sig) { -        case SIGINT: -        case SIGTERM: -        case SIGHUP: -                if (irmd_get_state() == IRMD_NULL) { -                        log_info("Patience is bitter, but its fruit is sweet."); -                        return; -                } - -                log_info("IRMd shutting down..."); -                irmd_set_state(IRMD_NULL); -                break; -        case SIGPIPE: -                log_dbg("Ignored SIGPIPE."); -        default: -                return; -        } -} -  void * irm_sanitize(void * o)  {          struct timespec now; @@ -1808,27 +1782,22 @@ void * irm_sanitize(void * o)          }  } +static void close_ptr(void * o) +{ +        close(*((int *) o)); +} +  static void * acceptloop(void * o)  {          int            csockfd;          struct timeval tv = {(SOCKET_TIMEOUT / 1000),                               (SOCKET_TIMEOUT % 1000) * 1000}; -#if defined(__FreeBSD__) || defined(__APPLE__) -        fd_set         fds; -        struct timeval timeout = {(IRMD_ACCEPT_TIMEOUT / 1000), -                                  (IRMD_ACCEPT_TIMEOUT % 1000) * 1000}; -#endif +          (void) o;          while (irmd_get_state() == IRMD_RUNNING) {                  struct cmd * cmd; -#if defined(__FreeBSD__) || defined(__APPLE__) -                FD_ZERO(&fds); -                FD_SET(irmd.sockfd, &fds); -                if (select(irmd.sockfd + 1, &fds, NULL, NULL, &timeout) <= 0) -                        continue; -#endif                  csockfd = accept(irmd.sockfd, 0, 0);                  if (csockfd < 0)                          continue; @@ -1844,7 +1813,14 @@ static void * acceptloop(void * o)                          break;                  } +                pthread_cleanup_push(close_ptr, &csockfd); +                pthread_cleanup_push(free, cmd); +                  cmd->len = read(csockfd, cmd->cbuf, SOCK_BUF_SIZE); + +                pthread_cleanup_pop(false); +                pthread_cleanup_pop(false); +                  if (cmd->len <= 0) {                          log_err("Failed to read from socket.");                          close(csockfd); @@ -1866,11 +1842,6 @@ static void * acceptloop(void * o)          return (void *) 0;  } -static void close_ptr(void * o) -{ -        close(*((int *) o)); -} -  static void free_msg(void * o)  {          irm_msg__free_unpacked((irm_msg_t *) o, NULL); @@ -2091,8 +2062,6 @@ static void * mainloop(void * o)  static int irm_init(void)  {          struct stat        st; -        struct timeval     timeout = {(IRMD_ACCEPT_TIMEOUT / 1000), -                                      (IRMD_ACCEPT_TIMEOUT % 1000) * 1000};          pthread_condattr_t cattr;          memset(&st, 0, sizeof(st)); @@ -2185,15 +2154,9 @@ static int irm_init(void)                  goto fail_sock_path;          } -        if (setsockopt(irmd.sockfd, SOL_SOCKET, SO_RCVTIMEO, -                       (char *) &timeout, sizeof(timeout)) < 0) { -                log_err("Failed setting socket option."); -                goto fail_sock_opt; -        } -          if (chmod(IRM_SOCK_PATH, 0666)) {                  log_err("Failed to chmod socket."); -                goto fail_sock_opt; +                goto fail_sock_path;          }          if ((irmd.rdrb = shm_rdrbuff_create()) == NULL) { @@ -2225,8 +2188,6 @@ static int irm_init(void)          shm_rdrbuff_destroy(irmd.rdrb);  #endif   fail_rdrbuff: -        shm_rdrbuff_destroy(irmd.rdrb); - fail_sock_opt:          close(irmd.sockfd);   fail_sock_path:          unlink(IRM_SOCK_PATH); @@ -2259,14 +2220,15 @@ static void usage(void)  int main(int     argc,           char ** argv)  { -        struct sigaction sig_act;          sigset_t  sigset; -        bool use_stdout = false; +        bool      use_stdout = false; +        int       sig;          sigemptyset(&sigset);          sigaddset(&sigset, SIGINT);          sigaddset(&sigset, SIGQUIT);          sigaddset(&sigset, SIGHUP); +        sigaddset(&sigset, SIGTERM);          sigaddset(&sigset, SIGPIPE);          argc--; @@ -2293,22 +2255,6 @@ int main(int     argc,                  exit(EXIT_FAILURE);          } -        /* Init sig_act. */ -        memset(&sig_act, 0, sizeof sig_act); - -        /* Install signal traps. */ -        sig_act.sa_sigaction = &irmd_sig_handler; -        sig_act.sa_flags     = SA_SIGINFO; - -        if (sigaction(SIGINT,  &sig_act, NULL) < 0) -                exit(EXIT_FAILURE); -        if (sigaction(SIGTERM, &sig_act, NULL) < 0) -                exit(EXIT_FAILURE); -        if (sigaction(SIGHUP,  &sig_act, NULL) < 0) -                exit(EXIT_FAILURE); -        if (sigaction(SIGPIPE, &sig_act, NULL) < 0) -                exit(EXIT_FAILURE); -          log_init(!use_stdout);          if (irm_init() < 0) @@ -2321,6 +2267,8 @@ int main(int     argc,                  goto fail_tpm_create;          } +        pthread_sigmask(SIG_BLOCK, &sigset, NULL); +          if (tpm_start(irmd.tpm)) {                  irmd_set_state(IRMD_NULL);                  goto fail_tpm_start; @@ -2336,6 +2284,30 @@ int main(int     argc,                  goto fail_acceptor;          } +        while (irmd_get_state() != IRMD_NULL) { +                if (sigwait(&sigset, &sig) != 0) { +                        log_warn("Bad signal."); +                        continue; +                } + +                switch(sig) { +                case SIGINT: +                case SIGQUIT: +                case SIGTERM: +                case SIGHUP: +                        log_info("IRMd shutting down..."); +                        irmd_set_state(IRMD_NULL); +                        break; +                case SIGPIPE: +                        log_dbg("Ignored SIGPIPE."); +                        break; +                default: +                        break; +                } +        } + +        pthread_cancel(irmd.acceptor); +          pthread_join(irmd.acceptor, NULL);          pthread_join(irmd.irm_sanitize, NULL); @@ -2343,8 +2315,6 @@ int main(int     argc,          tpm_destroy(irmd.tpm); -        pthread_sigmask(SIG_BLOCK, &sigset, NULL); -          irm_fini();          pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); | 
