annotate src/event/ngx_event_connect.c @ 554:5c576ea5dbd9 NGINX_0_8_29

nginx 0.8.29 *) Change: now the "009" status code is written to an access log for proxied HTTP/0.9 responses. *) Feature: the "addition_types", "charset_types", "gzip_types", "ssi_types", "sub_filter_types", and "xslt_types" directives support an "*" parameter. *) Feature: GCC 4.1+ built-in atomic operations usage. Thanks to W-Mark Kubacki. *) Feature: the --with-libatomic[=DIR] option in the configure. Thanks to W-Mark Kubacki. *) Bugfix: listen unix domain socket had limited access rights. *) Bugfix: cached HTTP/0.9 responses were handled incorrectly. *) Bugfix: regular expression named captures given by "?P<...>" did not work in a "server_name" directive. Thanks to Maxim Dounin.
author Igor Sysoev <http://sysoev.ru>
date Mon, 30 Nov 2009 00:00:00 +0300
parents c04fa65fe604
children d0f7a625f27c
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");
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
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
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
65 goto failed;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
66 }
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
67
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
68 if (pc->local) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
69 if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
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: 454
diff changeset
71 "bind(%V) failed", &pc->local->name);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
72
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
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
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 94
diff changeset
104 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 #if (NGX_THREADS)
554
5c576ea5dbd9 nginx 0.8.29
Igor Sysoev <http://sysoev.ru>
parents: 540
diff changeset
107
5c576ea5dbd9 nginx 0.8.29
Igor Sysoev <http://sysoev.ru>
parents: 540
diff changeset
108 /* TODO: lock event when call completion handler */
5c576ea5dbd9 nginx 0.8.29
Igor Sysoev <http://sysoev.ru>
parents: 540
diff changeset
109
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 rev->lock = pc->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 wev->lock = pc->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 rev->own_lock = &c->lock;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 wev->own_lock = &c->lock;
554
5c576ea5dbd9 nginx 0.8.29
Igor Sysoev <http://sysoev.ru>
parents: 540
diff changeset
114
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 if (ngx_add_conn) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 if (ngx_add_conn(c) == NGX_ERROR) {
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
119 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
121 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
123 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
124 "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
125
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
126 rc = connect(s, pc->sockaddr, pc->socklen);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 if (rc == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 err = ngx_socket_errno;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131
390
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
132 if (err != NGX_EINPROGRESS
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
133 #if (NGX_WIN32)
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
134 /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
135 && err != NGX_EAGAIN
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
136 #endif
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
137 )
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
138 {
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
139 if (err == NGX_ECONNREFUSED
390
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
140 #if (NGX_LINUX)
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
141 /*
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
142 * Linux returns EAGAIN instead of ECONNREFUSED
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
143 * for unix sockets if listen queue is full
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
144 */
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
145 || err == NGX_EAGAIN
0b6053502c55 nginx 0.7.7
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
146 #endif
454
a8424ffa495c nginx 0.7.39
Igor Sysoev <http://sysoev.ru>
parents: 390
diff changeset
147 || err == NGX_ECONNRESET
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
148 || err == NGX_ENETDOWN
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
149 || err == NGX_ENETUNREACH
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
150 || err == NGX_EHOSTDOWN
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
151 || err == NGX_EHOSTUNREACH)
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
152 {
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
153 level = NGX_LOG_ERR;
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
154
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
155 } else {
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
156 level = NGX_LOG_CRIT;
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
157 }
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
158
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
159 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
160 pc->name);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
162 return NGX_DECLINED;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 if (ngx_add_conn) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 if (rc == -1) {
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
168
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 /* NGX_EINPROGRESS */
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
170
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
173
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 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
175
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
176 wev->ready = 1;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
177
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
183 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
184 "connect(): %d", rc);
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
185
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 /* aio, iocp */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 if (ngx_blocking(s) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 ngx_blocking_n " failed");
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
191 goto failed;
0
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
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 /*
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
195 * 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
196 * NT does not support it.
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
197 *
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 * 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
199 */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
200
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 rev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202 wev->ready = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
207 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
208
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
209 /* kqueue */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
210
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 event = NGX_CLEAR_EVENT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
213 } else {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
214
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
215 /* select, poll, /dev/poll */
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
216
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 event = NGX_LEVEL_EVENT;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
221 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 }
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 if (rc == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 /* NGX_EINPROGRESS */
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 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) {
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
229 goto failed;
0
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
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected");
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 wev->ready = 1;
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 return NGX_OK;
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
240
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
241 failed:
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
242
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
243 ngx_free_connection(c);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
244
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
245 if (ngx_close_socket(s) == -1) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
246 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
247 ngx_close_socket_n " failed");
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
248 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
249
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 454
diff changeset
250 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
254 ngx_int_t
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
255 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
256 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
257 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 }