Mercurial > hg > nginx-vendor-0-8
comparison src/core/ngx_connection.c @ 10:46833bd150cb NGINX_0_1_5
nginx 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.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 11 Nov 2004 00:00:00 +0300 |
parents | cc9f381affaa |
children | 74b1868dd3cd |
comparison
equal
deleted
inserted
replaced
9:77eee314ddbd | 10:46833bd150cb |
---|---|
28 | 28 |
29 if (!(addr_in = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in)))) { | 29 if (!(addr_in = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in)))) { |
30 return NULL; | 30 return NULL; |
31 } | 31 } |
32 | 32 |
33 #if (HAVE_SIN_LEN) | |
34 addr_in->sin_len = sizeof(struct sockaddr_in); | |
35 #endif | |
36 addr_in->sin_family = AF_INET; | 33 addr_in->sin_family = AF_INET; |
37 addr_in->sin_addr.s_addr = addr; | 34 addr_in->sin_addr.s_addr = addr; |
38 addr_in->sin_port = htons(port); | 35 addr_in->sin_port = htons(port); |
39 | 36 |
40 if (!(ls->addr_text.data = ngx_palloc(cf->pool, INET_ADDRSTRLEN + 6))) { | 37 |
38 ls->addr_text.data = ngx_palloc(cf->pool, | |
39 INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1); | |
40 if (ls->addr_text.data == NULL) { | |
41 return NULL; | 41 return NULL; |
42 } | 42 } |
43 | 43 |
44 len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, INET_ADDRSTRLEN); | 44 len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, INET_ADDRSTRLEN); |
45 ls->addr_text.len = ngx_snprintf((char *) ls->addr_text.data + len, | 45 |
46 6, ":%d", port); | 46 ls->addr_text.len = ngx_sprintf(ls->addr_text.data + len, ":%d", port) |
47 - ls->addr_text.data; | |
48 | |
47 | 49 |
48 ls->fd = (ngx_socket_t) -1; | 50 ls->fd = (ngx_socket_t) -1; |
49 ls->family = AF_INET; | 51 ls->family = AF_INET; |
50 ls->type = SOCK_STREAM; | 52 ls->type = SOCK_STREAM; |
51 ls->protocol = IPPROTO_IP; | 53 ls->protocol = IPPROTO_IP; |
52 #if (WIN32) | |
53 ls->flags = WSA_FLAG_OVERLAPPED; | |
54 #endif | |
55 ls->sockaddr = (struct sockaddr *) addr_in; | 54 ls->sockaddr = (struct sockaddr *) addr_in; |
56 ls->socklen = sizeof(struct sockaddr_in); | 55 ls->socklen = sizeof(struct sockaddr_in); |
57 ls->addr = offsetof(struct sockaddr_in, sin_addr); | 56 ls->addr = offsetof(struct sockaddr_in, sin_addr); |
58 ls->addr_text_max_len = INET_ADDRSTRLEN; | 57 ls->addr_text_max_len = INET_ADDRSTRLEN; |
59 | 58 |
61 } | 60 } |
62 | 61 |
63 | 62 |
64 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle) | 63 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle) |
65 { | 64 { |
65 size_t len; | |
66 ngx_uint_t i; | 66 ngx_uint_t i; |
67 ngx_listening_t *ls; | 67 ngx_listening_t *ls; |
68 struct sockaddr_in *addr_in; | 68 struct sockaddr_in *addr_in; |
69 | 69 |
70 ls = cycle->listening.elts; | 70 ls = cycle->listening.elts; |
93 "the inherited socket #%d has " | 93 "the inherited socket #%d has " |
94 "unsupported family", ls[i].fd); | 94 "unsupported family", ls[i].fd); |
95 ls[i].ignore = 1; | 95 ls[i].ignore = 1; |
96 continue; | 96 continue; |
97 } | 97 } |
98 | |
98 ls[i].addr_text_max_len = INET_ADDRSTRLEN; | 99 ls[i].addr_text_max_len = INET_ADDRSTRLEN; |
99 | 100 |
100 ls[i].addr_text.data = ngx_palloc(cycle->pool, ls[i].addr_text_max_len); | 101 |
102 ls[i].addr_text.data = ngx_palloc(cycle->pool, INET_ADDRSTRLEN - 1 | |
103 + sizeof(":65535") - 1); | |
101 if (ls[i].addr_text.data == NULL) { | 104 if (ls[i].addr_text.data == NULL) { |
102 return NGX_ERROR; | 105 return NGX_ERROR; |
103 } | 106 } |
104 | 107 |
105 ls[i].family = addr_in->sin_family; | 108 ls[i].family = addr_in->sin_family; |
106 ls[i].addr_text.len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr, | 109 len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr, |
107 ls[i].addr_text.data, | 110 ls[i].addr_text.data, INET_ADDRSTRLEN); |
108 ls[i].addr_text_max_len); | 111 if (len == 0) { |
109 if (ls[i].addr_text.len == 0) { | |
110 return NGX_ERROR; | 112 return NGX_ERROR; |
111 } | 113 } |
114 | |
115 ls[i].addr_text.len = ngx_sprintf(ls[i].addr_text.data + len, ":%d", | |
116 ntohs(addr_in->sin_port)) | |
117 - ls[i].addr_text.data; | |
112 } | 118 } |
113 | 119 |
114 return NGX_OK; | 120 return NGX_OK; |
115 } | 121 } |
116 | 122 |
155 /* TODO: deferred accept */ | 161 /* TODO: deferred accept */ |
156 | 162 |
157 continue; | 163 continue; |
158 } | 164 } |
159 | 165 |
160 s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol, | 166 s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol); |
161 ls[i].flags); | |
162 | 167 |
163 if (s == -1) { | 168 if (s == -1) { |
164 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | 169 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
165 ngx_socket_n " %s failed", ls[i].addr_text.data); | 170 ngx_socket_n " %V failed", &ls[i].addr_text); |
166 return NGX_ERROR; | 171 return NGX_ERROR; |
167 } | 172 } |
168 | 173 |
169 #if (WIN32) | 174 #if (NGX_WIN32) |
170 /* | 175 /* |
171 * Winsock assignes a socket number divisible by 4 | 176 * Winsock assignes a socket number divisible by 4 |
172 * so to find a connection we divide a socket number by 4. | 177 * so to find a connection we divide a socket number by 4. |
173 */ | 178 */ |
174 | 179 |
180 #endif | 185 #endif |
181 | 186 |
182 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, | 187 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, |
183 (const void *) &reuseaddr, sizeof(int)) == -1) { | 188 (const void *) &reuseaddr, sizeof(int)) == -1) { |
184 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | 189 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
185 "setsockopt(SO_REUSEADDR) %s failed", | 190 "setsockopt(SO_REUSEADDR) %V failed", |
186 ls[i].addr_text.data); | 191 &ls[i].addr_text); |
187 return NGX_ERROR; | 192 return NGX_ERROR; |
188 } | 193 } |
189 | 194 |
190 /* TODO: close on exit */ | 195 /* TODO: close on exit */ |
191 | 196 |
192 if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) { | 197 if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) { |
193 if (ngx_nonblocking(s) == -1) { | 198 if (ngx_nonblocking(s) == -1) { |
194 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | 199 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
195 ngx_nonblocking_n " %s failed", | 200 ngx_nonblocking_n " %V failed", |
196 ls[i].addr_text.data); | 201 &ls[i].addr_text); |
197 return NGX_ERROR; | 202 return NGX_ERROR; |
198 } | 203 } |
199 } | 204 } |
200 | 205 |
201 #if 0 | 206 #if 0 |
202 if (ls[i].nonblocking) { | 207 if (ls[i].nonblocking) { |
203 if (ngx_nonblocking(s) == -1) { | 208 if (ngx_nonblocking(s) == -1) { |
204 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | 209 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
205 ngx_nonblocking_n " %s failed", | 210 ngx_nonblocking_n " %V failed", |
206 ls[i].addr_text.data); | 211 &ls[i].addr_text); |
207 return NGX_ERROR; | 212 return NGX_ERROR; |
208 } | 213 } |
209 } | 214 } |
210 #endif | 215 #endif |
211 | 216 |
212 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { | 217 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { |
213 err = ngx_socket_errno; | 218 err = ngx_socket_errno; |
214 ngx_log_error(NGX_LOG_EMERG, log, err, | 219 ngx_log_error(NGX_LOG_EMERG, log, err, |
215 "bind() to %s failed", ls[i].addr_text.data); | 220 "bind() to %V failed", &ls[i].addr_text); |
216 | 221 |
217 if (err != NGX_EADDRINUSE) | 222 if (err != NGX_EADDRINUSE) |
218 return NGX_ERROR; | 223 return NGX_ERROR; |
219 | 224 |
220 if (ngx_close_socket(s) == -1) | 225 if (ngx_close_socket(s) == -1) |
221 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | 226 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
222 ngx_close_socket_n " %s failed", | 227 ngx_close_socket_n " %V failed", |
223 ls[i].addr_text.data); | 228 &ls[i].addr_text); |
224 | 229 |
225 failed = 1; | 230 failed = 1; |
226 continue; | 231 continue; |
227 } | 232 } |
228 | 233 |
229 if (listen(s, ls[i].backlog) == -1) { | 234 if (listen(s, ls[i].backlog) == -1) { |
230 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | 235 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
231 "listen() to %s failed", ls[i].addr_text.data); | 236 "listen() to %V failed", &ls[i].addr_text); |
232 return NGX_ERROR; | 237 return NGX_ERROR; |
233 } | 238 } |
234 | 239 |
235 /* TODO: deferred accept */ | 240 /* TODO: deferred accept */ |
236 | 241 |
271 | 276 |
272 ls = cycle->listening.elts; | 277 ls = cycle->listening.elts; |
273 for (i = 0; i < cycle->listening.nelts; i++) { | 278 for (i = 0; i < cycle->listening.nelts; i++) { |
274 fd = ls[i].fd; | 279 fd = ls[i].fd; |
275 | 280 |
276 #if (WIN32) | 281 #if (NGX_WIN32) |
277 /* | 282 /* |
278 * Winsock assignes a socket number divisible by 4 | 283 * Winsock assignes a socket number divisible by 4 |
279 * so to find a connection we divide a socket number by 4. | 284 * so to find a connection we divide a socket number by 4. |
280 */ | 285 */ |
281 | 286 |
294 } | 299 } |
295 } | 300 } |
296 | 301 |
297 if (ngx_close_socket(ls[i].fd) == -1) { | 302 if (ngx_close_socket(ls[i].fd) == -1) { |
298 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, | 303 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, |
299 ngx_close_socket_n " %s failed", | 304 ngx_close_socket_n " %V failed", &ls[i].addr_text); |
300 ls[i].addr_text.data); | |
301 } | 305 } |
302 | 306 |
303 cycle->connections[fd].fd = (ngx_socket_t) -1; | 307 cycle->connections[fd].fd = (ngx_socket_t) -1; |
304 } | 308 } |
305 } | 309 } |
406 { | 410 { |
407 return 0; | 411 return 0; |
408 } | 412 } |
409 | 413 |
410 if (err == NGX_ECONNRESET | 414 if (err == NGX_ECONNRESET |
411 #if !(WIN32) | 415 #if !(NGX_WIN32) |
412 || err == NGX_EPIPE | 416 || err == NGX_EPIPE |
413 #endif | 417 #endif |
414 || err == NGX_ENOTCONN | 418 || err == NGX_ENOTCONN |
415 || err == NGX_ECONNREFUSED | 419 || err == NGX_ECONNREFUSED |
416 || err == NGX_EHOSTUNREACH) | 420 || err == NGX_EHOSTUNREACH) |