Lines Matching refs:conn
18 static void connection_idle_timeout(struct connection *conn)
20 conn->disconnect_reason = CONNECTION_DISCONNECT_IDLE_TIMEOUT;
21 conn->list->v.destroy(conn);
24 static void connection_connect_timeout(struct connection *conn)
26 conn->disconnect_reason = CONNECTION_DISCONNECT_CONNECT_TIMEOUT;
27 conn->list->v.destroy(conn);
30 void connection_input_default(struct connection *conn)
37 switch (connection_input_read(conn)) {
47 input = conn->input;
48 output = conn->output;
56 ret = conn->list->v.input_line(conn, line);
66 conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
67 conn->list->v.destroy(conn);
72 int connection_verify_version(struct connection *conn,
81 str_to_uint(args[3], &conn->minor_version) < 0) {
83 conn->name, t_strarray_join(args, "\t"));
87 if (strcmp(args[1], conn->list->set.service_name_in) != 0) {
89 "We want '%s', but received '%s'", conn->name,
90 conn->list->set.service_name_in, args[1]);
94 if (recv_major_version != conn->list->set.major_version) {
97 conn->name, recv_major_version,
98 conn->list->set.major_version);
104 int connection_input_line_default(struct connection *conn, const char *line)
109 if (!conn->version_received) {
110 if (connection_verify_version(conn, args) < 0)
112 conn->version_received = TRUE;
115 if (args[0] == NULL && !conn->list->set.allow_empty_args_input) {
116 i_error("%s: Unexpectedly received empty line", conn->name);
120 return conn->list->v.input_args(conn, args);
123 void connection_input_halt(struct connection *conn)
125 io_remove(&conn->io);
128 void connection_input_resume(struct connection *conn)
130 const struct connection_settings *set = &conn->list->set;
132 if (conn->io != NULL)
134 if (conn->from_streams || set->input_max_size != 0) {
135 conn->io = io_add_istream_to(conn->ioloop, conn->input,
136 *conn->list->v.input, conn);
138 conn->io = io_add_to(conn->ioloop, conn->fd_in, IO_READ,
139 *conn->list->v.input, conn);
143 static void connection_init_streams(struct connection *conn)
145 const struct connection_settings *set = &conn->list->set;
147 i_assert(conn->io == NULL);
148 i_assert(conn->input == NULL);
149 i_assert(conn->output == NULL);
150 i_assert(conn->to == NULL);
152 conn->version_received = set->major_version == 0;
155 if (conn->unix_socket)
156 conn->input = i_stream_create_unix(conn->fd_in,
159 conn->input = i_stream_create_fd(conn->fd_in,
161 i_stream_set_name(conn->input, conn->name);
162 i_stream_switch_ioloop_to(conn->input, conn->ioloop);
165 if (conn->unix_socket)
166 conn->output = o_stream_create_unix(conn->fd_out,
169 conn->output = o_stream_create_fd(conn->fd_out,
171 o_stream_set_no_error_handling(conn->output, TRUE);
172 o_stream_set_finish_via_child(conn->output, FALSE);
173 o_stream_set_name(conn->output, conn->name);
174 o_stream_switch_ioloop_to(conn->output, conn->ioloop);
176 connection_input_resume(conn);
178 conn->to = timeout_add_to(conn->ioloop,
180 connection_idle_timeout, conn);
183 o_stream_nsend_str(conn->output, t_strdup_printf(
189 void connection_streams_changed(struct connection *conn)
191 const struct connection_settings *set = &conn->list->set;
193 if (set->input_max_size != 0 && conn->io != NULL) {
194 connection_input_halt(conn);
195 connection_input_resume(conn);
199 static void connection_client_connected(struct connection *conn, bool success)
201 i_assert(conn->list->set.client);
203 conn->connect_finished = ioloop_timeval;
205 connection_init_streams(conn);
206 if (conn->list->v.client_connected != NULL)
207 conn->list->v.client_connected(conn, success);
209 conn->disconnect_reason =
211 conn->list->v.destroy(conn);
216 struct connection *conn)
218 conn->ioloop = current_ioloop;
219 conn->fd_in = -1;
220 conn->fd_out = -1;
221 conn->name = NULL;
223 if (conn->list != NULL) {
224 i_assert(conn->list == list);
226 conn->list = list;
227 DLLIST_PREPEND(&list->connections, conn);
233 struct connection *conn, const char *name,
239 connection_init(list, conn);
241 conn->name = i_strdup(name);
242 conn->fd_in = fd_in;
243 conn->fd_out = fd_out;
244 connection_init_streams(conn);
248 struct connection *conn,
254 connection_init(list, conn);
256 conn->fd_in = conn->fd_out = -1;
257 conn->name = i_strdup_printf("%s:%u", net_ip2addr(ip), port);
259 conn->ip = *ip;
260 conn->port = port;
263 conn->my_ip = *my_ip;
265 i_zero(&conn->my_ip);
269 struct connection *conn,
272 connection_init_client_ip_from(list, conn, ip, port, NULL);
276 struct connection *conn, const char *path)
280 connection_init(list, conn);
282 conn->fd_in = conn->fd_out = -1;
283 conn->name = i_strdup(path);
284 conn->unix_socket = TRUE;
288 struct connection *conn, const char *name,
293 connection_init(list, conn);
295 conn->name = i_strdup(name);
296 conn->from_streams = TRUE;
297 conn->fd_in = i_stream_get_fd(input);
298 conn->fd_out = o_stream_get_fd(output);
300 i_assert(conn->fd_in >= 0);
301 i_assert(conn->fd_out >= 0);
302 i_assert(conn->io == NULL);
303 i_assert(conn->input == NULL);
304 i_assert(conn->output == NULL);
305 i_assert(conn->to == NULL);
307 conn->input = input;
308 i_stream_ref(conn->input);
309 i_stream_set_name(conn->input, conn->name);
311 conn->output = output;
312 o_stream_ref(conn->output);
313 o_stream_set_no_error_handling(conn->output, TRUE);
314 o_stream_set_name(conn->output, conn->name);
316 connection_input_resume(conn);
319 list->v.client_connected(conn, TRUE);
322 static void connection_socket_connected(struct connection *conn)
324 io_remove(&conn->io);
325 timeout_remove(&conn->to);
327 errno = net_geterror(conn->fd_in);
328 connection_client_connected(conn, errno == 0);
331 int connection_client_connect(struct connection *conn)
333 const struct connection_settings *set = &conn->list->set;
336 i_assert(conn->list->set.client);
337 i_assert(conn->fd_in == -1);
339 if (conn->port != 0) {
340 fd = net_connect_ip(&conn->ip, conn->port,
341 (conn->my_ip.family != 0 ? &conn->my_ip : NULL));
342 } else if (conn->list->set.unix_client_connect_msecs == 0)
343 fd = net_connect_unix(conn->name);
345 fd = net_connect_unix_with_retries(conn->name, conn->list->set.unix_client_connect_msecs);
348 conn->fd_in = conn->fd_out = fd;
349 conn->connect_started = ioloop_timeval;
351 if (conn->port != 0 ||
352 conn->list->set.delayed_unix_client_connected_callback) {
353 conn->io = io_add_to(conn->ioloop, conn->fd_out, IO_WRITE,
354 connection_socket_connected, conn);
356 conn->to = timeout_add_to(conn->ioloop,
358 connection_connect_timeout, conn);
361 connection_client_connected(conn, TRUE);
366 void connection_disconnect(struct connection *conn)
368 conn->last_input = 0;
369 i_zero(&conn->last_input_tv);
370 timeout_remove(&conn->to);
371 io_remove(&conn->io);
372 i_stream_close(conn->input);
373 i_stream_destroy(&conn->input);
374 o_stream_close(conn->output);
375 o_stream_destroy(&conn->output);
376 fd_close_maybe_stdio(&conn->fd_in, &conn->fd_out);
379 void connection_deinit(struct connection *conn)
381 i_assert(conn->list->connections_count > 0);
383 conn->list->connections_count--;
384 DLLIST_REMOVE(&conn->list->connections, conn);
386 connection_disconnect(conn);
387 i_free(conn->name);
390 int connection_input_read(struct connection *conn)
392 conn->last_input = ioloop_time;
393 conn->last_input_tv = ioloop_timeval;
394 if (conn->to != NULL)
395 timeout_reset(conn->to);
397 switch (i_stream_read(conn->input)) {
400 switch (conn->list->set.input_full_behavior) {
402 conn->disconnect_reason =
404 conn->list->v.destroy(conn);
412 conn->disconnect_reason =
414 conn->list->v.destroy(conn);
425 const char *connection_disconnect_reason(struct connection *conn)
427 switch (conn->disconnect_reason) {
432 conn->list->set.client_connect_timeout_msecs;
439 if (conn->input == NULL)
444 return io_stream_get_disconnect_reason(conn->input, conn->output);
449 const char *connection_input_timeout_reason(struct connection *conn)
451 if (conn->last_input_tv.tv_sec != 0) {
452 int diff = timeval_diff_msecs(&ioloop_timeval, &conn->last_input_tv);
455 } else if (conn->connect_finished.tv_sec != 0) {
456 int diff = timeval_diff_msecs(&ioloop_timeval, &conn->connect_finished);
461 int diff = timeval_diff_msecs(&ioloop_timeval, &conn->connect_started);
467 void connection_switch_ioloop_to(struct connection *conn,
470 conn->ioloop = ioloop;
471 if (conn->io != NULL)
472 conn->io = io_loop_move_io_to(ioloop, &conn->io);
473 if (conn->to != NULL)
474 conn->to = io_loop_move_timeout_to(ioloop, &conn->to);
475 if (conn->input != NULL)
476 i_stream_switch_ioloop_to(conn->input, ioloop);
477 if (conn->output != NULL)
478 o_stream_switch_ioloop_to(conn->output, ioloop);
481 void connection_switch_ioloop(struct connection *conn)
483 connection_switch_ioloop_to(conn, current_ioloop);
514 struct connection *conn;
519 conn = list->connections;
520 conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
521 list->v.destroy(conn);
522 i_assert(conn != list->connections);