#include #include int ngx_max_sockets; int ngx_inherited_nonblocking; void ngx_signal_handler(int signo); void ngx_exit_signal_handler(int signo); void ngx_restart_signal_handler(int signo); void ngx_rotate_signal_handler(int signo); typedef struct { int signo; char *signame; char *action; void (*handler)(int signo); } ngx_signal_t; ngx_signal_t signals[] = { { ngx_signal_value(NGX_RESTART_SIGNAL), "SIG" ngx_value(NGX_RESTART_SIGNAL), "restarting", ngx_signal_handler }, { ngx_signal_value(NGX_ROTATE_SIGNAL), "SIG" ngx_value(NGX_ROTATE_SIGNAL), "reopen logs", ngx_signal_handler }, { ngx_signal_value(NGX_INTERRUPT_SIGNAL), "SIG" ngx_value(NGX_INTERRUPT_SIGNAL), "exiting", ngx_signal_handler }, { ngx_signal_value(NGX_SHUTDOWN_SIGNAL), "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL), "shutdowning", ngx_signal_handler }, { SIGCHLD, "SIGCHLD", NULL, ngx_sigchld_handler }, { SIGPIPE, "SIGPIPE, SIG_IGN", NULL, SIG_IGN }, { 0, NULL, NULL, NULL } }; int ngx_posix_init(ngx_log_t *log) { ngx_signal_t *sig; struct rlimit rlmt; struct sigaction sa; for (sig = signals; sig->signo != 0; sig++) { ngx_memzero(&sa, sizeof(struct sigaction)); sa.sa_handler = sig->handler; sigemptyset(&sa.sa_mask); if (sigaction(sig->signo, &sa, NULL) == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "sigaction(%s) failed", sig->signame); return NGX_ERROR; } } if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { ngx_log_error(NGX_LOG_ALERT, log, errno, "getrlimit(RLIMIT_NOFILE) failed)"); return NGX_ERROR; } ngx_log_error(NGX_LOG_INFO, log, 0, "getrlimit(RLIMIT_NOFILE): " RLIM_T_FMT ":" RLIM_T_FMT, rlmt.rlim_cur, rlmt.rlim_max); ngx_max_sockets = rlmt.rlim_cur; #if (HAVE_INHERITED_NONBLOCK) ngx_inherited_nonblocking = 1; #else ngx_inherited_nonblocking = 0; #endif return NGX_OK; } void ngx_signal_handler(int signo) { ngx_signal_t *sig; for (sig = signals; sig->signo != 0; sig++) { if (sig->signo == signo) { break; } } #if (HAVE_STRSIGNAL) ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, "signal #%d (%s: %s) received, %s", signo, sig->signame, strsignal(signo), sig->action); #else ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, "signal #%d (%s) received, %s", signo, sig->signame, sig->action); #endif switch (signo) { /* STUB */ case SIGQUIT: case SIGABRT: case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): case ngx_signal_value(NGX_INTERRUPT_SIGNAL): done = 1; break; case ngx_signal_value(NGX_RESTART_SIGNAL): restart = 1; break; case ngx_signal_value(NGX_ROTATE_SIGNAL): rotate = 1; break; } } void ngx_exit_signal_handler(int signo) { char *s; s = strsignal(signo); ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, "%s signal received, exiting", s); done = 1; } void ngx_restart_signal_handler(int signo) { restart = 1; } void ngx_rotate_signal_handler(int signo) { rotate = 1; } int ngx_posix_post_conf_init(ngx_log_t *log) { ngx_fd_t pp[2]; if (pipe(pp) == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed"); return NGX_ERROR; } if (dup2(pp[1], STDERR_FILENO) == -1) { ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed"); return NGX_ERROR; } if (pp[1] > STDERR_FILENO) { if (close(pp[1]) == -1) { ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed"); return NGX_ERROR; } } return NGX_OK; }