Deleted Added
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8
9
10static nxt_err_t nxt_conn_connect_test_error(nxt_task_t *task, nxt_conn_t *c);
11
12
13void
14nxt_conn_sys_socket(nxt_task_t *task, void *obj, void *data)
15{
16 nxt_conn_t *c;
17 nxt_work_handler_t handler;
18
19 c = obj;
20

--- 26 unchanged lines hidden (view full) ---

47
48 case NXT_OK:
49 c->socket.write_ready = 1;
50 handler = state->ready_handler;
51 break;
52
53 case NXT_AGAIN:
54 c->socket.write_handler = nxt_conn_connect_test;
55 c->socket.error_handler = nxt_conn_connect_error;
56
57 engine = task->thread->engine;
58
59 nxt_conn_timer(engine, c, state, &c->write_timer);
60
61 nxt_fd_event_enable_write(engine, &c->socket);
62 return;
63

--- 52 unchanged lines hidden (view full) ---

116
117 return NXT_OK;
118}
119
120
121void
122nxt_conn_connect_test(nxt_task_t *task, void *obj, void *data)
123{
124 nxt_err_t err;
125 nxt_conn_t *c;
126
127 c = obj;
128
129 nxt_debug(task, "event connect test fd:%d", c->socket.fd);
130
131 nxt_fd_event_block_write(task->thread->engine, &c->socket);
132
133 if (c->write_state->timer_autoreset) {
134 nxt_timer_disable(task->thread->engine, &c->write_timer);
135 }
136
137 err = nxt_conn_connect_test_error(task, c);
138
139 if (err == 0) {
140 nxt_work_queue_add(c->write_work_queue, c->write_state->ready_handler,
141 task, c, data);
142 } else {
143 nxt_conn_connect_error(task, c, data);
144 }
145}
146
147
148void
149nxt_conn_connect_error(nxt_task_t *task, void *obj, void *data)
150{
151 nxt_err_t err;
152 nxt_conn_t *c;
153 nxt_work_handler_t handler;
154 const nxt_conn_state_t *state;
155
156 c = obj;
157 err = c->socket.error;
158
159 if (err == 0) {
160 err = nxt_conn_connect_test_error(task, c);
161 }
162
163 state = c->write_state;
164
165 switch (err) {
166
167 case NXT_ECONNREFUSED:
168#if (NXT_LINUX)
169 case NXT_EAGAIN:
170 /*
171 * Linux returns EAGAIN instead of ECONNREFUSED
172 * for UNIX sockets if a listen queue is full.
173 */
174#endif
175 handler = state->close_handler;
176 break;
177
178 default:
179 handler = state->error_handler;
180 break;
181 }
182
183 nxt_work_queue_add(c->write_work_queue, handler, task, c, data);
184}
185
186
187static nxt_err_t
188nxt_conn_connect_test_error(nxt_task_t *task, nxt_conn_t *c)
189{
190 nxt_err_t err;
191
192 err = nxt_socket_error(c->socket.fd);
193
194 if (err != 0) {
195 c->socket.error = err;
196
197 nxt_log(task, nxt_socket_error_level(err), "connect(%d, %*s) failed %E",
198 c->socket.fd, (size_t) c->remote->length,
199 nxt_sockaddr_start(c->remote), err);
200 }
201
202 return err;
203}