Mercurial > hg > nginx-vendor-current
comparison src/core/ngx_connection.c @ 486:6484cbba0222 NGINX_0_7_55
nginx 0.7.55
*) Bugfix: the http_XXX parameters in "proxy_cache_use_stale" and
"fastcgi_cache_use_stale" directives did not work.
*) Bugfix: fastcgi cache did not cache header only responses.
*) Bugfix: of "select() failed (9: Bad file descriptor)" error in
nginx/Unix and "select() failed (10022: ...)" error in nginx/Windows.
*) Bugfix: a segmentation fault might occur in worker process, if an
"debug_connection" directive was used; the bug had appeared in
0.7.54.
*) Bugfix: fix ngx_http_image_filter_module building errors.
*) Bugfix: the files bigger than 2G could not be transferred using
$r->sendfile.
Thanks to Maxim Dounin.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 06 May 2009 00:00:00 +0400 |
parents | ed5e10fb40fc |
children | 98143f74eb3d |
comparison
equal
deleted
inserted
replaced
485:21824e8058e6 | 486:6484cbba0222 |
---|---|
11 | 11 |
12 ngx_os_io_t ngx_io; | 12 ngx_os_io_t ngx_io; |
13 | 13 |
14 | 14 |
15 ngx_listening_t * | 15 ngx_listening_t * |
16 ngx_listening_inet_stream_socket(ngx_conf_t *cf, in_addr_t addr, in_port_t port) | 16 ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen) |
17 { | 17 { |
18 size_t len; | 18 ngx_listening_t *ls; |
19 ngx_listening_t *ls; | 19 struct sockaddr *sa; |
20 struct sockaddr_in *sin; | 20 u_char text[NGX_SOCKADDR_STRLEN]; |
21 | 21 |
22 ls = ngx_array_push(&cf->cycle->listening); | 22 ls = ngx_array_push(&cf->cycle->listening); |
23 if (ls == NULL) { | 23 if (ls == NULL) { |
24 return NULL; | 24 return NULL; |
25 } | 25 } |
26 | 26 |
27 ngx_memzero(ls, sizeof(ngx_listening_t)); | 27 ngx_memzero(ls, sizeof(ngx_listening_t)); |
28 | 28 |
29 sin = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in)); | 29 sa = ngx_palloc(cf->pool, socklen); |
30 if (sin == NULL) { | 30 if (sa == NULL) { |
31 return NULL; | 31 return NULL; |
32 } | 32 } |
33 | 33 |
34 sin->sin_family = AF_INET; | 34 ngx_memcpy(sa, sockaddr, socklen); |
35 sin->sin_addr.s_addr = addr; | 35 |
36 sin->sin_port = htons(port); | 36 ls->sockaddr = sa; |
37 | 37 ls->socklen = socklen; |
38 | 38 |
39 ls->addr_text.data = ngx_pnalloc(cf->pool, | 39 ls->addr_text.len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1); |
40 NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1); | 40 |
41 ls->addr_text.data = ngx_pnalloc(cf->pool, ls->addr_text.len); | |
41 if (ls->addr_text.data == NULL) { | 42 if (ls->addr_text.data == NULL) { |
42 return NULL; | 43 return NULL; |
43 } | 44 } |
44 | 45 |
45 len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, | 46 ngx_memcpy(ls->addr_text.data, text, ls->addr_text.len); |
46 NGX_INET_ADDRSTRLEN); | |
47 | |
48 ls->addr_text.len = ngx_sprintf(ls->addr_text.data + len, ":%d", port) | |
49 - ls->addr_text.data; | |
50 | 47 |
51 ls->fd = (ngx_socket_t) -1; | 48 ls->fd = (ngx_socket_t) -1; |
52 ls->type = SOCK_STREAM; | 49 ls->type = SOCK_STREAM; |
53 ls->sockaddr = (struct sockaddr *) sin; | 50 |
54 ls->socklen = sizeof(struct sockaddr_in); | 51 switch (ls->sockaddr->sa_family) { |
55 ls->addr_text_max_len = NGX_INET_ADDRSTRLEN; | 52 #if (NGX_HAVE_INET6) |
53 case AF_INET6: | |
54 ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN; | |
55 break; | |
56 #endif | |
57 case AF_INET: | |
58 ls->addr_text_max_len = NGX_INET_ADDRSTRLEN; | |
59 break; | |
60 default: | |
61 ls->addr_text_max_len = NGX_SOCKADDR_STRLEN; | |
62 break; | |
63 } | |
64 | |
65 ls->backlog = NGX_LISTEN_BACKLOG; | |
66 ls->rcvbuf = -1; | |
67 ls->sndbuf = -1; | |
56 | 68 |
57 return ls; | 69 return ls; |
58 } | 70 } |
59 | 71 |
60 | 72 |
246 | 258 |
247 if (ls[i].fd != -1) { | 259 if (ls[i].fd != -1) { |
248 continue; | 260 continue; |
249 } | 261 } |
250 | 262 |
251 ls[i].log = *ls[i].logp; | |
252 | |
253 if (ls[i].inherited) { | 263 if (ls[i].inherited) { |
254 | 264 |
255 /* TODO: close on exit */ | 265 /* TODO: close on exit */ |
256 /* TODO: nonblocking */ | 266 /* TODO: nonblocking */ |
257 /* TODO: deferred accept */ | 267 /* TODO: deferred accept */ |
293 | 303 |
294 if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, | 304 if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, |
295 (const void *) &ipv6only, sizeof(int)) | 305 (const void *) &ipv6only, sizeof(int)) |
296 == -1) | 306 == -1) |
297 { | 307 { |
298 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, | 308 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, |
299 "setsockopt(IPV6_V6ONLY) %V failed, ignored", | 309 "setsockopt(IPV6_V6ONLY) %V failed, ignored", |
300 &ls[i].addr_text); | 310 &ls[i].addr_text); |
301 } | 311 } |
302 } | 312 } |
303 #endif | 313 #endif |
317 | 327 |
318 return NGX_ERROR; | 328 return NGX_ERROR; |
319 } | 329 } |
320 } | 330 } |
321 | 331 |
322 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 332 ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0, |
323 "bind() %V #%d ", &ls[i].addr_text, s); | 333 "bind() %V #%d ", &ls[i].addr_text, s); |
324 | 334 |
325 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { | 335 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { |
326 err = ngx_socket_errno; | 336 err = ngx_socket_errno; |
327 | 337 |
386 return NGX_OK; | 396 return NGX_OK; |
387 } | 397 } |
388 | 398 |
389 | 399 |
390 void | 400 void |
391 ngx_configure_listening_socket(ngx_cycle_t *cycle) | 401 ngx_configure_listening_sockets(ngx_cycle_t *cycle) |
392 { | 402 { |
393 ngx_uint_t i; | 403 ngx_uint_t i; |
394 ngx_listening_t *ls; | 404 ngx_listening_t *ls; |
395 | 405 |
396 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) | 406 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) |
400 int timeout; | 410 int timeout; |
401 #endif | 411 #endif |
402 | 412 |
403 ls = cycle->listening.elts; | 413 ls = cycle->listening.elts; |
404 for (i = 0; i < cycle->listening.nelts; i++) { | 414 for (i = 0; i < cycle->listening.nelts; i++) { |
415 | |
416 ls[i].log = *ls[i].logp; | |
405 | 417 |
406 if (ls[i].rcvbuf != -1) { | 418 if (ls[i].rcvbuf != -1) { |
407 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, | 419 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, |
408 (const void *) &ls[i].rcvbuf, sizeof(int)) | 420 (const void *) &ls[i].rcvbuf, sizeof(int)) |
409 == -1) | 421 == -1) |