Mercurial > hg > nginx-quic
annotate src/event/ngx_event_accept.c @ 7284:52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Previously, ngx_event_recvmsg() got remote socket addresses after creating
the connection object. In preparation to handling multiple UDP packets in a
single session, this code was moved up.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Fri, 01 Jun 2018 13:12:57 +0300 |
parents | d0b897c0bb5b |
children | 88a624c9b491 |
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 | 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 | 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 | 15 static void ngx_close_accepted_connection(ngx_connection_t *c); |
6436 | 16 #if (NGX_DEBUG) |
17 static void ngx_debug_accepted_connection(ngx_event_conf_t *ecf, | |
18 ngx_connection_t *c); | |
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 | 22 void |
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 | 25 socklen_t socklen; |
483 | 26 ngx_err_t err; |
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 | 29 ngx_socket_t s; |
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 | 32 ngx_listening_t *ls; |
33 ngx_connection_t *c, *lc; | |
483 | 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 | 53 lc = ev->data; |
54 ls = lc->listening; | |
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 | 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 | 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 | 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 | 71 #endif |
477 | 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 | 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 | 141 ngx_accept_disabled = ngx_cycle->connection_n / 8 |
543 | 142 - ngx_cycle->free_connection_n; |
143 | |
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 | 146 if (c == NULL) { |
147 if (ngx_close_socket(s) == -1) { | |
148 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | |
149 ngx_close_socket_n " failed"); | |
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 | 152 return; |
153 } | |
154 | |
6436 | 155 c->type = SOCK_STREAM; |
156 | |
635 | 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 | 159 #endif |
160 | |
543 | 161 c->pool = ngx_create_pool(ls->pool_size, ev->log); |
162 if (c->pool == NULL) { | |
163 ngx_close_accepted_connection(c); | |
164 return; | |
165 } | |
97
70d2345a903f
nginx-0.0.1-2003-05-29-17:02:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
96
diff
changeset
|
166 |
7119
fef61d26da39
Fixed buffer overread with unix sockets after accept().
Maxim Dounin <mdounin@mdounin.ru>
parents:
7005
diff
changeset
|
167 if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { |
fef61d26da39
Fixed buffer overread with unix sockets after accept().
Maxim Dounin <mdounin@mdounin.ru>
parents:
7005
diff
changeset
|
168 socklen = sizeof(ngx_sockaddr_t); |
fef61d26da39
Fixed buffer overread with unix sockets after accept().
Maxim Dounin <mdounin@mdounin.ru>
parents:
7005
diff
changeset
|
169 } |
fef61d26da39
Fixed buffer overread with unix sockets after accept().
Maxim Dounin <mdounin@mdounin.ru>
parents:
7005
diff
changeset
|
170 |
714 | 171 c->sockaddr = ngx_palloc(c->pool, socklen); |
543 | 172 if (c->sockaddr == NULL) { |
173 ngx_close_accepted_connection(c); | |
174 return; | |
175 } | |
176 | |
6559
adf25b8d0431
Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents:
6532
diff
changeset
|
177 ngx_memcpy(c->sockaddr, &sa, socklen); |
543 | 178 |
179 log = ngx_palloc(c->pool, sizeof(ngx_log_t)); | |
180 if (log == NULL) { | |
181 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
|
182 return; |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
183 } |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
184 |
6125
4dc8e7b62216
Removed the obsolete aio module.
Ruslan Ermilov <ru@nginx.com>
parents:
5820
diff
changeset
|
185 /* 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
|
186 |
93
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
187 if (ngx_inherited_nonblocking) { |
6125
4dc8e7b62216
Removed the obsolete aio module.
Ruslan Ermilov <ru@nginx.com>
parents:
5820
diff
changeset
|
188 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
|
189 if (ngx_blocking(s) == -1) { |
543 | 190 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
|
191 ngx_blocking_n " failed"); |
543 | 192 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
|
193 return; |
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
194 } |
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
195 } |
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
196 |
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
197 } else { |
6126
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
198 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
|
199 if (ngx_nonblocking(s) == -1) { |
543 | 200 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
|
201 ngx_nonblocking_n " failed"); |
543 | 202 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
|
203 return; |
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
204 } |
59
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
205 } |
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
206 } |
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
207 |
543 | 208 *log = ls->log; |
209 | |
210 c->recv = ngx_recv; | |
211 c->send = ngx_send; | |
577 | 212 c->recv_chain = ngx_recv_chain; |
543 | 213 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
|
214 |
543 | 215 c->log = log; |
216 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
|
217 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2255
diff
changeset
|
218 c->socklen = socklen; |
543 | 219 c->listening = ls; |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2255
diff
changeset
|
220 c->local_sockaddr = ls->sockaddr; |
5463
1ab1cf63f885
Core: keep the length of the local sockaddr.
Ruslan Ermilov <ru@nginx.com>
parents:
5360
diff
changeset
|
221 c->local_socklen = ls->socklen; |
543 | 222 |
3230
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
223 #if (NGX_HAVE_UNIX_DOMAIN) |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
224 if (c->sockaddr->sa_family == AF_UNIX) { |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
225 c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
226 c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
227 #if (NGX_SOLARIS) |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
228 /* 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
|
229 c->sendfile = 0; |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
230 #endif |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
231 } |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
232 #endif |
a7491af45540
http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
233 |
561 | 234 rev = c->read; |
235 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
|
236 |
164
84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
121
diff
changeset
|
237 wev->ready = 1; |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
238 |
6126
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
239 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
|
240 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
|
241 } |
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
242 |
245
e6c005b66b3a
nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
236
diff
changeset
|
243 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
|
244 rev->ready = 1; |
7005
3e2d90073adf
Fixed deferred accept with EPOLLRDHUP enabled (ticket #1278).
Roman Arutyunyan <arut@nginx.com>
parents:
6692
diff
changeset
|
245 #if (NGX_HAVE_KQUEUE || NGX_HAVE_EPOLLRDHUP) |
523 | 246 rev->available = 1; |
247 #endif | |
245
e6c005b66b3a
nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
236
diff
changeset
|
248 } |
e6c005b66b3a
nginx-0.0.1-2004-01-30-00:45:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
236
diff
changeset
|
249 |
191
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
250 rev->log = log; |
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
251 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
|
252 |
208
0b67be7d4489
nginx-0.0.1-2003-12-08-23:48:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
206
diff
changeset
|
253 /* |
561 | 254 * 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
|
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 * |
0b67be7d4489
nginx-0.0.1-2003-12-08-23:48:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
206
diff
changeset
|
257 * TODO: MP: - allocated in a shared memory |
561 | 258 * - 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
|
259 * 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
|
260 */ |
212
679f60139863
nginx-0.0.1-2003-12-19-11:15:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
208
diff
changeset
|
261 |
561 | 262 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
|
263 |
495 | 264 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2723
diff
changeset
|
265 (void) ngx_atomic_fetch_add(ngx_stat_handled, 1); |
495 | 266 #endif |
267 | |
543 | 268 if (ls->addr_ntop) { |
2049 | 269 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
|
270 if (c->addr_text.data == NULL) { |
543 | 271 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
|
272 return; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
273 } |
577 | 274 |
5263
05ba5bce31e0
Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents:
4618
diff
changeset
|
275 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
|
276 c->addr_text.data, |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2255
diff
changeset
|
277 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
|
278 if (c->addr_text.len == 0) { |
543 | 279 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
|
280 return; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
281 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
282 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
283 |
307
ce375c313e96
nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
306
diff
changeset
|
284 #if (NGX_DEBUG) |
ce375c313e96
nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
306
diff
changeset
|
285 { |
6436 | 286 ngx_str_t addr; |
287 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
|
288 |
6436 | 289 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
|
290 |
5704
524741fd50ed
Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents:
5600
diff
changeset
|
291 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
|
292 addr.data = text; |
524741fd50ed
Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents:
5600
diff
changeset
|
293 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
|
294 NGX_SOCKADDR_STRLEN, 1); |
524741fd50ed
Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents:
5600
diff
changeset
|
295 |
524741fd50ed
Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents:
5600
diff
changeset
|
296 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
|
297 "*%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
|
298 } |
524741fd50ed
Core: output client port number when logging accept event.
Ruslan Ermilov <ru@nginx.com>
parents:
5600
diff
changeset
|
299 |
307
ce375c313e96
nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
306
diff
changeset
|
300 } |
ce375c313e96
nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
306
diff
changeset
|
301 #endif |
ce375c313e96
nginx-0.0.3-2004-04-08-19:58:25 import
Igor Sysoev <igor@sysoev.ru>
parents:
306
diff
changeset
|
302 |
381
02a511569afb
nginx-0.0.7-2004-07-07-19:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
380
diff
changeset
|
303 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
|
304 if (ngx_add_conn(c) == NGX_ERROR) { |
543 | 305 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
|
306 return; |
64
34d647deb1da
nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
63
diff
changeset
|
307 } |
34d647deb1da
nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
63
diff
changeset
|
308 } |
34d647deb1da
nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
63
diff
changeset
|
309 |
191
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
310 log->data = NULL; |
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
311 log->handler = NULL; |
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
312 |
543 | 313 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
|
314 |
455 | 315 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
|
316 ev->available--; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
44
diff
changeset
|
317 } |
191
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
318 |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
319 } while (ev->available); |
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
320 } |
191
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
321 |
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
322 |
6436 | 323 #if !(NGX_WIN32) |
324 | |
325 void | |
326 ngx_event_recvmsg(ngx_event_t *ev) | |
327 { | |
328 ssize_t n; | |
329 ngx_log_t *log; | |
330 ngx_err_t err; | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
331 socklen_t socklen, local_socklen; |
6436 | 332 ngx_event_t *rev, *wev; |
333 struct iovec iov[1]; | |
334 struct msghdr msg; | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
335 ngx_sockaddr_t sa, lsa; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
336 struct sockaddr *sockaddr, *local_sockaddr; |
6436 | 337 ngx_listening_t *ls; |
338 ngx_event_conf_t *ecf; | |
339 ngx_connection_t *c, *lc; | |
340 static u_char buffer[65535]; | |
341 | |
342 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | |
343 | |
344 #if (NGX_HAVE_IP_RECVDSTADDR) | |
345 u_char msg_control[CMSG_SPACE(sizeof(struct in_addr))]; | |
346 #elif (NGX_HAVE_IP_PKTINFO) | |
347 u_char msg_control[CMSG_SPACE(sizeof(struct in_pktinfo))]; | |
348 #endif | |
349 | |
350 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
351 u_char msg_control6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; | |
352 #endif | |
353 | |
354 #endif | |
355 | |
356 if (ev->timedout) { | |
357 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { | |
358 return; | |
359 } | |
360 | |
361 ev->timedout = 0; | |
362 } | |
363 | |
364 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); | |
365 | |
366 if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) { | |
367 ev->available = ecf->multi_accept; | |
368 } | |
369 | |
370 lc = ev->data; | |
371 ls = lc->listening; | |
372 ev->ready = 0; | |
373 | |
374 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
375 "recvmsg on %V, ready: %d", &ls->addr_text, ev->available); | |
376 | |
377 do { | |
378 ngx_memzero(&msg, sizeof(struct msghdr)); | |
379 | |
380 iov[0].iov_base = (void *) buffer; | |
381 iov[0].iov_len = sizeof(buffer); | |
382 | |
383 msg.msg_name = &sa; | |
6559
adf25b8d0431
Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents:
6532
diff
changeset
|
384 msg.msg_namelen = sizeof(ngx_sockaddr_t); |
6436 | 385 msg.msg_iov = iov; |
386 msg.msg_iovlen = 1; | |
387 | |
388 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | |
389 | |
390 if (ls->wildcard) { | |
391 | |
392 #if (NGX_HAVE_IP_RECVDSTADDR || NGX_HAVE_IP_PKTINFO) | |
393 if (ls->sockaddr->sa_family == AF_INET) { | |
394 msg.msg_control = &msg_control; | |
395 msg.msg_controllen = sizeof(msg_control); | |
396 } | |
397 #endif | |
398 | |
399 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
400 if (ls->sockaddr->sa_family == AF_INET6) { | |
401 msg.msg_control = &msg_control6; | |
402 msg.msg_controllen = sizeof(msg_control6); | |
403 } | |
404 #endif | |
405 } | |
406 | |
407 #endif | |
408 | |
409 n = recvmsg(lc->fd, &msg, 0); | |
410 | |
411 if (n == -1) { | |
412 err = ngx_socket_errno; | |
413 | |
414 if (err == NGX_EAGAIN) { | |
415 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err, | |
416 "recvmsg() not ready"); | |
417 return; | |
418 } | |
419 | |
420 ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed"); | |
421 | |
422 return; | |
423 } | |
424 | |
425 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | |
426 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { | |
427 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | |
428 "recvmsg() truncated data"); | |
429 continue; | |
430 } | |
431 #endif | |
432 | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
433 sockaddr = msg.msg_name; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
434 socklen = msg.msg_namelen; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
435 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
436 if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
437 socklen = sizeof(ngx_sockaddr_t); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
438 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
439 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
440 if (socklen == 0) { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
441 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
442 /* |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
443 * on Linux recvmsg() returns zero msg_namelen |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
444 * when receiving packets from unbound AF_UNIX sockets |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
445 */ |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
446 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
447 socklen = sizeof(struct sockaddr); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
448 ngx_memzero(&sa, sizeof(struct sockaddr)); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
449 sa.sockaddr.sa_family = ls->sockaddr->sa_family; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
450 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
451 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
452 local_sockaddr = ls->sockaddr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
453 local_socklen = ls->socklen; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
454 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
455 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
456 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
457 if (ls->wildcard) { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
458 struct cmsghdr *cmsg; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
459 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
460 ngx_memcpy(&lsa, local_sockaddr, local_socklen); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
461 local_sockaddr = &lsa.sockaddr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
462 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
463 for (cmsg = CMSG_FIRSTHDR(&msg); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
464 cmsg != NULL; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
465 cmsg = CMSG_NXTHDR(&msg, cmsg)) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
466 { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
467 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
468 #if (NGX_HAVE_IP_RECVDSTADDR) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
469 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
470 if (cmsg->cmsg_level == IPPROTO_IP |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
471 && cmsg->cmsg_type == IP_RECVDSTADDR |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
472 && local_sockaddr->sa_family == AF_INET) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
473 { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
474 struct in_addr *addr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
475 struct sockaddr_in *sin; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
476 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
477 addr = (struct in_addr *) CMSG_DATA(cmsg); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
478 sin = (struct sockaddr_in *) local_sockaddr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
479 sin->sin_addr = *addr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
480 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
481 break; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
482 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
483 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
484 #elif (NGX_HAVE_IP_PKTINFO) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
485 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
486 if (cmsg->cmsg_level == IPPROTO_IP |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
487 && cmsg->cmsg_type == IP_PKTINFO |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
488 && local_sockaddr->sa_family == AF_INET) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
489 { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
490 struct in_pktinfo *pkt; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
491 struct sockaddr_in *sin; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
492 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
493 pkt = (struct in_pktinfo *) CMSG_DATA(cmsg); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
494 sin = (struct sockaddr_in *) local_sockaddr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
495 sin->sin_addr = pkt->ipi_addr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
496 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
497 break; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
498 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
499 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
500 #endif |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
501 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
502 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
503 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
504 if (cmsg->cmsg_level == IPPROTO_IPV6 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
505 && cmsg->cmsg_type == IPV6_PKTINFO |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
506 && local_sockaddr->sa_family == AF_INET6) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
507 { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
508 struct in6_pktinfo *pkt6; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
509 struct sockaddr_in6 *sin6; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
510 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
511 pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
512 sin6 = (struct sockaddr_in6 *) local_sockaddr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
513 sin6->sin6_addr = pkt6->ipi6_addr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
514 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
515 break; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
516 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
517 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
518 #endif |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
519 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
520 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
521 } |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
522 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
523 #endif |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
524 |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
525 #if (NGX_STAT_STUB) |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
526 (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
527 #endif |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
528 |
6436 | 529 ngx_accept_disabled = ngx_cycle->connection_n / 8 |
530 - ngx_cycle->free_connection_n; | |
531 | |
532 c = ngx_get_connection(lc->fd, ev->log); | |
533 if (c == NULL) { | |
534 return; | |
535 } | |
536 | |
537 c->shared = 1; | |
538 c->type = SOCK_DGRAM; | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
539 c->socklen = socklen; |
7283
d0b897c0bb5b
Events: fixed handling zero-length client address.
Roman Arutyunyan <arut@nginx.com>
parents:
7119
diff
changeset
|
540 |
6436 | 541 #if (NGX_STAT_STUB) |
542 (void) ngx_atomic_fetch_add(ngx_stat_active, 1); | |
543 #endif | |
544 | |
545 c->pool = ngx_create_pool(ls->pool_size, ev->log); | |
546 if (c->pool == NULL) { | |
547 ngx_close_accepted_connection(c); | |
548 return; | |
549 } | |
550 | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
551 c->sockaddr = ngx_palloc(c->pool, socklen); |
6436 | 552 if (c->sockaddr == NULL) { |
553 ngx_close_accepted_connection(c); | |
554 return; | |
555 } | |
556 | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
557 ngx_memcpy(c->sockaddr, sockaddr, socklen); |
6436 | 558 |
559 log = ngx_palloc(c->pool, sizeof(ngx_log_t)); | |
560 if (log == NULL) { | |
561 ngx_close_accepted_connection(c); | |
562 return; | |
563 } | |
564 | |
565 *log = ls->log; | |
566 | |
567 c->send = ngx_udp_send; | |
6692 | 568 c->send_chain = ngx_udp_send_chain; |
6436 | 569 |
570 c->log = log; | |
571 c->pool->log = log; | |
572 c->listening = ls; | |
573 | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
574 if (local_sockaddr == &lsa.sockaddr) { |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
575 local_sockaddr = ngx_palloc(c->pool, local_socklen); |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
576 if (local_sockaddr == NULL) { |
6436 | 577 ngx_close_accepted_connection(c); |
578 return; | |
579 } | |
580 | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
581 ngx_memcpy(local_sockaddr, &lsa, local_socklen); |
6436 | 582 } |
583 | |
7284
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
584 c->local_sockaddr = local_sockaddr; |
52aacc8ddcc5
Events: get remote addresses before creating udp connection.
Roman Arutyunyan <arut@nginx.com>
parents:
7283
diff
changeset
|
585 c->local_socklen = local_socklen; |
6436 | 586 |
587 c->buffer = ngx_create_temp_buf(c->pool, n); | |
588 if (c->buffer == NULL) { | |
589 ngx_close_accepted_connection(c); | |
590 return; | |
591 } | |
592 | |
593 c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n); | |
594 | |
595 rev = c->read; | |
596 wev = c->write; | |
597 | |
598 wev->ready = 1; | |
599 | |
600 rev->log = log; | |
601 wev->log = log; | |
602 | |
603 /* | |
604 * TODO: MT: - ngx_atomic_fetch_add() | |
605 * or protection by critical section or light mutex | |
606 * | |
607 * TODO: MP: - allocated in a shared memory | |
608 * - ngx_atomic_fetch_add() | |
609 * or protection by critical section or light mutex | |
610 */ | |
611 | |
612 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); | |
613 | |
614 #if (NGX_STAT_STUB) | |
615 (void) ngx_atomic_fetch_add(ngx_stat_handled, 1); | |
616 #endif | |
617 | |
618 if (ls->addr_ntop) { | |
619 c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len); | |
620 if (c->addr_text.data == NULL) { | |
621 ngx_close_accepted_connection(c); | |
622 return; | |
623 } | |
624 | |
625 c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, | |
626 c->addr_text.data, | |
627 ls->addr_text_max_len, 0); | |
628 if (c->addr_text.len == 0) { | |
629 ngx_close_accepted_connection(c); | |
630 return; | |
631 } | |
632 } | |
633 | |
634 #if (NGX_DEBUG) | |
635 { | |
636 ngx_str_t addr; | |
637 u_char text[NGX_SOCKADDR_STRLEN]; | |
638 | |
639 ngx_debug_accepted_connection(ecf, c); | |
640 | |
641 if (log->log_level & NGX_LOG_DEBUG_EVENT) { | |
642 addr.data = text; | |
643 addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text, | |
644 NGX_SOCKADDR_STRLEN, 1); | |
645 | |
646 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, | |
647 "*%uA recvmsg: %V fd:%d n:%z", | |
648 c->number, &addr, c->fd, n); | |
649 } | |
650 | |
651 } | |
652 #endif | |
653 | |
654 log->data = NULL; | |
655 log->handler = NULL; | |
656 | |
657 ls->handler(c); | |
658 | |
659 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { | |
660 ev->available -= n; | |
661 } | |
662 | |
663 } while (ev->available); | |
664 } | |
665 | |
666 #endif | |
667 | |
668 | |
493 | 669 ngx_int_t |
670 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
|
671 { |
611 | 672 if (ngx_shmtx_trylock(&ngx_accept_mutex)) { |
673 | |
301
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
674 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
|
675 "accept mutex locked"); |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
676 |
6126
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
677 if (ngx_accept_mutex_held && ngx_accept_events == 0) { |
573 | 678 return NGX_OK; |
679 } | |
301
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
680 |
573 | 681 if (ngx_enable_accept_events(cycle) == NGX_ERROR) { |
611 | 682 ngx_shmtx_unlock(&ngx_accept_mutex); |
573 | 683 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
|
684 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
685 |
719
f30b1a75fd3b
Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents:
714
diff
changeset
|
686 ngx_accept_events = 0; |
573 | 687 ngx_accept_mutex_held = 1; |
688 | |
301
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
689 return NGX_OK; |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
690 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
691 |
719
f30b1a75fd3b
Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents:
714
diff
changeset
|
692 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
|
693 "accept mutex lock failed: %ui", ngx_accept_mutex_held); |
f30b1a75fd3b
Solaris 10 event ports support
Igor Sysoev <igor@sysoev.ru>
parents:
714
diff
changeset
|
694 |
302
1526e7686b20
nginx-0.0.3-2004-04-01-10:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
301
diff
changeset
|
695 if (ngx_accept_mutex_held) { |
6153
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
696 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
|
697 return NGX_ERROR; |
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 |
302
1526e7686b20
nginx-0.0.3-2004-04-01-10:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
301
diff
changeset
|
700 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
|
701 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
702 |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
703 return NGX_OK; |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
704 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
705 |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
706 |
573 | 707 static ngx_int_t |
493 | 708 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
|
709 { |
543 | 710 ngx_uint_t i; |
711 ngx_listening_t *ls; | |
712 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
|
713 |
543 | 714 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
|
715 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
|
716 |
543 | 717 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
|
718 |
6153
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
719 if (c == NULL || c->read->active) { |
4618
c05cfc46b3bc
Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4613
diff
changeset
|
720 continue; |
c05cfc46b3bc
Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4613
diff
changeset
|
721 } |
c05cfc46b3bc
Accept moderation in case of EMFILE/ENFILE.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4613
diff
changeset
|
722 |
6126
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
723 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
|
724 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
|
725 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
726 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
727 |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
728 return NGX_OK; |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
729 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
730 |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
731 |
573 | 732 static ngx_int_t |
6153
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
733 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
|
734 { |
543 | 735 ngx_uint_t i; |
736 ngx_listening_t *ls; | |
737 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
|
738 |
543 | 739 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
|
740 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
|
741 |
543 | 742 c = ls[i].connection; |
743 | |
6153
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
744 if (c == NULL || !c->read->active) { |
543 | 745 continue; |
746 } | |
301
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
747 |
6153
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
748 #if (NGX_HAVE_REUSEPORT) |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
749 |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
750 /* |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
751 * 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
|
752 * 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
|
753 */ |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
754 |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
755 if (ls[i].reuseport && !all) { |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
756 continue; |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
757 } |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
758 |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
759 #endif |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6126
diff
changeset
|
760 |
6126
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
761 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
|
762 == NGX_ERROR) |
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
763 { |
adba26ff70b5
Removed the obsolete rtsig module.
Ruslan Ermilov <ru@nginx.com>
parents:
6125
diff
changeset
|
764 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
|
765 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
766 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
767 |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
768 return NGX_OK; |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
769 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
770 |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
771 |
493 | 772 static void |
543 | 773 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
|
774 { |
543 | 775 ngx_socket_t fd; |
776 | |
777 ngx_free_connection(c); | |
778 | |
779 fd = c->fd; | |
780 c->fd = (ngx_socket_t) -1; | |
781 | |
6436 | 782 if (!c->shared && ngx_close_socket(fd) == -1) { |
543 | 783 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
|
784 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
|
785 } |
495 | 786 |
543 | 787 if (c->pool) { |
788 ngx_destroy_pool(c->pool); | |
789 } | |
790 | |
495 | 791 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2723
diff
changeset
|
792 (void) ngx_atomic_fetch_add(ngx_stat_active, -1); |
495 | 793 #endif |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
794 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
795 |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
396
diff
changeset
|
796 |
543 | 797 u_char * |
493 | 798 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
|
799 { |
543 | 800 return ngx_snprintf(buf, len, " while accepting new connection on %V", |
801 log->data); | |
191
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
164
diff
changeset
|
802 } |
6436 | 803 |
804 | |
805 #if (NGX_DEBUG) | |
806 | |
807 static void | |
808 ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c) | |
809 { | |
810 struct sockaddr_in *sin; | |
811 ngx_cidr_t *cidr; | |
812 ngx_uint_t i; | |
813 #if (NGX_HAVE_INET6) | |
814 struct sockaddr_in6 *sin6; | |
815 ngx_uint_t n; | |
816 #endif | |
817 | |
818 cidr = ecf->debug_connection.elts; | |
819 for (i = 0; i < ecf->debug_connection.nelts; i++) { | |
820 if (cidr[i].family != (ngx_uint_t) c->sockaddr->sa_family) { | |
821 goto next; | |
822 } | |
823 | |
824 switch (cidr[i].family) { | |
825 | |
826 #if (NGX_HAVE_INET6) | |
827 case AF_INET6: | |
828 sin6 = (struct sockaddr_in6 *) c->sockaddr; | |
829 for (n = 0; n < 16; n++) { | |
830 if ((sin6->sin6_addr.s6_addr[n] | |
831 & cidr[i].u.in6.mask.s6_addr[n]) | |
832 != cidr[i].u.in6.addr.s6_addr[n]) | |
833 { | |
834 goto next; | |
835 } | |
836 } | |
837 break; | |
838 #endif | |
839 | |
840 #if (NGX_HAVE_UNIX_DOMAIN) | |
841 case AF_UNIX: | |
842 break; | |
843 #endif | |
844 | |
845 default: /* AF_INET */ | |
846 sin = (struct sockaddr_in *) c->sockaddr; | |
847 if ((sin->sin_addr.s_addr & cidr[i].u.in.mask) | |
848 != cidr[i].u.in.addr) | |
849 { | |
850 goto next; | |
851 } | |
852 break; | |
853 } | |
854 | |
855 c->log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL; | |
856 break; | |
857 | |
858 next: | |
859 continue; | |
860 } | |
861 } | |
862 | |
863 #endif |