#include #include #include #include #include #include #include "server.h" #include "dir.h" #include "acl.h" #include "sig.h" static pthread_t sig_handler_thd; static sigset_t sig_set; static void * _sig_handler(void *arg) { ECPSocket *sock = arg; int rv, sig; while (1) { rv = sigwait(&sig_set, &sig); if (rv) { LOG(LOG_ERR, "sig_handler: sigwait error\n"); continue; } switch (sig) { case SIGUSR1: { rv = acl_load(); if (rv) { LOG(LOG_ERR, "sig_handler: acl load err:%d\n", rv); continue; } LOG(LOG_DEBUG, "sig_handler: acl reloaded - total keys:%u dir keys:%u\n", acl_count(), acl_dir_count()); break; } case SIGUSR2: { ecp_sock_expire(sock, conn_expired); LOG(LOG_DEBUG, "sig_handler: gc done - inbound connection count:%u\n", ecp_sock_gct_count(sock)); break; } default: { LOG(LOG_DEBUG, "sig_handler: unknown signal:%d\n", sig); break; } } } return NULL; } int sig_start_handler(ECPSocket *sock) { int rv; rv = pthread_create(&sig_handler_thd, NULL, &_sig_handler, sock); if (rv) return ECP_ERR; return ECP_OK; } int sig_init(void) { int rv; sigemptyset(&sig_set); sigaddset(&sig_set, SIGUSR1); sigaddset(&sig_set, SIGUSR2); sigaddset(&sig_set, SIGHUP); rv = pthread_sigmask(SIG_BLOCK, &sig_set, NULL); if (rv) return ECP_ERR; return ECP_OK; }