Mercurial > hg > nginx
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;