implement "-s signal" option for Unix
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 566f8f9..28fffa0 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -188,9 +188,7 @@
 static ngx_uint_t   ngx_show_configure;
 static u_char      *ngx_conf_file;
 static u_char      *ngx_conf_params;
-#if (NGX_WIN32)
 static char        *ngx_signal;
-#endif
 
 
 static char **ngx_os_environ;
@@ -213,20 +211,16 @@
 
         if (ngx_show_help) {
             ngx_log_stderr(
-                "Usage: nginx [-?hvVt]"
-#if (NGX_WIN32)
-                            " [-s signal]"
-#endif
-                            " [-c filename] [-g directives]" CRLF CRLF
+                "Usage: nginx [-?hvVt] [-s signal] [-c filename] "
+                             "[-g directives]" CRLF CRLF
                 "Options:" CRLF
                 "  -?,-h         : this help" CRLF
                 "  -v            : show version and exit" CRLF
                 "  -V            : show version and configure options then exit"
                                    CRLF
                 "  -t            : test configuration and exit" CRLF
-#if (NGX_WIN32)
-                "  -s signal     : send signal to a master process" CRLF
-#endif
+                "  -s signal     : send signal to a master process: "
+                                   "stop, quit, reopen, reload" CRLF
                 "  -c filename   : set configuration file (default: "
                                    NGX_CONF_PATH ")" CRLF
                 "  -g directives : set global directives out of configuration "
@@ -337,13 +331,11 @@
         ngx_process = NGX_PROCESS_MASTER;
     }
 
-#if (NGX_WIN32)
-
     if (ngx_signal) {
         return ngx_signal_process(cycle, ngx_signal);
     }
 
-#else
+#if !(NGX_WIN32)
 
     if (ngx_init_signals(cycle->log) != NGX_OK) {
         return 1;
@@ -685,7 +677,6 @@
                 ngx_log_stderr("the option \"-g\" requires parameter");
                 return NGX_ERROR;
 
-#if (NGX_WIN32)
             case 's':
                 if (*p) {
                     ngx_signal = (char *) p;
@@ -709,7 +700,6 @@
 
                 ngx_log_stderr("invalid option: \"-s %s\"", ngx_signal);
                 return NGX_ERROR;
-#endif
 
             default:
                 ngx_log_stderr("invalid option: \"%c\"", *(p - 1));
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index eae4c83..476ba83 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -569,12 +569,14 @@
         }
     }
 
-    if (ngx_open_listening_sockets(cycle) != NGX_OK) {
-        goto failed;
-    }
+    if (ngx_process != NGX_PROCESS_SIGNALLER) {
+        if (ngx_open_listening_sockets(cycle) != NGX_OK) {
+            goto failed;
+        }
 
-    if (!ngx_test_config) {
-        ngx_configure_listening_socket(cycle);
+        if (!ngx_test_config) {
+            ngx_configure_listening_socket(cycle);
+        }
     }
 
 
@@ -986,6 +988,58 @@
 }
 
 
+ngx_int_t
+ngx_signal_process(ngx_cycle_t *cycle, char *sig)
+{
+    ssize_t           n;
+    ngx_int_t         pid;
+    ngx_file_t        file;
+    ngx_core_conf_t  *ccf;
+    u_char            buf[NGX_INT64_LEN + 2];
+
+    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "signal process started");
+
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+    file.name = ccf->pid;
+    file.log = cycle->log;
+
+    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY,
+                            NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS);
+
+    if (file.fd == NGX_INVALID_FILE) {
+        ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno,
+                      ngx_open_file_n " \"%s\" failed", file.name.data);
+        return 1;
+    }
+
+    n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0);
+
+    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      ngx_close_file_n " \"%s\" failed", file.name.data);
+    }
+
+    if (n == NGX_ERROR) {
+        return 1;
+    }
+
+    while (n-- && (buf[n] == CR || buf[n] == LF)) { /* void */ }
+
+    pid = ngx_atoi(buf, ++n);
+
+    if (pid == NGX_ERROR) {
+        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,
+                      "invalid PID number \"%*s\" in \"%s\"",
+                      n, buf, file.name.data);
+        return 1;
+    }
+
+    return ngx_os_signal_process(cycle, sig, pid);
+
+}
+
+
 static ngx_int_t
 ngx_test_lockfile(u_char *file, ngx_log_t *log)
 {
diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h
index e7d6116..6ce2974 100644
--- a/src/core/ngx_cycle.h
+++ b/src/core/ngx_cycle.h
@@ -116,6 +116,7 @@
 ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);
 ngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log);
 void ngx_delete_pidfile(ngx_cycle_t *cycle);
+ngx_int_t ngx_signal_process(ngx_cycle_t *cycle, char *sig);
 void ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user);
 char **ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last);
 ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);