annotate src/event/ngx_event_connect.c @ 552:c04fa65fe604 NGINX_0_8_22

nginx 0.8.22 *) Feature: the "proxy_bind", "fastcgi_bind", and "memcached_bind" directives. *) Feature: the "access" and the "deny" directives support IPv6. *) Feature: the "set_real_ip_from" directive supports IPv6 addresses in request headers. *) Feature: the "unix:" parameter of the "set_real_ip_from" directive. *) Bugfix: nginx did not delete unix domain socket after configuration testing. *) Bugfix: nginx deleted unix domain socket while online upgrade. *) Bugfix: the "!-x" operator did not work. Thanks to Maxim Dounin. *) Bugfix: a segmentation fault might occur in a worker process, if limit_rate was used in HTTPS server. Thanks to Maxim Dounin. *) Bugfix: a segmentation fault might occur in a worker process while $limit_rate logging. Thanks to Maxim Dounin. *) Bugfix: a segmentation fault might occur in a worker process, if there was no "listen" directive in "server" block; the bug had appeared in 0.8.21.
author Igor Sysoev <http://sysoev.ru>
date Tue, 03 Nov 2009 00:00:00 +0300
parents a8424ffa495c
children 5c576ea5dbd9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_event_connect.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
13 ngx_int_t
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
14 ngx_event_connect_peer(ngx_peer_connection_t *pc)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 {
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
16 int rc;
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
17 ngx_int_t event;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
18 ngx_err_t err;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
19 ngx_uint_t level;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
20 ngx_socket_t s;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
21 ngx_event_t *rev, *wev;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
22 ngx_connection_t *c;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
24 rc = pc->get(pc, pc->data);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
25 if (rc != NGX_OK) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
26 return rc;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
29 s = ngx_socket(pc->sockaddr->sa_family, SOCK_STREAM, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
31 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, "socket %d", s);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
32
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 if (s == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 ngx_socket_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
40 c = ngx_get_connection(s, pc->log);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
42 if (c == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 if (ngx_close_socket(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 ngx_close_socket_n "failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 if (pc->rcvbuf) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
53 (const void *) &pc->rcvbuf, sizeof(int)) == -1)
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
54 {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 "setsockopt(SO_RCVBUF) failed");
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
57 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 if (ngx_nonblocking(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 ngx_nonblocking_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
65 goto failed;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
66 }
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
67
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
68 if (pc->local) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
69 if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
70 ngx_log_error(NGX_LOG_CRIT, pc->log, ngx_socket_errno,
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
71 "bind(%V) failed", &pc->local->name);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
72
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
73 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
77 c->recv = ngx_recv;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
78 c->send = ngx_send;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
79 c->recv_chain = ngx_recv_chain;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
80 c->send_chain = ngx_send_chain;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
81
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
82 c->sendfile = 1;
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
83
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
84 c->log_error = pc->log_error;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
86 if (pc->sockaddr->sa_family != AF_INET) {
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
87 c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
88 c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
89
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
90 #if (NGX_SOLARIS)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
91 /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
92 c->sendfile = 0;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
93 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
96 rev = c->read;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
97 wev = c->write;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 rev->log = pc->log;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 wev->log = pc->log;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 pc->connection = c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 /*
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
105 * TODO: MT: - ngx_atomic_fetch_add()
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 * or protection by critical section or mutex
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 *
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 * TODO: MP: - allocated in a shared memory
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
109 * - ngx_atomic_fetch_add()
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 * or protection by critical section or mutex
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
113 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 rev->lock = pc->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 wev->lock = pc->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 rev->own_lock = &c->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 wev->own_lock = &c->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 if (ngx_add_conn) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 if (ngx_add_conn(c) == NGX_ERROR) {
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
124 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
126 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
128 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0,
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
129 "connect to %V, fd:%d #%d", pc->name, s, c->number);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
131 rc = connect(s, pc->sockaddr, pc->socklen);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 if (rc == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 err = ngx_socket_errno;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136
392
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
137 if (err != NGX_EINPROGRESS
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
138 #if (NGX_WIN32)
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
139 /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
140 && err != NGX_EAGAIN
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
141 #endif
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
142 )
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
143 {
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
144 if (err == NGX_ECONNREFUSED
392
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
145 #if (NGX_LINUX)
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
146 /*
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
147 * Linux returns EAGAIN instead of ECONNREFUSED
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
148 * for unix sockets if listen queue is full
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
149 */
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
150 || err == NGX_EAGAIN
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
151 #endif
463
a8424ffa495c nginx 0.7.39
Igor Sysoev <http://sysoev.ru>
parents: 392
diff changeset
152 || err == NGX_ECONNRESET
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
153 || err == NGX_ENETDOWN
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
154 || err == NGX_ENETUNREACH
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
155 || err == NGX_EHOSTDOWN
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
156 || err == NGX_EHOSTUNREACH)
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
157 {
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
158 level = NGX_LOG_ERR;
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
159
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
160 } else {
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
161 level = NGX_LOG_CRIT;
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
162 }
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
163
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
164 ngx_log_error(level, c->log, err, "connect() to %V failed",
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
165 pc->name);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
167 return NGX_DECLINED;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 if (ngx_add_conn) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 if (rc == -1) {
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
173
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 /* NGX_EINPROGRESS */
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
175
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
178
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
180
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
181 wev->ready = 1;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
182
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
188 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno,
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
189 "connect(): %d", rc);
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
190
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 /* aio, iocp */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 if (ngx_blocking(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 ngx_blocking_n " failed");
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
196 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 /*
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
200 * FreeBSD's aio allows to post an operation on non-connected socket.
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 * NT does not support it.
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
202 *
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
205
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 rev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 wev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
212 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
213
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
214 /* kqueue */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
215
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 event = NGX_CLEAR_EVENT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
218 } else {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
219
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
220 /* select, poll, /dev/poll */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
221
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 event = NGX_LEVEL_EVENT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
226 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 if (rc == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231 /* NGX_EINPROGRESS */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
234 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 wev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 return NGX_OK;
552
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
245
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
246 failed:
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
247
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
248 ngx_free_connection(c);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
249
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
250 if (ngx_close_socket(s) == -1) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
251 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
252 ngx_close_socket_n " failed");
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
253 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
254
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 463
diff changeset
255 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
259 ngx_int_t
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
260 ngx_event_get_peer(ngx_peer_connection_t *pc, void *data)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
262 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 }