diff src/core/ngx_cycle.c @ 10:46833bd150cb NGINX_0_1_5

nginx 0.1.5 *) Bugfix: on Solaris and Linux there may be too many "recvmsg() returned not enough data" alerts. *) Bugfix: there were the "writev() failed (22: Invalid argument)" errors on Solaris in proxy mode without sendfile. On other platforms that do not support sendfile at all the process got caught in an endless loop. *) Bugfix: segmentation fault on Solaris in proxy mode and using sendfile. *) Bugfix: segmentation fault on Solaris. *) Bugfix: on-line upgrade did not work on Linux. *) Bugfix: the ngx_http_autoindex_module module did not escape the spaces, the quotes, and the percent signs in the directory listing. *) Change: the decrease of the copy operations. *) Feature: the userid_p3p directive.
author Igor Sysoev <http://sysoev.ru>
date Thu, 11 Nov 2004 00:00:00 +0300
parents 4b2dafa26fe2
children 74b1868dd3cd
line wrap: on
line diff
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -9,6 +9,7 @@
 #include <ngx_event.h>
 
 
+static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *s1, struct sockaddr *s2);
 static void ngx_clean_old_cycles(ngx_event_t *ev);
 
 
@@ -195,7 +196,7 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
     failed = 0;
 
 
-#if !(WIN32)
+#if !(NGX_WIN32)
     if (ngx_create_pidfile(cycle, old_cycle) == NGX_ERROR) {
         failed = 1;
     }
@@ -204,6 +205,8 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 
     if (!failed) {
 
+        /* open the new files */
+
         part = &cycle->open_files.part;
         file = part->elts;
 
@@ -227,7 +230,7 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
                                        NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
 
             ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
-                           "log: %0X %d \"%s\"",
+                           "log: %p %d \"%s\"",
                            &file[i], file[i].fd, file[i].name.data);
 
             if (file[i].fd == NGX_INVALID_FILE) {
@@ -238,7 +241,7 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
                 break;
             }
 
-#if (WIN32)
+#if (NGX_WIN32)
             if (ngx_file_append_mode(file[i].fd) == NGX_ERROR) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                               ngx_file_append_mode_n " \"%s\" failed",
@@ -266,6 +269,9 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
     }
 
     if (!failed) {
+
+        /* handle the listening sockets */
+
         if (old_cycle->listening.nelts) {
             ls = old_cycle->listening.elts;
             for (i = 0; i < old_cycle->listening.nelts; i++) {
@@ -274,16 +280,17 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 
             nls = cycle->listening.elts;
             for (n = 0; n < cycle->listening.nelts; n++) {
+
                 for (i = 0; i < old_cycle->listening.nelts; i++) {
                     if (ls[i].ignore) {
                         continue;
                     }
 
-                    if (ngx_memcmp(nls[n].sockaddr,
-                                   ls[i].sockaddr, ls[i].socklen) == 0)
+                    if (ngx_cmp_sockaddr(nls[n].sockaddr, ls[i].sockaddr)
+                                                                     == NGX_OK)
                     {
                         fd = ls[i].fd;
-#if (WIN32)
+#if (NGX_WIN32)
                         /*
                          * Winsock assignes a socket number divisible by 4 so
                          * to find a connection we divide a socket number by 4.
@@ -294,10 +301,10 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
                         if (fd >= (ngx_socket_t) cycle->connection_n) {
                             ngx_log_error(NGX_LOG_EMERG, log, 0,
                                         "%d connections is not enough to hold "
-                                        "an open listening socket on %s, "
+                                        "an open listening socket on %V, "
                                         "required at least %d connections",
                                         cycle->connection_n,
-                                        ls[i].addr_text.data, fd);
+                                        &ls[i].addr_text, fd);
                             failed = 1;
                             break;
                         }
@@ -372,8 +379,8 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 
             if (ngx_close_socket(ls[i].fd) == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              ngx_close_socket_n " %s failed",
-                              ls[i].addr_text.data);
+                              ngx_close_socket_n " %V failed",
+                              &ls[i].addr_text);
             }
         }
 
@@ -384,12 +391,12 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 
     /* commit the new cycle configuration */
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
     if (!ngx_test_config && cycle->log->file->fd != STDERR_FILENO) {
 
         ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
-                       "dup2: %0X %d \"%s\"",
+                       "dup2: %p %d \"%s\"",
                        cycle->log->file,
                        cycle->log->file->fd, cycle->log->file->name.data);
 
@@ -426,8 +433,8 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 
         if (ngx_close_socket(ls[i].fd) == -1) {
             ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                          ngx_close_socket_n " %s failed",
-                          ls[i].addr_text.data);
+                          ngx_close_socket_n " %V failed",
+                          &ls[i].addr_text);
         }
     }
 
@@ -512,13 +519,38 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 }
 
 
-#if !(WIN32)
+static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *s1, struct sockaddr *s2)
+{
+    struct sockaddr_in  *sin1, *sin2;
+
+    /* AF_INET only */
+
+    if (s1->sa_family != AF_INET || s2->sa_family != AF_INET) {
+        return NGX_DECLINED;
+    }
+
+    sin1 = (struct sockaddr_in *) s1;
+    sin2 = (struct sockaddr_in *) s2;
+
+    if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {
+        return NGX_DECLINED;
+    }
+
+    if (sin1->sin_port != sin2->sin_port) {
+        return NGX_DECLINED;
+    }
+
+    return NGX_OK;
+}
+
+
+#if !(NGX_WIN32)
 
 ngx_int_t ngx_create_pidfile(ngx_cycle_t *cycle, ngx_cycle_t *old_cycle)
 {
     ngx_uint_t        trunc;
     size_t            len;
-    u_char           *name, pid[NGX_INT64_LEN + 1];
+    u_char           *name, pid[NGX_INT64_LEN];
     ngx_file_t        file;
     ngx_core_conf_t  *ccf, *old_ccf;
 
@@ -548,8 +580,6 @@ ngx_int_t ngx_create_pidfile(ngx_cycle_t
         }
     }
 
-    len = ngx_snprintf((char *) pid, NGX_INT64_LEN + 1, PID_T_FMT, ngx_pid);
-
     ngx_memzero(&file, sizeof(ngx_file_t));
     file.name = (ngx_inherited && getppid() > 1) ? ccf->newpid : ccf->pid;
     file.log = cycle->log;
@@ -566,6 +596,8 @@ ngx_int_t ngx_create_pidfile(ngx_cycle_t
     }
 
     if (!ngx_test_config) {
+        len = ngx_sprintf(pid, "%P", ngx_pid) - pid;
+
         if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) {
             return NGX_ERROR;
         }
@@ -615,7 +647,7 @@ void ngx_reopen_files(ngx_cycle_t *cycle
     ngx_uint_t        i;
     ngx_list_part_t  *part;
     ngx_open_file_t  *file;
-#if !(WIN32)
+#if !(NGX_WIN32)
     ngx_file_info_t   fi;
 #endif
 
@@ -649,7 +681,7 @@ void ngx_reopen_files(ngx_cycle_t *cycle
             continue;
         }
 
-#if (WIN32)
+#if (NGX_WIN32)
         if (ngx_file_append_mode(fd) == NGX_ERROR) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
                           ngx_file_append_mode_n " \"%s\" failed",
@@ -730,7 +762,7 @@ void ngx_reopen_files(ngx_cycle_t *cycle
         file[i].fd = fd;
     }
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
     if (cycle->log->file->fd != STDERR_FILENO) {
         if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {