annotate src/event/ngx_event_accept.c @ 6929:3069dd358ba2

Cancelable timers are now preserved if there are other timers. There is no need to cancel timers early if there are other timers blocking shutdown anyway. Preserving such timers allows nginx to continue some periodic work till the shutdown is actually possible. With the new approach, timers with ev->cancelable are simply ignored when checking if there are any timers left during shutdown.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 07 Mar 2017 18:51:15 +0300
parents 56fc55e32f23
children 3e2d90073adf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 431
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 431
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3813
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 431
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 431
diff changeset
6
97
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
7
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
8 #include <ngx_config.h>
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
9 #include <ngx_core.h>
99
a059e1aa65d4 nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents: 98
diff changeset
10 #include <ngx_event.h>
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
13 static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
14 static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all);
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
15 static void ngx_close_accepted_connection(ngx_connection_t *c);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
16 #if (NGX_DEBUG)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
17 static void ngx_debug_accepted_connection(ngx_event_conf_t *ecf,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
18 ngx_connection_t *c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
19 #endif
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
20
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
21
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
22 void
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
23 ngx_event_accept(ngx_event_t *ev)
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 {
714
698033350558 rename variable
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
25 socklen_t socklen;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
26 ngx_err_t err;
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
27 ngx_log_t *log;
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
28 ngx_uint_t level;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
29 ngx_socket_t s;
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
30 ngx_event_t *rev, *wev;
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
31 ngx_sockaddr_t sa;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
32 ngx_listening_t *ls;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
33 ngx_connection_t *c, *lc;
483
621229427cba nginx-0.1.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
34 ngx_event_conf_t *ecf;
3812
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
35 #if (NGX_HAVE_ACCEPT4)
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
36 static ngx_uint_t use_accept4 = 1;
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
37 #endif
26
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 24
diff changeset
38
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
39 if (ev->timedout) {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
40 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
41 return;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
42 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
43
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
44 ev->timedout = 0;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
45 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
46
114
ac69ab96328d nginx-0.0.1-2003-07-07-10:11:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 113
diff changeset
47 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
97
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
48
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
49 if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {
248
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
50 ev->available = ecf->multi_accept;
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
51 }
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
52
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
53 lc = ev->data;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
54 ls = lc->listening;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
55 ev->ready = 0;
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
56
257
70e1c7d2b83d nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 253
diff changeset
57 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
58 "accept on %V, ready: %d", &ls->addr_text, ev->available);
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
59
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 do {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
61 socklen = sizeof(ngx_sockaddr_t);
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
62
3786
8a8eb335313d Linux accept4() support
Igor Sysoev <igor@sysoev.ru>
parents: 3263
diff changeset
63 #if (NGX_HAVE_ACCEPT4)
3812
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
64 if (use_accept4) {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
65 s = accept4(lc->fd, &sa.sockaddr, &socklen, SOCK_NONBLOCK);
3812
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
66 } else {
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
67 s = accept(lc->fd, &sa.sockaddr, &socklen);
3812
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
68 }
3786
8a8eb335313d Linux accept4() support
Igor Sysoev <igor@sysoev.ru>
parents: 3263
diff changeset
69 #else
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
70 s = accept(lc->fd, &sa.sockaddr, &socklen);
3786
8a8eb335313d Linux accept4() support
Igor Sysoev <igor@sysoev.ru>
parents: 3263
diff changeset
71 #endif
477
ad1e9ebf93bb nginx-0.1.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
72
5360
3d2d3e1cf427 Win32: MinGW GCC compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5359
diff changeset
73 if (s == (ngx_socket_t) -1) {
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 err = ngx_socket_errno;
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
75
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 if (err == NGX_EAGAIN) {
719
f30b1a75fd3b Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents: 714
diff changeset
77 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,
f30b1a75fd3b Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents: 714
diff changeset
78 "accept() not ready");
87
5f6d848dcbef nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 86
diff changeset
79 return;
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 }
6
669801705ab1 nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
81
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
82 level = NGX_LOG_ALERT;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
83
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
84 if (err == NGX_ECONNABORTED) {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
85 level = NGX_LOG_ERR;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
86
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
87 } else if (err == NGX_EMFILE || err == NGX_ENFILE) {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
88 level = NGX_LOG_CRIT;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
89 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
90
3813
c870fb78550c fix building by msvc8 introduced by the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 3812
diff changeset
91 #if (NGX_HAVE_ACCEPT4)
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
92 ngx_log_error(level, ev->log, err,
3812
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
93 use_accept4 ? "accept4() failed" : "accept() failed");
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
94
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
95 if (use_accept4 && err == NGX_ENOSYS) {
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
96 use_accept4 = 0;
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
97 ngx_inherited_nonblocking = 0;
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
98 continue;
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
99 }
3813
c870fb78550c fix building by msvc8 introduced by the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 3812
diff changeset
100 #else
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
101 ngx_log_error(level, ev->log, err, "accept() failed");
3812
ef27dc1a7832 fallback to accept() if accept4() is not implemented,
Igor Sysoev <igor@sysoev.ru>
parents: 3786
diff changeset
102 #endif
97
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
103
248
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
104 if (err == NGX_ECONNABORTED) {
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
105 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
248
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
106 ev->available--;
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
107 }
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
108
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
109 if (ev->available) {
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
110 continue;
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
111 }
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
112 }
e885208c518b nginx-0.0.2-2004-02-03-00:19:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 247
diff changeset
113
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
114 if (err == NGX_EMFILE || err == NGX_ENFILE) {
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
115 if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle, 1)
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
116 != NGX_OK)
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
117 {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
118 return;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
119 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
120
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
121 if (ngx_use_accept_mutex) {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
122 if (ngx_accept_mutex_held) {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
123 ngx_shmtx_unlock(&ngx_accept_mutex);
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
124 ngx_accept_mutex_held = 0;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
125 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
126
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
127 ngx_accept_disabled = 1;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
128
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
129 } else {
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
130 ngx_add_timer(ev, ecf->accept_mutex_delay);
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
131 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
132 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
133
97
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
134 return;
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
135 }
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
136
426
3f88935a02e8 nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 425
diff changeset
137 #if (NGX_STAT_STUB)
2951
5acd98486a33 ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents: 2723
diff changeset
138 (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);
426
3f88935a02e8 nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents: 425
diff changeset
139 #endif
323
ba876b26b76d nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 315
diff changeset
140
2255
fb7995c7bdd9 dynamic accept threshold
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
141 ngx_accept_disabled = ngx_cycle->connection_n / 8
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
142 - ngx_cycle->free_connection_n;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
143
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
144 c = ngx_get_connection(s, ev->log);
323
ba876b26b76d nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents: 315
diff changeset
145
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
146 if (c == NULL) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
147 if (ngx_close_socket(s) == -1) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
148 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
149 ngx_close_socket_n " failed");
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
150 }
119
cd54bcbaf3b5 nginx-0.0.1-2003-07-21-01:15:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 117
diff changeset
151
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
152 return;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
153 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
154
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
155 c->type = SOCK_STREAM;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
156
635
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
157 #if (NGX_STAT_STUB)
2951
5acd98486a33 ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents: 2723
diff changeset
158 (void) ngx_atomic_fetch_add(ngx_stat_active, 1);
635
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
159 #endif
18268abd340c nginx-0.3.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 617
diff changeset
160
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
161 c->pool = ngx_create_pool(ls->pool_size, ev->log);
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
162 if (c->pool == NULL) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
163 ngx_close_accepted_connection(c);
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
164 return;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
165 }
97
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
166
714
698033350558 rename variable
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
167 c->sockaddr = ngx_palloc(c->pool, socklen);
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
168 if (c->sockaddr == NULL) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
169 ngx_close_accepted_connection(c);
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
170 return;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
171 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
172
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
173 ngx_memcpy(c->sockaddr, &sa, socklen);
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
174
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
175 log = ngx_palloc(c->pool, sizeof(ngx_log_t));
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
176 if (log == NULL) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
177 ngx_close_accepted_connection(c);
87
5f6d848dcbef nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 86
diff changeset
178 return;
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 }
6
669801705ab1 nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
180
6125
4dc8e7b62216 Removed the obsolete aio module.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
181 /* set a blocking mode for iocp and non-blocking mode for others */
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 57
diff changeset
182
93
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
183 if (ngx_inherited_nonblocking) {
6125
4dc8e7b62216 Removed the obsolete aio module.
Ruslan Ermilov <ru@nginx.com>
parents: 5820
diff changeset
184 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
93
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
185 if (ngx_blocking(s) == -1) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
186 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
187 ngx_blocking_n " failed");
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
188 ngx_close_accepted_connection(c);
93
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
189 return;
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
190 }
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
191 }
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
192
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
193 } else {
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
194 if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
93
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
195 if (ngx_nonblocking(s) == -1) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
196 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
197 ngx_nonblocking_n " failed");
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
198 ngx_close_accepted_connection(c);
93
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
199 return;
738fe44c70d5 nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents: 92
diff changeset
200 }
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 57
diff changeset
201 }
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 57
diff changeset
202 }
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 57
diff changeset
203
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
204 *log = ls->log;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
205
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
206 c->recv = ngx_recv;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
207 c->send = ngx_send;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
208 c->recv_chain = ngx_recv_chain;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
209 c->send_chain = ngx_send_chain;
103
6dfda4cf5200 nginx-0.0.1-2003-06-11-19:28:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 100
diff changeset
210
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
211 c->log = log;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
212 c->pool->log = log;
103
6dfda4cf5200 nginx-0.0.1-2003-06-11-19:28:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 100
diff changeset
213
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2255
diff changeset
214 c->socklen = socklen;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
215 c->listening = ls;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2255
diff changeset
216 c->local_sockaddr = ls->sockaddr;
5463
1ab1cf63f885 Core: keep the length of the local sockaddr.
Ruslan Ermilov <ru@nginx.com>
parents: 5360
diff changeset
217 c->local_socklen = ls->socklen;
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
218
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
219 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
220 if (c->sockaddr->sa_family == AF_UNIX) {
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
221 c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
222 c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
223 #if (NGX_SOLARIS)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
224 /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
225 c->sendfile = 0;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
226 #endif
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
227 }
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
228 #endif
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2951
diff changeset
229
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
230 rev = c->read;
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
231 wev = c->write;
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 75
diff changeset
232
164
84036764e215 nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 121
diff changeset
233 wev->ready = 1;
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
235 if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
164
84036764e215 nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents: 121
diff changeset
236 rev->ready = 1;
59
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 57
diff changeset
237 }
e8cdc2989cee nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 57
diff changeset
238
245
e6c005b66b3a nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 236
diff changeset
239 if (ev->deferred_accept) {
e6c005b66b3a nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 236
diff changeset
240 rev->ready = 1;
523
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
241 #if (NGX_HAVE_KQUEUE)
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
242 rev->available = 1;
2019117e6b38 nginx-0.1.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
243 #endif
245
e6c005b66b3a nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 236
diff changeset
244 }
e6c005b66b3a nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 236
diff changeset
245
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
246 rev->log = log;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
247 wev->log = log;
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
248
208
0b67be7d4489 nginx-0.0.1-2003-12-08-23:48:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 206
diff changeset
249 /*
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
250 * TODO: MT: - ngx_atomic_fetch_add()
266
5238e93961a1 nginx-0.0.2-2004-02-23-23:57:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 260
diff changeset
251 * or protection by critical section or light mutex
208
0b67be7d4489 nginx-0.0.1-2003-12-08-23:48:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 206
diff changeset
252 *
0b67be7d4489 nginx-0.0.1-2003-12-08-23:48:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 206
diff changeset
253 * TODO: MP: - allocated in a shared memory
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
254 * - ngx_atomic_fetch_add()
266
5238e93961a1 nginx-0.0.2-2004-02-23-23:57:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 260
diff changeset
255 * or protection by critical section or light mutex
208
0b67be7d4489 nginx-0.0.1-2003-12-08-23:48:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 206
diff changeset
256 */
212
679f60139863 nginx-0.0.1-2003-12-19-11:15:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 208
diff changeset
257
561
e48ebafc6939 nginx-0.3.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 543
diff changeset
258 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
26
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 24
diff changeset
259
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
260 #if (NGX_STAT_STUB)
2951
5acd98486a33 ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents: 2723
diff changeset
261 (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
262 #endif
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
263
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
264 if (ls->addr_ntop) {
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 719
diff changeset
265 c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
266 if (c->addr_text.data == NULL) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
267 ngx_close_accepted_connection(c);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
268 return;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
269 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
270
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4618
diff changeset
271 c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4618
diff changeset
272 c->addr_text.data,
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2255
diff changeset
273 ls->addr_text_max_len, 0);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
274 if (c->addr_text.len == 0) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
275 ngx_close_accepted_connection(c);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
276 return;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
277 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
278 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
279
307
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
280 #if (NGX_DEBUG)
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
281 {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
282 ngx_str_t addr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
283 u_char text[NGX_SOCKADDR_STRLEN];
307
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
284
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
285 ngx_debug_accepted_connection(ecf, c);
307
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
286
5704
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
287 if (log->log_level & NGX_LOG_DEBUG_EVENT) {
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
288 addr.data = text;
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
289 addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
290 NGX_SOCKADDR_STRLEN, 1);
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
291
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
292 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
293 "*%uA accept: %V fd:%d", c->number, &addr, s);
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
294 }
524741fd50ed Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents: 5600
diff changeset
295
307
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
296 }
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
297 #endif
ce375c313e96 nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents: 306
diff changeset
298
381
02a511569afb nginx-0.0.7-2004-07-07-19:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 380
diff changeset
299 if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {
97
70d2345a903f nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 96
diff changeset
300 if (ngx_add_conn(c) == NGX_ERROR) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
301 ngx_close_accepted_connection(c);
87
5f6d848dcbef nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents: 86
diff changeset
302 return;
64
34d647deb1da nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 63
diff changeset
303 }
34d647deb1da nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 63
diff changeset
304 }
34d647deb1da nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 63
diff changeset
305
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
306 log->data = NULL;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
307 log->handler = NULL;
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
308
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
309 ls->handler(c);
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
310
455
295d97d70c69 nginx-0.1.2-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
311 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 ev->available--;
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 44
diff changeset
313 }
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
314
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 } while (ev->available);
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 }
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
317
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
318
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
319 #if !(NGX_WIN32)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
320
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
321 void
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
322 ngx_event_recvmsg(ngx_event_t *ev)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
323 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
324 ssize_t n;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
325 ngx_log_t *log;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
326 ngx_err_t err;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
327 ngx_event_t *rev, *wev;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
328 struct iovec iov[1];
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
329 struct msghdr msg;
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
330 ngx_sockaddr_t sa;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
331 ngx_listening_t *ls;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
332 ngx_event_conf_t *ecf;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
333 ngx_connection_t *c, *lc;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
334 static u_char buffer[65535];
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
335
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
336 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
337
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
338 #if (NGX_HAVE_IP_RECVDSTADDR)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
339 u_char msg_control[CMSG_SPACE(sizeof(struct in_addr))];
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
340 #elif (NGX_HAVE_IP_PKTINFO)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
341 u_char msg_control[CMSG_SPACE(sizeof(struct in_pktinfo))];
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
342 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
343
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
344 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
345 u_char msg_control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
346 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
347
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
348 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
349
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
350 if (ev->timedout) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
351 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
352 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
353 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
354
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
355 ev->timedout = 0;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
356 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
357
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
358 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
359
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
360 if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
361 ev->available = ecf->multi_accept;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
362 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
363
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
364 lc = ev->data;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
365 ls = lc->listening;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
366 ev->ready = 0;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
367
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
368 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
369 "recvmsg on %V, ready: %d", &ls->addr_text, ev->available);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
370
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
371 do {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
372 ngx_memzero(&msg, sizeof(struct msghdr));
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
373
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
374 iov[0].iov_base = (void *) buffer;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
375 iov[0].iov_len = sizeof(buffer);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
376
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
377 msg.msg_name = &sa;
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6532
diff changeset
378 msg.msg_namelen = sizeof(ngx_sockaddr_t);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
379 msg.msg_iov = iov;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
380 msg.msg_iovlen = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
381
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
382 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
383
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
384 if (ls->wildcard) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
385
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
386 #if (NGX_HAVE_IP_RECVDSTADDR || NGX_HAVE_IP_PKTINFO)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
387 if (ls->sockaddr->sa_family == AF_INET) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
388 msg.msg_control = &msg_control;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
389 msg.msg_controllen = sizeof(msg_control);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
390 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
391 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
392
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
393 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
394 if (ls->sockaddr->sa_family == AF_INET6) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
395 msg.msg_control = &msg_control6;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
396 msg.msg_controllen = sizeof(msg_control6);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
397 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
398 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
399 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
400
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
401 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
402
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
403 n = recvmsg(lc->fd, &msg, 0);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
404
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
405 if (n == -1) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
406 err = ngx_socket_errno;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
407
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
408 if (err == NGX_EAGAIN) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
409 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
410 "recvmsg() not ready");
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
411 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
412 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
413
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
414 ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed");
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
415
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
416 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
417 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
418
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
419 #if (NGX_STAT_STUB)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
420 (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
421 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
422
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
423 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
424 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
425 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
426 "recvmsg() truncated data");
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
427 continue;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
428 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
429 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
430
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
431 ngx_accept_disabled = ngx_cycle->connection_n / 8
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
432 - ngx_cycle->free_connection_n;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
433
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
434 c = ngx_get_connection(lc->fd, ev->log);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
435 if (c == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
436 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
437 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
438
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
439 c->shared = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
440 c->type = SOCK_DGRAM;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
441 c->socklen = msg.msg_namelen;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
442
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
443 #if (NGX_STAT_STUB)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
444 (void) ngx_atomic_fetch_add(ngx_stat_active, 1);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
445 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
446
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
447 c->pool = ngx_create_pool(ls->pool_size, ev->log);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
448 if (c->pool == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
449 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
450 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
451 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
452
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
453 c->sockaddr = ngx_palloc(c->pool, c->socklen);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
454 if (c->sockaddr == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
455 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
456 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
457 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
458
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
459 ngx_memcpy(c->sockaddr, msg.msg_name, c->socklen);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
460
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
461 log = ngx_palloc(c->pool, sizeof(ngx_log_t));
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
462 if (log == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
463 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
464 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
465 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
466
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
467 *log = ls->log;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
468
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
469 c->send = ngx_udp_send;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6559
diff changeset
470 c->send_chain = ngx_udp_send_chain;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
471
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
472 c->log = log;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
473 c->pool->log = log;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
474
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
475 c->listening = ls;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
476 c->local_sockaddr = ls->sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
477 c->local_socklen = ls->socklen;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
478
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
479 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
480
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
481 if (ls->wildcard) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
482 struct cmsghdr *cmsg;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
483 struct sockaddr *sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
484
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
485 sockaddr = ngx_palloc(c->pool, c->local_socklen);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
486 if (sockaddr == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
487 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
488 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
489 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
490
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
491 ngx_memcpy(sockaddr, c->local_sockaddr, c->local_socklen);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
492 c->local_sockaddr = sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
493
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
494 for (cmsg = CMSG_FIRSTHDR(&msg);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
495 cmsg != NULL;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
496 cmsg = CMSG_NXTHDR(&msg, cmsg))
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
497 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
498
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
499 #if (NGX_HAVE_IP_RECVDSTADDR)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
500
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
501 if (cmsg->cmsg_level == IPPROTO_IP
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
502 && cmsg->cmsg_type == IP_RECVDSTADDR
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
503 && sockaddr->sa_family == AF_INET)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
504 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
505 struct in_addr *addr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
506 struct sockaddr_in *sin;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
507
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
508 addr = (struct in_addr *) CMSG_DATA(cmsg);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
509 sin = (struct sockaddr_in *) sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
510 sin->sin_addr = *addr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
511
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
512 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
513 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
514
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
515 #elif (NGX_HAVE_IP_PKTINFO)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
516
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
517 if (cmsg->cmsg_level == IPPROTO_IP
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
518 && cmsg->cmsg_type == IP_PKTINFO
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
519 && sockaddr->sa_family == AF_INET)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
520 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
521 struct in_pktinfo *pkt;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
522 struct sockaddr_in *sin;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
523
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
524 pkt = (struct in_pktinfo *) CMSG_DATA(cmsg);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
525 sin = (struct sockaddr_in *) sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
526 sin->sin_addr = pkt->ipi_addr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
527
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
528 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
529 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
530
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
531 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
532
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
533 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
534
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
535 if (cmsg->cmsg_level == IPPROTO_IPV6
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
536 && cmsg->cmsg_type == IPV6_PKTINFO
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
537 && sockaddr->sa_family == AF_INET6)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
538 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
539 struct in6_pktinfo *pkt6;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
540 struct sockaddr_in6 *sin6;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
541
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
542 pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
543 sin6 = (struct sockaddr_in6 *) sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
544 sin6->sin6_addr = pkt6->ipi6_addr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
545
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
546 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
547 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
548
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
549 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
550
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
551 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
552 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
553
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
554 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
555
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
556 c->buffer = ngx_create_temp_buf(c->pool, n);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
557 if (c->buffer == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
558 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
559 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
560 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
561
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
562 c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
563
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
564 rev = c->read;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
565 wev = c->write;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
566
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
567 wev->ready = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
568
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
569 rev->log = log;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
570 wev->log = log;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
571
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
572 /*
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
573 * TODO: MT: - ngx_atomic_fetch_add()
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
574 * or protection by critical section or light mutex
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
575 *
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
576 * TODO: MP: - allocated in a shared memory
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
577 * - ngx_atomic_fetch_add()
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
578 * or protection by critical section or light mutex
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
579 */
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
580
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
581 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
582
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
583 #if (NGX_STAT_STUB)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
584 (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
585 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
586
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
587 if (ls->addr_ntop) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
588 c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
589 if (c->addr_text.data == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
590 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
591 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
592 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
593
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
594 c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
595 c->addr_text.data,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
596 ls->addr_text_max_len, 0);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
597 if (c->addr_text.len == 0) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
598 ngx_close_accepted_connection(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
599 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
600 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
601 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
602
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
603 #if (NGX_DEBUG)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
604 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
605 ngx_str_t addr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
606 u_char text[NGX_SOCKADDR_STRLEN];
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
607
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
608 ngx_debug_accepted_connection(ecf, c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
609
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
610 if (log->log_level & NGX_LOG_DEBUG_EVENT) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
611 addr.data = text;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
612 addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
613 NGX_SOCKADDR_STRLEN, 1);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
614
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
615 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
616 "*%uA recvmsg: %V fd:%d n:%z",
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
617 c->number, &addr, c->fd, n);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
618 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
619
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
620 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
621 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
622
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
623 log->data = NULL;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
624 log->handler = NULL;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
625
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
626 ls->handler(c);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
627
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
628 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
629 ev->available -= n;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
630 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
631
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
632 } while (ev->available);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
633 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
634
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
635 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
636
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
637
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
638 ngx_int_t
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
639 ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
640 {
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
641 if (ngx_shmtx_trylock(&ngx_accept_mutex)) {
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
642
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
643 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
644 "accept mutex locked");
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
645
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
646 if (ngx_accept_mutex_held && ngx_accept_events == 0) {
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
647 return NGX_OK;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
648 }
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
649
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
650 if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 581
diff changeset
651 ngx_shmtx_unlock(&ngx_accept_mutex);
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
652 return NGX_ERROR;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
653 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
654
719
f30b1a75fd3b Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents: 714
diff changeset
655 ngx_accept_events = 0;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
656 ngx_accept_mutex_held = 1;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
657
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
658 return NGX_OK;
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
659 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
660
719
f30b1a75fd3b Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents: 714
diff changeset
661 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
f30b1a75fd3b Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents: 714
diff changeset
662 "accept mutex lock failed: %ui", ngx_accept_mutex_held);
f30b1a75fd3b Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents: 714
diff changeset
663
302
1526e7686b20 nginx-0.0.3-2004-04-01-10:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 301
diff changeset
664 if (ngx_accept_mutex_held) {
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
665 if (ngx_disable_accept_events(cycle, 0) == NGX_ERROR) {
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
666 return NGX_ERROR;
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
667 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
668
302
1526e7686b20 nginx-0.0.3-2004-04-01-10:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 301
diff changeset
669 ngx_accept_mutex_held = 0;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
670 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
671
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
672 return NGX_OK;
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
673 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
674
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
675
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
676 static ngx_int_t
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
677 ngx_enable_accept_events(ngx_cycle_t *cycle)
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
678 {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
679 ngx_uint_t i;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
680 ngx_listening_t *ls;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
681 ngx_connection_t *c;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
682
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
683 ls = cycle->listening.elts;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
684 for (i = 0; i < cycle->listening.nelts; i++) {
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
685
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
686 c = ls[i].connection;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
687
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
688 if (c == NULL || c->read->active) {
4618
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
689 continue;
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
690 }
c05cfc46b3bc Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4613
diff changeset
691
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
692 if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) {
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
693 return NGX_ERROR;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
694 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
695 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
696
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
697 return NGX_OK;
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
698 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
699
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
700
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 561
diff changeset
701 static ngx_int_t
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
702 ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all)
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
703 {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
704 ngx_uint_t i;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
705 ngx_listening_t *ls;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
706 ngx_connection_t *c;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
707
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
708 ls = cycle->listening.elts;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
709 for (i = 0; i < cycle->listening.nelts; i++) {
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
710
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
711 c = ls[i].connection;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
712
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
713 if (c == NULL || !c->read->active) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
714 continue;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
715 }
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
716
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
717 #if (NGX_HAVE_REUSEPORT)
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
718
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
719 /*
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
720 * do not disable accept on worker's own sockets
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
721 * when disabling accept events due to accept mutex
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
722 */
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
723
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
724 if (ls[i].reuseport && !all) {
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
725 continue;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
726 }
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
727
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
728 #endif
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6126
diff changeset
729
6126
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
730 if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT)
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
731 == NGX_ERROR)
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
732 {
adba26ff70b5 Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents: 6125
diff changeset
733 return NGX_ERROR;
301
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
734 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
735 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
736
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
737 return NGX_OK;
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
738 }
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
739
744965ec6275 nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
740
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
741 static void
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
742 ngx_close_accepted_connection(ngx_connection_t *c)
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
743 {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
744 ngx_socket_t fd;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
745
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
746 ngx_free_connection(c);
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
747
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
748 fd = c->fd;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
749 c->fd = (ngx_socket_t) -1;
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
750
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
751 if (!c->shared && ngx_close_socket(fd) == -1) {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
752 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno,
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
753 ngx_close_socket_n " failed");
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
754 }
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
755
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
756 if (c->pool) {
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
757 ngx_destroy_pool(c->pool);
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
758 }
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
759
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
760 #if (NGX_STAT_STUB)
2951
5acd98486a33 ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents: 2723
diff changeset
761 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
495
fc9909c369b2 nginx-0.1.22-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 493
diff changeset
762 #endif
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
763 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
764
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
765
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
766 u_char *
493
975f62e77f02 nginx-0.1.21-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
767 ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len)
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
768 {
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
769 return ngx_snprintf(buf, len, " while accepting new connection on %V",
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
770 log->data);
191
71ce40b3c37b nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents: 164
diff changeset
771 }
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
772
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
773
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
774 #if (NGX_DEBUG)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
775
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
776 static void
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
777 ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
778 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
779 struct sockaddr_in *sin;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
780 ngx_cidr_t *cidr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
781 ngx_uint_t i;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
782 #if (NGX_HAVE_INET6)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
783 struct sockaddr_in6 *sin6;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
784 ngx_uint_t n;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
785 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
786
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
787 cidr = ecf->debug_connection.elts;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
788 for (i = 0; i < ecf->debug_connection.nelts; i++) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
789 if (cidr[i].family != (ngx_uint_t) c->sockaddr->sa_family) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
790 goto next;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
791 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
792
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
793 switch (cidr[i].family) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
794
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
795 #if (NGX_HAVE_INET6)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
796 case AF_INET6:
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
797 sin6 = (struct sockaddr_in6 *) c->sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
798 for (n = 0; n < 16; n++) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
799 if ((sin6->sin6_addr.s6_addr[n]
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
800 & cidr[i].u.in6.mask.s6_addr[n])
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
801 != cidr[i].u.in6.addr.s6_addr[n])
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
802 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
803 goto next;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
804 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
805 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
806 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
807 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
808
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
809 #if (NGX_HAVE_UNIX_DOMAIN)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
810 case AF_UNIX:
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
811 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
812 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
813
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
814 default: /* AF_INET */
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
815 sin = (struct sockaddr_in *) c->sockaddr;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
816 if ((sin->sin_addr.s_addr & cidr[i].u.in.mask)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
817 != cidr[i].u.in.addr)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
818 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
819 goto next;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
820 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
821 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
822 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
823
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
824 c->log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
825 break;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
826
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
827 next:
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
828 continue;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
829 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
830 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
831
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6153
diff changeset
832 #endif