summaryrefslogtreecommitdiffhomepage
path: root/src/event/ngx_event_acceptex.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-11-11 14:07:14 +0000
committerIgor Sysoev <igor@sysoev.ru>2004-11-11 14:07:14 +0000
commit1b73583ba2c0e4b72d951218827e0c621427d389 (patch)
tree9e4d204e2cce91560d5cb8908b8a1a9f2c1d92ee /src/event/ngx_event_acceptex.c
parentd6f24959428caed68a509a19ca4fd866d978a69c (diff)
downloadnginx-release-0.1.5.tar.gz
nginx-release-0.1.5.tar.bz2
nginx-0.1.5-RELEASE importrelease-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.
Diffstat (limited to 'src/event/ngx_event_acceptex.c')
-rw-r--r--src/event/ngx_event_acceptex.c94
1 files changed, 62 insertions, 32 deletions
diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c
index 9877b3b2e..486636b44 100644
--- 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_listening_t *ls, int n)
/* 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_listening_t *ls, int n)
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 = c;
+ wev->data = c;
- rev->data = wev->data = c;
c->read = rev;
c->write = wev;
- c->listening = ls;
c->fd = s;
-
- c->ctx = ls->ctx;
- c->servers = ls->servers;
-
c->unexpected_eof = 1;
- wev->write = 1;
- rev->event_handler = ngx_event_acceptex;
rev->ready = 1;
+ wev->write = 1;
wev->ready = 1;
- ngx_test_null(c->pool,
- ngx_create_pool(ls->pool_size, ls->log),
- NGX_ERROR);
+ c->ctx = ls->ctx;
+ c->servers = ls->servers;
+
+ c->recv = ngx_recv;
+ c->send_chain = ngx_send_chain;
+
+ 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;