Mercurial > hg > nginx
comparison 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 |
comparison
equal
deleted
inserted
replaced
460:5f8319142dfc | 461:a88a3e4e158f |
---|---|
12 | 12 |
13 void ngx_event_acceptex(ngx_event_t *rev) | 13 void ngx_event_acceptex(ngx_event_t *rev) |
14 { | 14 { |
15 ngx_connection_t *c; | 15 ngx_connection_t *c; |
16 | 16 |
17 c = (ngx_connection_t *) rev->data; | 17 c = rev->data; |
18 | |
19 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd); | |
18 | 20 |
19 if (rev->ovlp.error) { | 21 if (rev->ovlp.error) { |
20 ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error, | 22 ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error, |
21 "AcceptEx() %s failed", c->listening->addr_text.data); | 23 "AcceptEx() %V failed", &c->listening->addr_text); |
22 return; | 24 return; |
23 } | 25 } |
24 | 26 |
25 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ | 27 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ |
26 | 28 |
27 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, | 29 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, |
28 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) | 30 (char *) &c->listening->fd, sizeof(ngx_socket_t)) == -1) |
29 { | 31 { |
30 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, | 32 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, |
31 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", | 33 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V", |
32 c->addr_text.data); | 34 &c->addr_text); |
33 } else { | 35 } else { |
34 c->accept_context_updated = 1; | 36 c->accept_context_updated = 1; |
35 } | 37 } |
36 | 38 |
37 getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size, | 39 getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size, |
45 c->buffer->end = c->buffer->start | 47 c->buffer->end = c->buffer->start |
46 + c->listening->post_accept_buffer_size; | 48 + c->listening->post_accept_buffer_size; |
47 | 49 |
48 } else { | 50 } else { |
49 c->buffer = NULL; | 51 c->buffer = NULL; |
52 } | |
53 | |
54 if (c->listening->addr_ntop) { | |
55 c->addr_text.data = ngx_palloc(c->pool, | |
56 c->listening->addr_text_max_len); | |
57 if (c->addr_text.data == NULL) { | |
58 /* TODO: close socket */ | |
59 return; | |
60 } | |
61 | |
62 c->addr_text.len = ngx_sock_ntop(c->listening->family, c->sockaddr, | |
63 c->addr_text.data, | |
64 c->listening->addr_text_max_len); | |
65 if (c->addr_text.len == 0) { | |
66 /* TODO: close socket */ | |
67 return; | |
68 } | |
50 } | 69 } |
51 | 70 |
52 ngx_event_post_acceptex(c->listening, 1); | 71 ngx_event_post_acceptex(c->listening, 1); |
53 | 72 |
54 c->number = ngx_atomic_inc(ngx_connection_counter); | 73 c->number = ngx_atomic_inc(ngx_connection_counter); |
71 | 90 |
72 for (i = 0; i < n; i++) { | 91 for (i = 0; i < n; i++) { |
73 | 92 |
74 /* TODO: look up reused sockets */ | 93 /* TODO: look up reused sockets */ |
75 | 94 |
76 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); | 95 s = ngx_socket(ls->family, ls->type, ls->protocol); |
77 | 96 |
78 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ls->log, 0, | 97 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ls->log, 0, |
79 ngx_socket_n " s:%d fl:%d", s, ls->flags); | 98 ngx_socket_n " s:%d", s); |
80 | 99 |
81 if (s == -1) { | 100 if (s == -1) { |
82 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, | 101 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, |
83 ngx_socket_n " for AcceptEx() %s post failed", | 102 ngx_socket_n " for AcceptEx() %s post failed", |
84 ls->addr_text.data); | 103 ls->addr_text.data); |
105 | 124 |
106 ngx_memzero(c, sizeof(ngx_connection_t)); | 125 ngx_memzero(c, sizeof(ngx_connection_t)); |
107 ngx_memzero(rev, sizeof(ngx_event_t)); | 126 ngx_memzero(rev, sizeof(ngx_event_t)); |
108 ngx_memzero(wev, sizeof(ngx_event_t)); | 127 ngx_memzero(wev, sizeof(ngx_event_t)); |
109 | 128 |
110 rev->index = wev->index = NGX_INVALID_INDEX; | 129 c->listening = ls; |
130 | |
131 rev->index = NGX_INVALID_INDEX; | |
132 wev->index = NGX_INVALID_INDEX; | |
111 | 133 |
112 rev->ovlp.event = rev; | 134 rev->ovlp.event = rev; |
113 wev->ovlp.event = wev; | 135 wev->ovlp.event = wev; |
114 | 136 rev->event_handler = ngx_event_acceptex; |
115 rev->data = wev->data = c; | 137 |
138 rev->data = c; | |
139 wev->data = c; | |
140 | |
116 c->read = rev; | 141 c->read = rev; |
117 c->write = wev; | 142 c->write = wev; |
118 | 143 |
119 c->listening = ls; | |
120 c->fd = s; | 144 c->fd = s; |
145 c->unexpected_eof = 1; | |
146 | |
147 rev->ready = 1; | |
148 wev->write = 1; | |
149 wev->ready = 1; | |
121 | 150 |
122 c->ctx = ls->ctx; | 151 c->ctx = ls->ctx; |
123 c->servers = ls->servers; | 152 c->servers = ls->servers; |
124 | 153 |
125 c->unexpected_eof = 1; | 154 c->recv = ngx_recv; |
126 wev->write = 1; | 155 c->send_chain = ngx_send_chain; |
127 rev->event_handler = ngx_event_acceptex; | 156 |
128 | 157 if (!(c->pool = ngx_create_pool(ls->pool_size, ls->log))) { |
129 rev->ready = 1; | 158 return NGX_ERROR; |
130 wev->ready = 1; | 159 } |
131 | 160 |
132 ngx_test_null(c->pool, | 161 c->buffer = ngx_create_temp_buf(c->pool, |
133 ngx_create_pool(ls->pool_size, ls->log), | 162 ls->post_accept_buffer_size |
134 NGX_ERROR); | 163 + 2 * (c->listening->socklen + 16)); |
135 | 164 if (c->buffer == NULL) { |
136 ngx_test_null(c->buffer, | 165 return NGX_ERROR; |
137 ngx_create_temp_buf(c->pool, | 166 } |
138 ls->post_accept_buffer_size | 167 |
139 + 2 * (c->listening->socklen + 16)), | 168 if (!(c->local_sockaddr = ngx_palloc(c->pool, ls->socklen))) { |
140 NGX_ERROR); | 169 return NGX_ERROR; |
141 | 170 } |
142 ngx_test_null(c->local_sockaddr, ngx_palloc(c->pool, ls->socklen), | 171 |
143 NGX_ERROR); | 172 if (!(c->sockaddr = ngx_palloc(c->pool, ls->socklen))) { |
144 | 173 return NGX_ERROR; |
145 ngx_test_null(c->sockaddr, ngx_palloc(c->pool, ls->socklen), | 174 } |
146 NGX_ERROR); | 175 |
147 | 176 if (!(c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)))) { |
148 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), | 177 return NGX_ERROR; |
149 NGX_ERROR); | 178 } |
150 | 179 |
151 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); | 180 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); |
152 c->read->log = c->write->log = c->log; | 181 c->read->log = c->log; |
182 c->write->log = c->log; | |
153 | 183 |
154 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { | 184 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { |
155 return NGX_ERROR; | 185 return NGX_ERROR; |
156 } | 186 } |
157 | 187 |