Mercurial > dovecot > core-2.2
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 |
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 } |