annotate src/lib/connection.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents edc9369f9d60
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
22147
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
6 #include "istream-unix.h"
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
22147
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
8 #include "ostream-unix.h"
18990
cd2c95d82d4c Use io_stream_get_disconnect_reason() instead of duplicating its code all over the place.
Timo Sirainen <tss@iki.fi>
parents: 18988
diff changeset
9 #include "iostream.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
10 #include "net.h"
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "strescape.h"
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "llist.h"
20625
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
13 #include "time-util.h"
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "connection.h"
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include <unistd.h>
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 static void connection_idle_timeout(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 conn->disconnect_reason = CONNECTION_DISCONNECT_IDLE_TIMEOUT;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 conn->list->v.destroy(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 static void connection_connect_timeout(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 conn->disconnect_reason = CONNECTION_DISCONNECT_CONNECT_TIMEOUT;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 conn->list->v.destroy(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 void connection_input_default(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 const char *line;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 struct istream *input;
18734
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
34 struct ostream *output;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 int ret = 0;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 switch (connection_input_read(conn)) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 case -1:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 return;
14914
373879abd7f4 connection API: Allow calling connection_input_default() for buffered input.
Timo Sirainen <tss@iki.fi>
parents: 14908
diff changeset
40 case 0: /* allow calling this function for buffered input */
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 case 1:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 break;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 default:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 i_unreached();
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 input = conn->input;
18734
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
48 output = conn->output;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 i_stream_ref(input);
18734
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
50 if (output != NULL) {
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
51 o_stream_ref(output);
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
52 o_stream_cork(output);
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
53 }
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 while (!input->closed && (line = i_stream_next_line(input)) != NULL) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 T_BEGIN {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 ret = conn->list->v.input_line(conn, line);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 } T_END;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 if (ret <= 0)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 break;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 }
18734
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
61 if (output != NULL) {
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
62 o_stream_uncork(output);
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
63 o_stream_unref(&output);
191eaf662c21 lib: Cork connection output while handling input
Timo Sirainen <tss@iki.fi>
parents: 18656
diff changeset
64 }
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 if (ret < 0 && !input->closed) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 conn->list->v.destroy(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 i_stream_unref(&input);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 int connection_verify_version(struct connection *conn,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 const char *const *args)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 unsigned int recv_major_version;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 /* VERSION <tab> service_name <tab> major version <tab> minor version */
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 if (str_array_length(args) != 4 ||
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 strcmp(args[0], "VERSION") != 0 ||
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 str_to_uint(args[2], &recv_major_version) < 0 ||
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 str_to_uint(args[3], &conn->minor_version) < 0) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 i_error("%s didn't reply with a valid VERSION line",
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 conn->name);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 if (strcmp(args[1], conn->list->set.service_name_in) != 0) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 i_error("%s: Connected to wrong socket type. "
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 "We want '%s', but received '%s'", conn->name,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 conn->list->set.service_name_in, args[1]);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 if (recv_major_version != conn->list->set.major_version) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 i_error("%s: Socket supports major version %u, "
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 "but we support only %u (mixed old and new binaries?)",
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 conn->name, recv_major_version,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 conn->list->set.major_version);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 return 0;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 int connection_input_line_default(struct connection *conn, const char *line)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 const char *const *args;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 args = t_strsplit_tabescaped(line);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 if (!conn->version_received) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (connection_verify_version(conn, args) < 0)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 conn->version_received = TRUE;
14734
dfe6f9a790bc Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 return 1;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 }
21160
66fad2161837 lib: Add connection.allow_empty_args_input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21118
diff changeset
115 if (args[0] == NULL && !conn->list->set.allow_empty_args_input) {
66fad2161837 lib: Add connection.allow_empty_args_input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21118
diff changeset
116 i_error("%s: Unexpectedly received empty line", conn->name);
66fad2161837 lib: Add connection.allow_empty_args_input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21118
diff changeset
117 return -1;
66fad2161837 lib: Add connection.allow_empty_args_input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21118
diff changeset
118 }
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 return conn->list->v.input_args(conn, args);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 static void connection_init_streams(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 const struct connection_settings *set = &conn->list->set;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
14787
64725ff9c297 redis: Fixed connection handling.
Timo Sirainen <tss@iki.fi>
parents: 14785
diff changeset
127 i_assert(conn->io == NULL);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 i_assert(conn->input == NULL);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 i_assert(conn->output == NULL);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 i_assert(conn->to == NULL);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 conn->version_received = set->major_version == 0;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 if (set->input_max_size != 0) {
22147
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
135 if (conn->unix_socket)
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
136 conn->input = i_stream_create_unix(conn->fd_in,
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
137 set->input_max_size);
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
138 else
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
139 conn->input = i_stream_create_fd(conn->fd_in,
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
140 set->input_max_size, FALSE);
15998
194ec0e10f3a connection: Give input/output streams a name.
Timo Sirainen <tss@iki.fi>
parents: 15997
diff changeset
141 i_stream_set_name(conn->input, conn->name);
18484
1b3224f0135f lib: Fixed crash in connection API if input streams aren't used (only input fd).
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
142 conn->io = io_add_istream(conn->input, *conn->list->v.input, conn);
1b3224f0135f lib: Fixed crash in connection API if input streams aren't used (only input fd).
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
143 } else {
1b3224f0135f lib: Fixed crash in connection API if input streams aren't used (only input fd).
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
144 conn->io = io_add(conn->fd_in, IO_READ, *conn->list->v.input, conn);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 if (set->output_max_size != 0) {
22147
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
147 if (conn->unix_socket)
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
148 conn->output = o_stream_create_unix(conn->fd_out,
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
149 set->output_max_size);
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
150 else
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
151 conn->output = o_stream_create_fd(conn->fd_out,
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
152 set->output_max_size, FALSE);
14750
6d626fcbde9e connection API: Don't do error handling by default on output stream.
Timo Sirainen <tss@iki.fi>
parents: 14734
diff changeset
153 o_stream_set_no_error_handling(conn->output, TRUE);
15998
194ec0e10f3a connection: Give input/output streams a name.
Timo Sirainen <tss@iki.fi>
parents: 15997
diff changeset
154 o_stream_set_name(conn->output, conn->name);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 if (set->input_idle_timeout_secs != 0) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 conn->to = timeout_add(set->input_idle_timeout_secs*1000,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 connection_idle_timeout, conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 }
14734
dfe6f9a790bc Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 if (set->major_version != 0 && !set->dont_send_version) {
dfe6f9a790bc Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 o_stream_nsend_str(conn->output, t_strdup_printf(
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 "VERSION\t%s\t%u\t%u\n", set->service_name_out,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 set->major_version, set->minor_version));
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 }
14908
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
165 }
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
166
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
167 static void connection_client_connected(struct connection *conn, bool success)
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
168 {
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
169 i_assert(conn->list->set.client);
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
170
20624
cf6b671fc3e8 lib: Added connection.connect_started/finished timestamps.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20618
diff changeset
171 conn->connect_finished = ioloop_timeval;
14908
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
172 if (success)
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
173 connection_init_streams(conn);
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
174 if (conn->list->v.client_connected != NULL)
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
175 conn->list->v.client_connected(conn, success);
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
176 if (!success) {
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
177 conn->disconnect_reason =
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
178 CONNECTION_DISCONNECT_CONN_CLOSED;
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
179 conn->list->v.destroy(conn);
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
180 }
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 void connection_init_server(struct connection_list *list,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 struct connection *conn, const char *name,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 int fd_in, int fd_out)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 i_assert(name != NULL);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 i_assert(!list->set.client);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 conn->list = list;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 conn->name = i_strdup(name);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 conn->fd_in = fd_in;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 conn->fd_out = fd_out;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 connection_init_streams(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 DLLIST_PREPEND(&list->connections, conn);
15234
acd76b5272e9 connection API: Track the number of connections.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
197 list->connections_count++;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 void connection_init_client_ip(struct connection_list *list,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 struct connection *conn,
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18990
diff changeset
202 const struct ip_addr *ip, in_port_t port)
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 i_assert(list->set.client);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 conn->fd_in = conn->fd_out = -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 conn->list = list;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 conn->name = i_strdup_printf("%s:%u", net_ip2addr(ip), port);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 conn->ip = *ip;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 conn->port = port;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 DLLIST_PREPEND(&list->connections, conn);
15234
acd76b5272e9 connection API: Track the number of connections.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
214 list->connections_count++;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 void connection_init_client_unix(struct connection_list *list,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 struct connection *conn, const char *path)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 i_assert(list->set.client);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 conn->fd_in = conn->fd_out = -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 conn->list = list;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 conn->name = i_strdup(path);
22147
edc9369f9d60 lib: Use unix streams with connection when using unix socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21503
diff changeset
225 conn->unix_socket = TRUE;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 DLLIST_PREPEND(&list->connections, conn);
15234
acd76b5272e9 connection API: Track the number of connections.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
228 list->connections_count++;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230
17246
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
231 void connection_init_from_streams(struct connection_list *list,
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
232 struct connection *conn, const char *name,
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
233 struct istream *input, struct ostream *output)
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
234 {
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
235 i_assert(name != NULL);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
236
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
237 conn->list = list;
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
238 conn->name = i_strdup(name);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
239 conn->fd_in = i_stream_get_fd(input);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
240 conn->fd_out = o_stream_get_fd(output);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
241
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
242 i_assert(conn->fd_in >= 0);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
243 i_assert(conn->fd_out >= 0);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
244 i_assert(conn->io == NULL);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
245 i_assert(conn->input == NULL);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
246 i_assert(conn->output == NULL);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
247 i_assert(conn->to == NULL);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
248
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
249 conn->input = input;
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
250 i_stream_ref(conn->input);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
251 i_stream_set_name(conn->input, conn->name);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
252
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
253 conn->output = output;
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
254 o_stream_ref(conn->output);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
255 o_stream_set_no_error_handling(conn->output, TRUE);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
256 o_stream_set_name(conn->output, conn->name);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
257
18095
7ef360d3fb09 lib: connection: Now uses io_add_istream() instead of io_add().
Stephan Bosch <stephan@rename-it.nl>
parents: 18042
diff changeset
258 conn->io = io_add_istream(conn->input, *list->v.input, conn);
17246
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
259
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
260 DLLIST_PREPEND(&list->connections, conn);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
261 list->connections_count++;
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
262
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
263 if (list->v.client_connected != NULL)
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
264 list->v.client_connected(conn, TRUE);
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
265 }
54178ae78835 connection: Added support for creating a stream from input/output stream pair.
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
266
18493
092a51d80bad lib: connection: Connect to unix socket asynchronously if connected callback is set.
Stephan Bosch <stephan@rename-it.nl>
parents: 18484
diff changeset
267 static void connection_socket_connected(struct connection *conn)
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 io_remove(&conn->io);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 if (conn->to != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 timeout_remove(&conn->to);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272
14908
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
273 errno = net_geterror(conn->fd_in);
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
274 connection_client_connected(conn, errno == 0);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 int connection_client_connect(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 const struct connection_settings *set = &conn->list->set;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 int fd;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 i_assert(conn->list->set.client);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 i_assert(conn->fd_in == -1);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 if (conn->port != 0)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 fd = net_connect_ip(&conn->ip, conn->port, NULL);
18869
697c6f04baca lib: Added unix_client_connect_msecs setting to connection API.
Timo Sirainen <tss@iki.fi>
parents: 18734
diff changeset
287 else if (conn->list->set.unix_client_connect_msecs == 0)
697c6f04baca lib: Added unix_client_connect_msecs setting to connection API.
Timo Sirainen <tss@iki.fi>
parents: 18734
diff changeset
288 fd = net_connect_unix(conn->name);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 else
18869
697c6f04baca lib: Added unix_client_connect_msecs setting to connection API.
Timo Sirainen <tss@iki.fi>
parents: 18734
diff changeset
290 fd = net_connect_unix_with_retries(conn->name, conn->list->set.unix_client_connect_msecs);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 if (fd == -1)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 conn->fd_in = conn->fd_out = fd;
20624
cf6b671fc3e8 lib: Added connection.connect_started/finished timestamps.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20618
diff changeset
294 conn->connect_started = ioloop_timeval;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
18656
6f167f2e550d lib: connection API: Added delayed_unix_client_connected_callback setting.
Timo Sirainen <tss@iki.fi>
parents: 18651
diff changeset
296 if (conn->port != 0 ||
6f167f2e550d lib: connection API: Added delayed_unix_client_connected_callback setting.
Timo Sirainen <tss@iki.fi>
parents: 18651
diff changeset
297 conn->list->set.delayed_unix_client_connected_callback) {
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 conn->io = io_add(conn->fd_out, IO_WRITE,
18493
092a51d80bad lib: connection: Connect to unix socket asynchronously if connected callback is set.
Stephan Bosch <stephan@rename-it.nl>
parents: 18484
diff changeset
299 connection_socket_connected, conn);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 if (set->client_connect_timeout_msecs != 0) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 conn->to = timeout_add(set->client_connect_timeout_msecs,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 connection_connect_timeout, conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 } else {
14908
deb47efdc006 connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents: 14901
diff changeset
305 connection_client_connected(conn, TRUE);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 return 0;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 void connection_disconnect(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 {
20617
1aed896c25c1 lib: connection_disconnect() now resets last_input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20144
diff changeset
312 conn->last_input = 0;
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21160
diff changeset
313 i_zero(&conn->last_input_tv);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 if (conn->to != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 timeout_remove(&conn->to);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 if (conn->io != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 io_remove(&conn->io);
16221
cb2e3676547d connection_disconnect(): Explicitly close input/output stream.
Timo Sirainen <tss@iki.fi>
parents: 15998
diff changeset
318 if (conn->input != NULL) {
cb2e3676547d connection_disconnect(): Explicitly close input/output stream.
Timo Sirainen <tss@iki.fi>
parents: 15998
diff changeset
319 i_stream_close(conn->input);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 i_stream_destroy(&conn->input);
16221
cb2e3676547d connection_disconnect(): Explicitly close input/output stream.
Timo Sirainen <tss@iki.fi>
parents: 15998
diff changeset
321 }
cb2e3676547d connection_disconnect(): Explicitly close input/output stream.
Timo Sirainen <tss@iki.fi>
parents: 15998
diff changeset
322 if (conn->output != NULL) {
cb2e3676547d connection_disconnect(): Explicitly close input/output stream.
Timo Sirainen <tss@iki.fi>
parents: 15998
diff changeset
323 o_stream_close(conn->output);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 o_stream_destroy(&conn->output);
16221
cb2e3676547d connection_disconnect(): Explicitly close input/output stream.
Timo Sirainen <tss@iki.fi>
parents: 15998
diff changeset
325 }
21118
ac02caa662f2 global: Use fd_close_maybe_stdio()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20625
diff changeset
326 fd_close_maybe_stdio(&conn->fd_in, &conn->fd_out);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 void connection_deinit(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 {
15234
acd76b5272e9 connection API: Track the number of connections.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
331 i_assert(conn->list->connections_count > 0);
acd76b5272e9 connection API: Track the number of connections.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
332
acd76b5272e9 connection API: Track the number of connections.
Timo Sirainen <tss@iki.fi>
parents: 15187
diff changeset
333 conn->list->connections_count--;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 DLLIST_REMOVE(&conn->list->connections, conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 connection_disconnect(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 i_free(conn->name);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 int connection_input_read(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 conn->last_input = ioloop_time;
20618
199918a54c38 lib: Added connection.last_input_tv for more accuracy
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20617
diff changeset
343 conn->last_input_tv = ioloop_timeval;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 if (conn->to != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 timeout_reset(conn->to);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 switch (i_stream_read(conn->input)) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 case -2:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 /* buffer full */
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 switch (conn->list->set.input_full_behavior) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 case CONNECTION_BEHAVIOR_DESTROY:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 conn->disconnect_reason =
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 CONNECTION_DISCONNECT_BUFFER_FULL;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 conn->list->v.destroy(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 case CONNECTION_BEHAVIOR_ALLOW:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 return -2;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
17476
4a396f0c3b79 Added various asserts to try to silence Coverity false positives.
Timo Sirainen <tss@iki.fi>
parents: 17246
diff changeset
359 i_unreached();
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 case -1:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 /* disconnected */
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 conn->disconnect_reason =
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 CONNECTION_DISCONNECT_CONN_CLOSED;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 conn->list->v.destroy(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 return -1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 case 0:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 /* nothing new read */
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 return 0;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 default:
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 /* something was read */
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 return 1;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 const char *connection_disconnect_reason(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 {
20144
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
377 switch (conn->disconnect_reason) {
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
378 case CONNECTION_DISCONNECT_DEINIT:
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
379 return "Deinitializing";
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
380 case CONNECTION_DISCONNECT_CONNECT_TIMEOUT: {
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
381 unsigned int msecs =
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
382 conn->list->set.client_connect_timeout_msecs;
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
383 return t_strdup_printf("connect() timed out in %u.%03u secs",
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
384 msecs/1000, msecs%1000);
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
385 }
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
386 case CONNECTION_DISCONNECT_IDLE_TIMEOUT:
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
387 return "Idle timeout";
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
388 case CONNECTION_DISCONNECT_CONN_CLOSED:
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
389 if (conn->input == NULL)
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
390 return t_strdup_printf("connect() failed: %m");
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
391 /* fall through */
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
392 case CONNECTION_DISCONNECT_NOT:
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
393 case CONNECTION_DISCONNECT_BUFFER_FULL:
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
394 return io_stream_get_disconnect_reason(conn->input, conn->output);
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
395 }
c05f8f15cc2c lib: Improved connection_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
396 i_unreached();
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
20625
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
399 const char *connection_input_timeout_reason(struct connection *conn)
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
400 {
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
401 if (conn->last_input_tv.tv_sec != 0) {
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
402 int diff = timeval_diff_msecs(&ioloop_timeval, &conn->last_input_tv);
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
403 return t_strdup_printf("No input for %u.%03u secs",
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
404 diff/1000, diff%1000);
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
405 } else if (conn->connect_finished.tv_sec != 0) {
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
406 int diff = timeval_diff_msecs(&ioloop_timeval, &conn->connect_finished);
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
407 return t_strdup_printf(
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
408 "No input since connected %u.%03u secs ago",
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
409 diff/1000, diff%1000);
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
410 } else {
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
411 int diff = timeval_diff_msecs(&ioloop_timeval, &conn->connect_started);
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
412 return t_strdup_printf("connect() timed out after %u.%03u secs",
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
413 diff/1000, diff%1000);
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
414 }
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
415 }
3faece727565 lib: Added connection_input_timeout_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20624
diff changeset
416
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 void connection_switch_ioloop(struct connection *conn)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 if (conn->io != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 conn->io = io_loop_move_io(&conn->io);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 if (conn->to != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 conn->to = io_loop_move_timeout(&conn->to);
18042
f21d7614ac0d lib: connection_switch_ioloop() should switch also input stream's ioloop.
Timo Sirainen <tss@iki.fi>
parents: 17476
diff changeset
423 if (conn->input != NULL)
f21d7614ac0d lib: connection_switch_ioloop() should switch also input stream's ioloop.
Timo Sirainen <tss@iki.fi>
parents: 17476
diff changeset
424 i_stream_switch_ioloop(conn->input);
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 if (conn->output != NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 o_stream_switch_ioloop(conn->output);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 struct connection_list *
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 connection_list_init(const struct connection_settings *set,
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 const struct connection_vfuncs *vfuncs)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 struct connection_list *list;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 i_assert(vfuncs->input != NULL ||
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 set->input_full_behavior != CONNECTION_BEHAVIOR_ALLOW);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 i_assert(set->major_version == 0 ||
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 (set->service_name_in != NULL &&
21503
8aa60021b469 lib: Check that output max size is non-zero when version specified
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
439 set->service_name_out != NULL &&
8aa60021b469 lib: Check that output max size is non-zero when version specified
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
440 set->output_max_size != 0));
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 list = i_new(struct connection_list, 1);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 list->set = *set;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 list->v = *vfuncs;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 if (list->v.input == NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 list->v.input = connection_input_default;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 if (list->v.input_line == NULL)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 list->v.input_line = connection_input_line_default;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 return list;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 void connection_list_deinit(struct connection_list **_list)
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 struct connection_list *list = *_list;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 struct connection *conn;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 *_list = NULL;
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 while (list->connections != NULL) {
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 conn = list->connections;
15997
310c5ce38ef3 connection_list_deinit(): Set disconnect_reason correctly to CONNECTION_DISCONNECT_DEINIT
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
463 conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
14785
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 list->v.destroy(conn);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 i_assert(conn != list->connections);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 }
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 i_free(list);
43b841891c77 Added "connection" API for handling client/server connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 }