diff src/os/unix/ngx_posix_init.c @ 210:00cafae0bdf1

nginx-0.0.1-2003-12-14-23:10:27 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 14 Dec 2003 20:10:27 +0000
parents 8dee38ea9117
children 679f60139863
line wrap: on
line diff
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -7,48 +7,66 @@ 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)
 {
-    struct rlimit     rlmt;
-    struct sigaction  sa;
-
-    ngx_memzero(&sa, sizeof(struct sigaction));
-    sa.sa_handler = SIG_IGN;
-    sigemptyset(&sa.sa_mask);
-    if (sigaction(SIGPIPE, &sa, NULL) == -1) {
-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                      "sigaction(SIGPIPE, SIG_IGN) failed");
-        return NGX_ERROR;
-    }
+    ngx_signal_t      *sig;
+    struct rlimit      rlmt;
+    struct sigaction   sa;
 
-    ngx_memzero(&sa, sizeof(struct sigaction));
-    sa.sa_handler = ngx_sigchld_handler;
-    sigemptyset(&sa.sa_mask);
-    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                      "sigaction(SIGCHLD) failed");
-        return NGX_ERROR;
+    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;
+        }
     }
 
-    sa.sa_handler = ngx_restart_signal_handler;
-    if (sigaction(ngx_signal_value(NGX_RESTART_SIGNAL), &sa, NULL) == -1) {
-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                      "sigaction(SIG" ngx_value(NGX_RESTART_SIGNAL) ") failed");
-        return NGX_ERROR;
-    }
-
-    sa.sa_handler = ngx_rotate_signal_handler;
-    if (sigaction(ngx_signal_value(NGX_ROTATE_SIGNAL), &sa, NULL) == -1) {
-        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                      "sigaction(SIG" ngx_value(NGX_ROTATE_SIGNAL) ") failed");
-        return NGX_ERROR;
-    }
-
-
     if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
         ngx_log_error(NGX_LOG_ALERT, log, errno,
                       "getrlimit(RLIMIT_NOFILE) failed)");
@@ -71,6 +89,56 @@ int ngx_posix_init(ngx_log_t *log)
 }
 
 
+void ngx_signal_handler(int signo)
+{
+    char          *name;
+    ngx_signal_t  *sig;
+
+    for (sig = signals; sig->signo != 0; sig++) {
+        if (sig->signo == signo) {
+            break;
+        }
+    }
+
+    /* STUB */
+    name = strsignal(signo);
+    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,
+                  "signal #%d (%s: %s) received, %s",
+                  signo, sig->signame, name, sig->action);
+
+    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;