diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2004-11-11 14:07:14 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2004-11-11 14:07:14 +0000 |
| commit | 1b73583ba2c0e4b72d951218827e0c621427d389 (patch) | |
| tree | 9e4d204e2cce91560d5cb8908b8a1a9f2c1d92ee /src/event/ngx_event_acceptex.c | |
| parent | d6f24959428caed68a509a19ca4fd866d978a69c (diff) | |
| download | nginx-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.c | 94 |
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; |
