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)