diff src/event/ngx_event_acceptex.c @ 461:a88a3e4e158f release-0.1.5

nginx-0.1.5-RELEASE import *) 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 <igor@sysoev.ru>
date Thu, 11 Nov 2004 14:07:14 +0000
parents 42d11f017717
children c52408583801
line wrap: on
line diff
--- a/src/event/ngx_event_acceptex.c
+++ b/src/event/ngx_event_acceptex.c
@@ -14,22 +14,24 @@ void ngx_event_acceptex(ngx_event_t *rev
 {
     ngx_connection_t  *c;
 
-    c = (ngx_connection_t *) rev->data;
+    c = rev->data;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd);
 
     if (rev->ovlp.error) {
         ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error,
-                      "AcceptEx() %s failed", c->listening->addr_text.data);
+                      "AcceptEx() %V failed", &c->listening->addr_text);
         return;
     }
 
     /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */
 
     if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
-                   (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1)
+                   (char *) &c->listening->fd, sizeof(ngx_socket_t)) == -1)
     {
         ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
-                      "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s",
-                      c->addr_text.data);
+                      "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V",
+                      &c->addr_text);
     } else {
         c->accept_context_updated = 1;
     }
@@ -49,6 +51,23 @@ void ngx_event_acceptex(ngx_event_t *rev
         c->buffer = NULL;
     }
 
+    if (c->listening->addr_ntop) {
+        c->addr_text.data = ngx_palloc(c->pool,
+                                       c->listening->addr_text_max_len);
+        if (c->addr_text.data == NULL) {
+            /* TODO: close socket */
+            return;
+        }
+
+        c->addr_text.len = ngx_sock_ntop(c->listening->family, c->sockaddr,
+                                         c->addr_text.data,
+                                         c->listening->addr_text_max_len);
+        if (c->addr_text.len == 0) {
+            /* TODO: close socket */
+            return;
+        }
+    }
+
     ngx_event_post_acceptex(c->listening, 1);
 
     c->number = ngx_atomic_inc(ngx_connection_counter);
@@ -73,10 +92,10 @@ int ngx_event_post_acceptex(ngx_listenin
 
         /* TODO: look up reused sockets */
 
-        s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags);
+        s = ngx_socket(ls->family, ls->type, ls->protocol);
 
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ls->log, 0,
-                       ngx_socket_n " s:%d fl:%d", s, ls->flags);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ls->log, 0,
+                       ngx_socket_n " s:%d", s);
 
         if (s == -1) {
             ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno,
@@ -107,49 +126,60 @@ int ngx_event_post_acceptex(ngx_listenin
         ngx_memzero(rev, sizeof(ngx_event_t));
         ngx_memzero(wev, sizeof(ngx_event_t));
 
-        rev->index = wev->index = NGX_INVALID_INDEX;
+        c->listening = ls;
+
+        rev->index = NGX_INVALID_INDEX;
+        wev->index = NGX_INVALID_INDEX;
 
         rev->ovlp.event = rev;
         wev->ovlp.event = wev;
+        rev->event_handler = ngx_event_acceptex;
 
-        rev->data = wev->data = c;
+        rev->data = c;
+        wev->data = c;
+
         c->read = rev;
         c->write = wev;
 
-        c->listening = ls;
         c->fd = s;
+        c->unexpected_eof = 1;
+
+        rev->ready = 1;
+        wev->write = 1;
+        wev->ready = 1;
 
         c->ctx = ls->ctx;
         c->servers = ls->servers;
 
-        c->unexpected_eof = 1;
-        wev->write = 1;
-        rev->event_handler = ngx_event_acceptex;
+        c->recv = ngx_recv;
+        c->send_chain = ngx_send_chain;
 
-        rev->ready = 1;
-        wev->ready = 1;
-
-        ngx_test_null(c->pool,
-                      ngx_create_pool(ls->pool_size, ls->log),
-                      NGX_ERROR);
+        if (!(c->pool = ngx_create_pool(ls->pool_size, ls->log))) {
+            return NGX_ERROR;
+        }
 
-        ngx_test_null(c->buffer,
-                      ngx_create_temp_buf(c->pool,
-                                          ls->post_accept_buffer_size
-                                          + 2 * (c->listening->socklen + 16)),
-                      NGX_ERROR);
+        c->buffer = ngx_create_temp_buf(c->pool,
+                                        ls->post_accept_buffer_size
+                                        + 2 * (c->listening->socklen + 16));
+        if (c->buffer == NULL) {
+            return NGX_ERROR;
+        }
 
-        ngx_test_null(c->local_sockaddr, ngx_palloc(c->pool, ls->socklen),
-                      NGX_ERROR);
+        if (!(c->local_sockaddr = ngx_palloc(c->pool, ls->socklen))) {
+            return NGX_ERROR;
+        }
 
-        ngx_test_null(c->sockaddr, ngx_palloc(c->pool, ls->socklen),
-                      NGX_ERROR);
+        if (!(c->sockaddr = ngx_palloc(c->pool, ls->socklen))) {
+            return NGX_ERROR;
+        }
 
-        ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)),
-                      NGX_ERROR);
+        if (!(c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)))) {
+            return NGX_ERROR;
+        }
 
         ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t));
-        c->read->log = c->write->log = c->log;
+        c->read->log = c->log;
+        c->write->log = c->log;
 
         if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) {
             return NGX_ERROR;