3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
10 #include <ngx_event.h>
16 static void ngx_drain_connections(void);
20 ngx_create_listening(ngx_conf_t
*cf
, void *sockaddr
, socklen_t socklen
)
25 u_char text
[NGX_SOCKADDR_STRLEN
];
27 ls
= ngx_array_push(&cf
->cycle
->listening
);
32 ngx_memzero(ls
, sizeof(ngx_listening_t
));
34 sa
= ngx_palloc(cf
->pool
, socklen
);
39 ngx_memcpy(sa
, sockaddr
, socklen
);
42 ls
->socklen
= socklen
;
44 len
= ngx_sock_ntop(sa
, text
, NGX_SOCKADDR_STRLEN
, 1);
45 ls
->addr_text
.len
= len
;
47 switch (ls
->sockaddr
->sa_family
) {
50 ls
->addr_text_max_len
= NGX_INET6_ADDRSTRLEN
;
53 #if (NGX_HAVE_UNIX_DOMAIN)
55 ls
->addr_text_max_len
= NGX_UNIX_ADDRSTRLEN
;
60 ls
->addr_text_max_len
= NGX_INET_ADDRSTRLEN
;
63 ls
->addr_text_max_len
= NGX_SOCKADDR_STRLEN
;
67 ls
->addr_text
.data
= ngx_pnalloc(cf
->pool
, len
);
68 if (ls
->addr_text
.data
== NULL
) {
72 ngx_memcpy(ls
->addr_text
.data
, text
, len
);
74 ls
->fd
= (ngx_socket_t
) -1;
75 ls
->type
= SOCK_STREAM
;
77 ls
->backlog
= NGX_LISTEN_BACKLOG
;
90 ngx_set_inherited_sockets(ngx_cycle_t
*cycle
)
96 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
98 struct accept_filter_arg af
;
100 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
104 ls
= cycle
->listening
.elts
;
105 for (i
= 0; i
< cycle
->listening
.nelts
; i
++) {
107 ls
[i
].sockaddr
= ngx_palloc(cycle
->pool
, NGX_SOCKADDRLEN
);
108 if (ls
[i
].sockaddr
== NULL
) {
112 ls
[i
].socklen
= NGX_SOCKADDRLEN
;
113 if (getsockname(ls
[i
].fd
, ls
[i
].sockaddr
, &ls
[i
].socklen
) == -1) {
114 ngx_log_error(NGX_LOG_CRIT
, cycle
->log
, ngx_socket_errno
,
115 "getsockname() of the inherited "
116 "socket #%d failed", ls
[i
].fd
);
121 switch (ls
[i
].sockaddr
->sa_family
) {
125 ls
[i
].addr_text_max_len
= NGX_INET6_ADDRSTRLEN
;
126 len
= NGX_INET6_ADDRSTRLEN
+ sizeof(":65535") - 1;
130 #if (NGX_HAVE_UNIX_DOMAIN)
132 ls
[i
].addr_text_max_len
= NGX_UNIX_ADDRSTRLEN
;
133 len
= NGX_UNIX_ADDRSTRLEN
;
138 ls
[i
].addr_text_max_len
= NGX_INET_ADDRSTRLEN
;
139 len
= NGX_INET_ADDRSTRLEN
+ sizeof(":65535") - 1;
143 ngx_log_error(NGX_LOG_CRIT
, cycle
->log
, ngx_socket_errno
,
144 "the inherited socket #%d has "
145 "an unsupported protocol family", ls
[i
].fd
);
150 ls
[i
].addr_text
.data
= ngx_pnalloc(cycle
->pool
, len
);
151 if (ls
[i
].addr_text
.data
== NULL
) {
155 len
= ngx_sock_ntop(ls
[i
].sockaddr
, ls
[i
].addr_text
.data
, len
, 1);
160 ls
[i
].addr_text
.len
= len
;
162 ls
[i
].backlog
= NGX_LISTEN_BACKLOG
;
166 if (getsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_RCVBUF
, (void *) &ls
[i
].rcvbuf
,
170 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
171 "getsockopt(SO_RCVBUF) %V failed, ignored",
179 if (getsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_SNDBUF
, (void *) &ls
[i
].sndbuf
,
183 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
184 "getsockopt(SO_SNDBUF) %V failed, ignored",
191 /* SO_SETFIB is currently a set only option */
193 #if (NGX_HAVE_SETFIB)
195 if (getsockopt(ls
[i
].setfib
, SOL_SOCKET
, SO_SETFIB
,
196 (void *) &ls
[i
].setfib
, &olen
)
199 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
200 "getsockopt(SO_SETFIB) %V failed, ignored",
209 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
211 ngx_memzero(&af
, sizeof(struct accept_filter_arg
));
212 olen
= sizeof(struct accept_filter_arg
);
214 if (getsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_ACCEPTFILTER
, &af
, &olen
)
219 if (err
== NGX_EINVAL
) {
223 ngx_log_error(NGX_LOG_NOTICE
, cycle
->log
, err
,
224 "getsockopt(SO_ACCEPTFILTER) for %V failed, ignored",
229 if (olen
< sizeof(struct accept_filter_arg
) || af
.af_name
[0] == '\0') {
233 ls
[i
].accept_filter
= ngx_palloc(cycle
->pool
, 16);
234 if (ls
[i
].accept_filter
== NULL
) {
238 (void) ngx_cpystrn((u_char
*) ls
[i
].accept_filter
,
239 (u_char
*) af
.af_name
, 16);
242 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
247 if (getsockopt(ls
[i
].fd
, IPPROTO_TCP
, TCP_DEFER_ACCEPT
, &timeout
, &olen
)
250 ngx_log_error(NGX_LOG_NOTICE
, cycle
->log
, ngx_errno
,
251 "getsockopt(TCP_DEFER_ACCEPT) for %V failed, ignored",
256 if (olen
< sizeof(int) || timeout
== 0) {
260 ls
[i
].deferred_accept
= 1;
269 ngx_open_listening_sockets(ngx_cycle_t
*cycle
)
272 ngx_uint_t i
, tries
, failed
;
279 #if (NGX_SUPPRESS_WARN)
285 /* TODO: configurable try number */
287 for (tries
= 5; tries
; tries
--) {
290 /* for each listening socket */
292 ls
= cycle
->listening
.elts
;
293 for (i
= 0; i
< cycle
->listening
.nelts
; i
++) {
299 if (ls
[i
].fd
!= -1) {
303 if (ls
[i
].inherited
) {
305 /* TODO: close on exit */
306 /* TODO: nonblocking */
307 /* TODO: deferred accept */
312 s
= ngx_socket(ls
[i
].sockaddr
->sa_family
, ls
[i
].type
, 0);
315 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
316 ngx_socket_n
" %V failed", &ls
[i
].addr_text
);
320 if (setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
,
321 (const void *) &reuseaddr
, sizeof(int))
324 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
325 "setsockopt(SO_REUSEADDR) %V failed",
328 if (ngx_close_socket(s
) == -1) {
329 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
330 ngx_close_socket_n
" %V failed",
337 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
339 if (ls
[i
].sockaddr
->sa_family
== AF_INET6
) {
342 ipv6only
= ls
[i
].ipv6only
;
344 if (setsockopt(s
, IPPROTO_IPV6
, IPV6_V6ONLY
,
345 (const void *) &ipv6only
, sizeof(int))
348 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
349 "setsockopt(IPV6_V6ONLY) %V failed, ignored",
354 /* TODO: close on exit */
356 if (!(ngx_event_flags
& NGX_USE_AIO_EVENT
)) {
357 if (ngx_nonblocking(s
) == -1) {
358 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
359 ngx_nonblocking_n
" %V failed",
362 if (ngx_close_socket(s
) == -1) {
363 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
364 ngx_close_socket_n
" %V failed",
372 ngx_log_debug2(NGX_LOG_DEBUG_CORE
, log
, 0,
373 "bind() %V #%d ", &ls
[i
].addr_text
, s
);
375 if (bind(s
, ls
[i
].sockaddr
, ls
[i
].socklen
) == -1) {
376 err
= ngx_socket_errno
;
378 if (err
== NGX_EADDRINUSE
&& ngx_test_config
) {
382 ngx_log_error(NGX_LOG_EMERG
, log
, err
,
383 "bind() to %V failed", &ls
[i
].addr_text
);
385 if (ngx_close_socket(s
) == -1) {
386 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
387 ngx_close_socket_n
" %V failed",
391 if (err
!= NGX_EADDRINUSE
) {
400 #if (NGX_HAVE_UNIX_DOMAIN)
402 if (ls
[i
].sockaddr
->sa_family
== AF_UNIX
) {
406 name
= ls
[i
].addr_text
.data
+ sizeof("unix:") - 1;
407 mode
= (S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IWGRP
|S_IROTH
|S_IWOTH
);
409 if (chmod((char *) name
, mode
) == -1) {
410 ngx_log_error(NGX_LOG_EMERG
, cycle
->log
, ngx_errno
,
411 "chmod() \"%s\" failed", name
);
414 if (ngx_test_config
) {
415 if (ngx_delete_file(name
) == NGX_FILE_ERROR
) {
416 ngx_log_error(NGX_LOG_EMERG
, cycle
->log
, ngx_errno
,
417 ngx_delete_file_n
" %s failed", name
);
423 if (listen(s
, ls
[i
].backlog
) == -1) {
424 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
425 "listen() to %V, backlog %d failed",
426 &ls
[i
].addr_text
, ls
[i
].backlog
);
428 if (ngx_close_socket(s
) == -1) {
429 ngx_log_error(NGX_LOG_EMERG
, log
, ngx_socket_errno
,
430 ngx_close_socket_n
" %V failed",
446 /* TODO: delay configurable */
448 ngx_log_error(NGX_LOG_NOTICE
, log
, 0,
449 "try again to bind() after 500ms");
455 ngx_log_error(NGX_LOG_EMERG
, log
, 0, "still could not bind()");
464 ngx_configure_listening_sockets(ngx_cycle_t
*cycle
)
470 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
471 struct accept_filter_arg af
;
473 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
477 ls
= cycle
->listening
.elts
;
478 for (i
= 0; i
< cycle
->listening
.nelts
; i
++) {
480 ls
[i
].log
= *ls
[i
].logp
;
482 if (ls
[i
].rcvbuf
!= -1) {
483 if (setsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_RCVBUF
,
484 (const void *) &ls
[i
].rcvbuf
, sizeof(int))
487 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
488 "setsockopt(SO_RCVBUF, %d) %V failed, ignored",
489 ls
[i
].rcvbuf
, &ls
[i
].addr_text
);
493 if (ls
[i
].sndbuf
!= -1) {
494 if (setsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_SNDBUF
,
495 (const void *) &ls
[i
].sndbuf
, sizeof(int))
498 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
499 "setsockopt(SO_SNDBUF, %d) %V failed, ignored",
500 ls
[i
].sndbuf
, &ls
[i
].addr_text
);
504 if (ls
[i
].keepalive
) {
505 keepalive
= (ls
[i
].keepalive
== 1) ? 1 : 0;
507 if (setsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_KEEPALIVE
,
508 (const void *) &keepalive
, sizeof(int))
511 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
512 "setsockopt(SO_KEEPALIVE, %d) %V failed, ignored",
513 keepalive
, &ls
[i
].addr_text
);
517 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
519 if (ls
[i
].keepidle
) {
520 if (setsockopt(ls
[i
].fd
, IPPROTO_TCP
, TCP_KEEPIDLE
,
521 (const void *) &ls
[i
].keepidle
, sizeof(int))
524 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
525 "setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored",
526 ls
[i
].keepidle
, &ls
[i
].addr_text
);
530 if (ls
[i
].keepintvl
) {
531 if (setsockopt(ls
[i
].fd
, IPPROTO_TCP
, TCP_KEEPINTVL
,
532 (const void *) &ls
[i
].keepintvl
, sizeof(int))
535 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
536 "setsockopt(TCP_KEEPINTVL, %d) %V failed, ignored",
537 ls
[i
].keepintvl
, &ls
[i
].addr_text
);
542 if (setsockopt(ls
[i
].fd
, IPPROTO_TCP
, TCP_KEEPCNT
,
543 (const void *) &ls
[i
].keepcnt
, sizeof(int))
546 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
547 "setsockopt(TCP_KEEPCNT, %d) %V failed, ignored",
548 ls
[i
].keepcnt
, &ls
[i
].addr_text
);
554 #if (NGX_HAVE_SETFIB)
555 if (ls
[i
].setfib
!= -1) {
556 if (setsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_SETFIB
,
557 (const void *) &ls
[i
].setfib
, sizeof(int))
560 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
561 "setsockopt(SO_SETFIB, %d) %V failed, ignored",
562 ls
[i
].setfib
, &ls
[i
].addr_text
);
571 if (setsockopt(ls
[i
].fd
, IPPROTO_TCP
, TCP_NODELAY
,
572 (const void *) &tcp_nodelay
, sizeof(int))
575 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
576 "setsockopt(TCP_NODELAY) %V failed, ignored",
584 /* change backlog via listen() */
586 if (listen(ls
[i
].fd
, ls
[i
].backlog
) == -1) {
587 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_socket_errno
,
588 "listen() to %V, backlog %d failed, ignored",
589 &ls
[i
].addr_text
, ls
[i
].backlog
);
594 * setting deferred mode should be last operation on socket,
595 * because code may prematurely continue cycle on failure
598 #if (NGX_HAVE_DEFERRED_ACCEPT)
600 #ifdef SO_ACCEPTFILTER
602 if (ls
[i
].delete_deferred
) {
603 if (setsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_ACCEPTFILTER
, NULL
, 0)
606 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_errno
,
607 "setsockopt(SO_ACCEPTFILTER, NULL) "
608 "for %V failed, ignored",
611 if (ls
[i
].accept_filter
) {
612 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, 0,
613 "could not change the accept filter "
614 "to \"%s\" for %V, ignored",
615 ls
[i
].accept_filter
, &ls
[i
].addr_text
);
621 ls
[i
].deferred_accept
= 0;
624 if (ls
[i
].add_deferred
) {
625 ngx_memzero(&af
, sizeof(struct accept_filter_arg
));
626 (void) ngx_cpystrn((u_char
*) af
.af_name
,
627 (u_char
*) ls
[i
].accept_filter
, 16);
629 if (setsockopt(ls
[i
].fd
, SOL_SOCKET
, SO_ACCEPTFILTER
,
630 &af
, sizeof(struct accept_filter_arg
))
633 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_errno
,
634 "setsockopt(SO_ACCEPTFILTER, \"%s\") "
635 "for %V failed, ignored",
636 ls
[i
].accept_filter
, &ls
[i
].addr_text
);
640 ls
[i
].deferred_accept
= 1;
645 #ifdef TCP_DEFER_ACCEPT
647 if (ls
[i
].add_deferred
|| ls
[i
].delete_deferred
) {
649 if (ls
[i
].add_deferred
) {
650 timeout
= (int) (ls
[i
].post_accept_timeout
/ 1000);
656 if (setsockopt(ls
[i
].fd
, IPPROTO_TCP
, TCP_DEFER_ACCEPT
,
657 &timeout
, sizeof(int))
660 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, ngx_errno
,
661 "setsockopt(TCP_DEFER_ACCEPT, %d) for %V failed, "
663 timeout
, &ls
[i
].addr_text
);
669 if (ls
[i
].add_deferred
) {
670 ls
[i
].deferred_accept
= 1;
675 #endif /* NGX_HAVE_DEFERRED_ACCEPT */
683 ngx_close_listening_sockets(ngx_cycle_t
*cycle
)
689 if (ngx_event_flags
& NGX_USE_IOCP_EVENT
) {
693 ngx_accept_mutex_held
= 0;
694 ngx_use_accept_mutex
= 0;
696 ls
= cycle
->listening
.elts
;
697 for (i
= 0; i
< cycle
->listening
.nelts
; i
++) {
699 c
= ls
[i
].connection
;
702 if (c
->read
->active
) {
703 if (ngx_event_flags
& NGX_USE_RTSIG_EVENT
) {
704 ngx_del_conn(c
, NGX_CLOSE_EVENT
);
706 } else if (ngx_event_flags
& NGX_USE_EPOLL_EVENT
) {
709 * it seems that Linux-2.6.x OpenVZ sends events
710 * for closed shared listening sockets unless
711 * the events was explicitly deleted
714 ngx_del_event(c
->read
, NGX_READ_EVENT
, 0);
717 ngx_del_event(c
->read
, NGX_READ_EVENT
, NGX_CLOSE_EVENT
);
721 ngx_free_connection(c
);
723 c
->fd
= (ngx_socket_t
) -1;
726 ngx_log_debug2(NGX_LOG_DEBUG_CORE
, cycle
->log
, 0,
727 "close listening %V #%d ", &ls
[i
].addr_text
, ls
[i
].fd
);
729 if (ngx_close_socket(ls
[i
].fd
) == -1) {
730 ngx_log_error(NGX_LOG_EMERG
, cycle
->log
, ngx_socket_errno
,
731 ngx_close_socket_n
" %V failed", &ls
[i
].addr_text
);
734 #if (NGX_HAVE_UNIX_DOMAIN)
736 if (ls
[i
].sockaddr
->sa_family
== AF_UNIX
737 && ngx_process
<= NGX_PROCESS_MASTER
738 && ngx_new_binary
== 0)
740 u_char
*name
= ls
[i
].addr_text
.data
+ sizeof("unix:") - 1;
742 if (ngx_delete_file(name
) == NGX_FILE_ERROR
) {
743 ngx_log_error(NGX_LOG_EMERG
, cycle
->log
, ngx_socket_errno
,
744 ngx_delete_file_n
" %s failed", name
);
750 ls
[i
].fd
= (ngx_socket_t
) -1;
753 cycle
->listening
.nelts
= 0;
758 ngx_get_connection(ngx_socket_t s
, ngx_log_t
*log
)
761 ngx_event_t
*rev
, *wev
;
764 /* disable warning: Win32 SOCKET is u_int while UNIX socket is int */
766 if (ngx_cycle
->files
&& (ngx_uint_t
) s
>= ngx_cycle
->files_n
) {
767 ngx_log_error(NGX_LOG_ALERT
, log
, 0,
768 "the new socket has number %d, "
769 "but only %ui files are available",
770 s
, ngx_cycle
->files_n
);
776 c
= ngx_cycle
->free_connections
;
779 ngx_drain_connections();
780 c
= ngx_cycle
->free_connections
;
784 ngx_log_error(NGX_LOG_ALERT
, log
, 0,
785 "%ui worker_connections are not enough",
786 ngx_cycle
->connection_n
);
788 /* ngx_mutex_unlock */
793 ngx_cycle
->free_connections
= c
->data
;
794 ngx_cycle
->free_connection_n
--;
796 /* ngx_mutex_unlock */
798 if (ngx_cycle
->files
) {
799 ngx_cycle
->files
[s
] = c
;
805 ngx_memzero(c
, sizeof(ngx_connection_t
));
812 instance
= rev
->instance
;
814 ngx_memzero(rev
, sizeof(ngx_event_t
));
815 ngx_memzero(wev
, sizeof(ngx_event_t
));
817 rev
->instance
= !instance
;
818 wev
->instance
= !instance
;
820 rev
->index
= NGX_INVALID_INDEX
;
821 wev
->index
= NGX_INVALID_INDEX
;
833 ngx_free_connection(ngx_connection_t
*c
)
837 c
->data
= ngx_cycle
->free_connections
;
838 ngx_cycle
->free_connections
= c
;
839 ngx_cycle
->free_connection_n
++;
841 /* ngx_mutex_unlock */
843 if (ngx_cycle
->files
) {
844 ngx_cycle
->files
[c
->fd
] = NULL
;
850 ngx_close_connection(ngx_connection_t
*c
)
853 ngx_uint_t log_error
, level
;
857 ngx_log_error(NGX_LOG_ALERT
, c
->log
, 0, "connection already closed");
861 if (c
->read
->timer_set
) {
862 ngx_del_timer(c
->read
);
865 if (c
->write
->timer_set
) {
866 ngx_del_timer(c
->write
);
870 ngx_del_conn(c
, NGX_CLOSE_EVENT
);
873 if (c
->read
->active
|| c
->read
->disabled
) {
874 ngx_del_event(c
->read
, NGX_READ_EVENT
, NGX_CLOSE_EVENT
);
877 if (c
->write
->active
|| c
->write
->disabled
) {
878 ngx_del_event(c
->write
, NGX_WRITE_EVENT
, NGX_CLOSE_EVENT
);
885 * we have to clean the connection information before the closing
886 * because another thread may reopen the same file descriptor
887 * before we clean the connection
890 ngx_mutex_lock(ngx_posted_events_mutex
);
893 ngx_delete_posted_event(c
->read
);
896 if (c
->write
->prev
) {
897 ngx_delete_posted_event(c
->write
);
901 c
->write
->closed
= 1;
903 ngx_unlock(&c
->lock
);
905 c
->write
->locked
= 0;
907 ngx_mutex_unlock(ngx_posted_events_mutex
);
912 ngx_delete_posted_event(c
->read
);
915 if (c
->write
->prev
) {
916 ngx_delete_posted_event(c
->write
);
920 c
->write
->closed
= 1;
924 ngx_reusable_connection(c
, 0);
926 log_error
= c
->log_error
;
928 ngx_free_connection(c
);
931 c
->fd
= (ngx_socket_t
) -1;
933 if (ngx_close_socket(fd
) == -1) {
935 err
= ngx_socket_errno
;
937 if (err
== NGX_ECONNRESET
|| err
== NGX_ENOTCONN
) {
942 level
= NGX_LOG_INFO
;
950 level
= NGX_LOG_CRIT
;
954 level
= NGX_LOG_CRIT
;
957 /* we use ngx_cycle->log because c->log was in c->pool */
959 ngx_log_error(level
, ngx_cycle
->log
, err
,
960 ngx_close_socket_n
" %d failed", fd
);
966 ngx_reusable_connection(ngx_connection_t
*c
, ngx_uint_t reusable
)
968 ngx_log_debug1(NGX_LOG_DEBUG_CORE
, c
->log
, 0,
969 "reusable connection: %ui", reusable
);
972 ngx_queue_remove(&c
->queue
);
975 (void) ngx_atomic_fetch_add(ngx_stat_waiting
, -1);
979 c
->reusable
= reusable
;
982 /* need cast as ngx_cycle is volatile */
984 ngx_queue_insert_head(
985 (ngx_queue_t
*) &ngx_cycle
->reusable_connections_queue
, &c
->queue
);
988 (void) ngx_atomic_fetch_add(ngx_stat_waiting
, 1);
995 ngx_drain_connections(void)
1001 for (i
= 0; i
< 32; i
++) {
1002 if (ngx_queue_empty(&ngx_cycle
->reusable_connections_queue
)) {
1006 q
= ngx_queue_last(&ngx_cycle
->reusable_connections_queue
);
1007 c
= ngx_queue_data(q
, ngx_connection_t
, queue
);
1009 ngx_log_debug0(NGX_LOG_DEBUG_CORE
, c
->log
, 0,
1010 "reusing connection");
1013 c
->read
->handler(c
->read
);
1019 ngx_connection_local_sockaddr(ngx_connection_t
*c
, ngx_str_t
*s
,
1024 u_char sa
[NGX_SOCKADDRLEN
];
1025 struct sockaddr_in
*sin
;
1026 #if (NGX_HAVE_INET6)
1028 struct sockaddr_in6
*sin6
;
1031 switch (c
->local_sockaddr
->sa_family
) {
1033 #if (NGX_HAVE_INET6)
1035 sin6
= (struct sockaddr_in6
*) c
->local_sockaddr
;
1037 for (addr
= 0, i
= 0; addr
== 0 && i
< 16; i
++) {
1038 addr
|= sin6
->sin6_addr
.s6_addr
[i
];
1044 default: /* AF_INET */
1045 sin
= (struct sockaddr_in
*) c
->local_sockaddr
;
1046 addr
= sin
->sin_addr
.s_addr
;
1052 len
= NGX_SOCKADDRLEN
;
1054 if (getsockname(c
->fd
, (struct sockaddr
*) &sa
, &len
) == -1) {
1055 ngx_connection_error(c
, ngx_socket_errno
, "getsockname() failed");
1059 c
->local_sockaddr
= ngx_palloc(c
->pool
, len
);
1060 if (c
->local_sockaddr
== NULL
) {
1064 ngx_memcpy(c
->local_sockaddr
, &sa
, len
);
1071 s
->len
= ngx_sock_ntop(c
->local_sockaddr
, s
->data
, s
->len
, port
);
1078 ngx_connection_error(ngx_connection_t
*c
, ngx_err_t err
, char *text
)
1082 /* Winsock may return NGX_ECONNABORTED instead of NGX_ECONNRESET */
1084 if ((err
== NGX_ECONNRESET
1086 || err
== NGX_ECONNABORTED
1088 ) && c
->log_error
== NGX_ERROR_IGNORE_ECONNRESET
)
1094 if (err
== NGX_EINVAL
&& c
->log_error
== NGX_ERROR_IGNORE_EINVAL
) {
1100 || err
== NGX_ECONNRESET
1102 || err
== NGX_ECONNABORTED
1106 || err
== NGX_ENOTCONN
1107 || err
== NGX_ETIMEDOUT
1108 || err
== NGX_ECONNREFUSED
1109 || err
== NGX_ENETDOWN
1110 || err
== NGX_ENETUNREACH
1111 || err
== NGX_EHOSTDOWN
1112 || err
== NGX_EHOSTUNREACH
)
1114 switch (c
->log_error
) {
1116 case NGX_ERROR_IGNORE_EINVAL
:
1117 case NGX_ERROR_IGNORE_ECONNRESET
:
1118 case NGX_ERROR_INFO
:
1119 level
= NGX_LOG_INFO
;
1123 level
= NGX_LOG_ERR
;
1127 level
= NGX_LOG_ALERT
;
1130 ngx_log_error(level
, c
->log
, err
, text
);