annotate src/doveadm/server-connection.c @ 22614:cf66220d281e

doveadm proxy: Don't crash if remote doesn't support log proxying
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sat, 14 Oct 2017 12:54:18 +0300
parents a3632f4d817f
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) 2010-2017 Dovecot authors, see the included COPYING file */
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
5 #include "base64.h"
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "ioloop.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
7 #include "net.h"
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "istream.h"
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
9 #include "istream-multiplex.h"
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "ostream.h"
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
11 #include "ostream-dot.h"
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "str.h"
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "strescape.h"
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
14 #include "iostream-ssl.h"
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
15 #include "master-service.h"
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
16 #include "master-service-settings.h"
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
17 #include "settings-parser.h"
21784
b7f788e99e86 doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
18 #include "doveadm.h"
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "doveadm-print.h"
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include "doveadm-util.h"
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include "doveadm-server.h"
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
22 #include "doveadm-settings.h"
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #include "server-connection.h"
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
16505
63092465c522 doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents: 16161
diff changeset
25 #include <sysexits.h>
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #include <unistd.h>
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
28 #define DOVEADM_LOG_CHANNEL_ID 'L'
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
29
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 #define MAX_INBUF_SIZE (1024*32)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 enum server_reply_state {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 SERVER_REPLY_STATE_DONE = 0,
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 SERVER_REPLY_STATE_PRINT,
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 SERVER_REPLY_STATE_RET
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 };
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 struct server_connection {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 struct doveadm_server *server;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
41 pool_t pool;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
42 struct doveadm_settings *set;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
43
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 int fd;
22555
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
45 unsigned int minor;
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
46
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct io *io;
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
48 struct io *io_log;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct istream *input;
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
50 struct istream *log_input;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 struct ostream *output;
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
52 struct ssl_iostream *ssl_iostream;
20611
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
53 struct timeout *to_input;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
55 struct istream *cmd_input;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
56 struct ostream *cmd_output;
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
57 const char *delayed_cmd;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 server_cmd_callback_t *callback;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 void *context;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 enum server_reply_state state;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 unsigned int handshaked:1;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 unsigned int authenticated:1;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 unsigned int streaming:1;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 };
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 static struct server_connection *printing_conn = NULL;
20612
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
69 static ARRAY(struct doveadm_server *) print_pending_servers = ARRAY_INIT;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 static void server_connection_input(struct server_connection *conn);
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
72 static bool server_connection_input_one(struct server_connection *conn);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
20612
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
74 static void server_set_print_pending(struct doveadm_server *server)
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 {
20612
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
76 struct doveadm_server *const *serverp;
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
77
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
78 if (!array_is_created(&print_pending_servers))
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
79 i_array_init(&print_pending_servers, 16);
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
80 array_foreach(&print_pending_servers, serverp) {
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
81 if (*serverp == server)
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
82 return;
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
83 }
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
84 array_append(&print_pending_servers, &server, 1);
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
85 }
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
86
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
87 static void server_print_connection_released(struct doveadm_server *server)
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
88 {
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 struct server_connection *const *conns;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 unsigned int i, count;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 conns = array_get(&server->connections, &count);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 for (i = 0; i < count; i++) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 if (conns[i]->io != NULL)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 continue;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 conns[i]->io = io_add(conns[i]->fd, IO_READ,
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 server_connection_input, conns[i]);
20611
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
99 conns[i]->to_input = timeout_add_short(0,
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
100 server_connection_input, conns[i]);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
20612
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
104 static void print_connection_released(void)
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
105 {
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
106 struct doveadm_server *const *serverp;
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
107
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
108 printing_conn = NULL;
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
109 if (!array_is_created(&print_pending_servers))
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
110 return;
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
111
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
112 array_foreach(&print_pending_servers, serverp)
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
113 server_print_connection_released(*serverp);
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
114 array_free(&print_pending_servers);
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
115 }
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
116
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
117 static int server_connection_send_cmd_input_more(struct server_connection *conn)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
118 {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
119 off_t ret;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
120
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
121 /* ostream-dot writes only up to max buffer size, so keep it non-zero */
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
122 o_stream_set_max_buffer_size(conn->cmd_output, IO_BLOCK_SIZE);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
123 ret = o_stream_send_istream(conn->cmd_output, conn->cmd_input);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
124 o_stream_set_max_buffer_size(conn->cmd_output, (size_t)-1);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
125
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
126 if (ret >= 0 && i_stream_have_bytes_left(conn->cmd_input)) {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
127 o_stream_set_flush_pending(conn->cmd_output, TRUE);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
128 return 0;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
129 }
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
130 if (conn->cmd_input->stream_errno != 0) {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
131 i_error("read(%s) failed: %s",
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
132 i_stream_get_name(conn->cmd_input),
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
133 i_stream_get_error(conn->cmd_input));
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
134 } else if (conn->cmd_output->stream_errno != 0 ||
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
135 o_stream_flush(conn->cmd_output) < 0) {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
136 i_error("write(%s) failed: %s",
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
137 o_stream_get_name(conn->cmd_output),
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
138 o_stream_get_error(conn->cmd_output));
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
139 }
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
140
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
141 i_stream_destroy(&conn->cmd_input);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
142 o_stream_destroy(&conn->cmd_output);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
143 return ret < 0 ? -1 : 1;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
144 }
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
145
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
146 static void server_connection_send_cmd_input(struct server_connection *conn)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
147 {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
148 if (conn->cmd_input == NULL)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
149 return;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
150
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
151 conn->cmd_output = o_stream_create_dot(conn->output, TRUE);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
152 (void)server_connection_send_cmd_input_more(conn);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
153 }
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
154
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
155 static int server_connection_output(struct server_connection *conn)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
156 {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
157 int ret;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
158
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
159 o_stream_cork(conn->output);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
160 ret = o_stream_flush(conn->output);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
161 if (ret > 0 && conn->cmd_input != NULL && conn->delayed_cmd == NULL)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
162 ret = server_connection_send_cmd_input_more(conn);
18616
e702b7a745e0 doveadm-server: Fixed potential crash if doveadm client disconnected
Timo Sirainen <tss@iki.fi>
parents: 18254
diff changeset
163 o_stream_uncork(conn->output);
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
164 if (ret < 0)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
165 server_connection_destroy(&conn);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
166 return ret;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
167 }
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
168
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 static void
16667
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
170 server_connection_callback(struct server_connection *conn,
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
171 int exit_code, const char *error)
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 server_cmd_callback_t *callback = conn->callback;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 conn->callback = NULL;
16667
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
176 callback(exit_code, error, conn->context);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 static void stream_data(string_t *str, const unsigned char *data, size_t size)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 str_truncate(str, 0);
20599
ad69150c10f9 doveadm: Streamline tabunescape
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
182 str_append_tabunescaped(str, data, size);
ad69150c10f9 doveadm: Streamline tabunescape
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
183 doveadm_print_stream(str->data, str->used);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 static void server_flush_field(struct server_connection *conn, string_t *str,
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 const unsigned char *data, size_t size)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 if (conn->streaming) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 conn->streaming = FALSE;
15289
94c7e875f9b9 doveadm: Fixed printing large input from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 14299
diff changeset
191 if (size > 0)
94c7e875f9b9 doveadm: Fixed printing large input from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 14299
diff changeset
192 stream_data(str, data, size);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 doveadm_print_stream("", 0);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 } else {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 str_truncate(str, 0);
20599
ad69150c10f9 doveadm: Streamline tabunescape
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
196 str_append_tabunescaped(str, data, size);
20609
241194ca9c82 doveadm: Revert earlier NUL-printing change 793b024bf.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20603
diff changeset
197 doveadm_print(str_c(str));
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 static void
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 server_handle_input(struct server_connection *conn,
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 const unsigned char *data, size_t size)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 string_t *str;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 size_t i, start;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 if (printing_conn == conn) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 /* continue printing */
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 } else if (printing_conn == NULL) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 printing_conn = conn;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 } else {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 /* someone else is printing. don't continue until it
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 goes away */
20612
e8a85457b96d doveadm: Fixed hanging when printing output from different server connections.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20611
diff changeset
215 server_set_print_pending(conn->server);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 io_remove(&conn->io);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 return;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 if (data[size-1] == '\001') {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 /* last character is an escape */
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 size--;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 str = t_str_new(128);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 for (i = start = 0; i < size; i++) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 if (data[i] == '\n') {
15923
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
228 if (i != start) {
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
229 i_error("doveadm server sent broken print input");
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
230 server_connection_destroy(&conn);
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
231 return;
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
232 }
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 conn->state = SERVER_REPLY_STATE_RET;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 i_stream_skip(conn->input, i + 1);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 print_connection_released();
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 return;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 if (data[i] == '\t') {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 server_flush_field(conn, str, data + start, i - start);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 start = i + 1;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 if (start != size) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 conn->streaming = TRUE;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 stream_data(str, data + start, size - start);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 i_stream_skip(conn->input, size);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
13528
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
251 static void server_connection_authenticated(struct server_connection *conn)
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
252 {
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
253 conn->authenticated = TRUE;
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
254 if (conn->delayed_cmd != NULL) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14299
diff changeset
255 o_stream_nsend_str(conn->output, conn->delayed_cmd);
13528
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
256 conn->delayed_cmd = NULL;
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
257 server_connection_send_cmd_input(conn);
13528
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
258 }
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
259 }
1d8009c7b67e doveadm: Fixed sending commands to doveadm server when it didn't require authentication.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
260
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
261 static int
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
262 server_connection_authenticate(struct server_connection *conn)
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 {
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
264 string_t *plain = t_str_new(128);
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
265 string_t *cmd = t_str_new(128);
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
266
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
267 if (*conn->set->doveadm_password == '\0') {
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
268 i_error("doveadm_password not set, "
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
269 "can't authenticate to remote server");
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
270 return -1;
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
271 }
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
272
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
273 str_append_c(plain, '\0');
18897
3bf5df6f63b2 doveadm: Added doveadm_username to specify the username for authentication.
Timo Sirainen <tss@iki.fi>
parents: 18616
diff changeset
274 str_append(plain, conn->set->doveadm_username);
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
275 str_append_c(plain, '\0');
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
276 str_append(plain, conn->set->doveadm_password);
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
277
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
278 str_append(cmd, "PLAIN\t");
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
279 base64_encode(plain->data, plain->used, cmd);
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
280 str_append_c(cmd, '\n');
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
281
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14299
diff changeset
282 o_stream_nsend(conn->output, cmd->data, cmd->used);
13036
6604f80abb02 doveadm: Added simple PLAIN authentication for remote connections.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
283 return 0;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285
16674
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
286 static void server_log_disconnect_error(struct server_connection *conn)
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
287 {
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
288 const char *error;
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
289
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
290 error = conn->ssl_iostream == NULL ? NULL :
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
291 ssl_iostream_get_last_error(conn->ssl_iostream);
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
292 if (error == NULL) {
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
293 error = conn->input->stream_errno == 0 ? "EOF" :
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
294 strerror(conn->input->stream_errno);
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
295 }
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
296 i_error("doveadm server disconnected before handshake: %s", error);
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
297 }
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
298
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
299 static void server_connection_print_log(struct server_connection *conn)
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
300 {
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
301 const char *line;
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
302 struct failure_context ctx;
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
303 i_zero(&ctx);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
304
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
305 while((line = i_stream_read_next_line(conn->log_input))!=NULL) {
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
306 /* skip empty lines */
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
307 if (*line == '\0') continue;
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
308
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
309 if (!doveadm_log_type_from_char(line[0], &ctx.type))
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
310 i_warning("Doveadm server sent invalid log type 0x%02x",
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
311 line[0]);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
312 line++;
22587
36f70fbf6d2f doveadm: Add remote(host) prefix to all proxied logs
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22556
diff changeset
313 i_log_type(&ctx, "remote(%s): %s", conn->server->name, line);
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
314 }
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
315 }
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
316
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
317 static void server_connection_start_multiplex(struct server_connection *conn)
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
318 {
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
319 struct istream *is = conn->input;
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
320 conn->input = i_stream_create_multiplex(is, MAX_INBUF_SIZE);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
321 i_stream_unref(&is);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
322 io_remove(&conn->io);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
323 conn->io = io_add_istream(conn->input, server_connection_input, conn);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
324 conn->log_input = i_stream_multiplex_add_channel(conn->input, DOVEADM_LOG_CHANNEL_ID);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
325 conn->io_log = io_add_istream(conn->log_input, server_connection_print_log, conn);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
326 i_stream_set_return_partial_line(conn->log_input, TRUE);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
327 }
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
328
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 static void server_connection_input(struct server_connection *conn)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 const char *line;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332
20611
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
333 if (conn->to_input != NULL)
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
334 timeout_remove(&conn->to_input);
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
335
22554
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
336 if (!conn->handshaked || !conn->authenticated) {
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
337 while((line = i_stream_read_next_line(conn->input)) != NULL) {
22555
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
338 if (strncmp(line, "VERSION\t", 8) == 0) {
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
339 if (!version_string_verify_full(line, "doveadm-client",
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
340 DOVEADM_SERVER_PROTOCOL_VERSION_MAJOR,
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
341 &conn->minor)) {
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
342 i_error("doveadm server not compatible with this client"
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
343 "(mixed old and new binaries?)");
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
344 server_connection_destroy(&conn);
22595
a3632f4d817f doveadm: Return after destroying connection
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22587
diff changeset
345 return;
22555
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
346 }
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
347 continue;
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
348 }
22554
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
349 if (strcmp(line, "+") == 0) {
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
350 if (conn->minor > 0)
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
351 server_connection_start_multiplex(conn);
22554
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
352 server_connection_authenticated(conn);
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
353 break;
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
354 } else if (strcmp(line, "-") == 0) {
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
355 if (!conn->handshaked &&
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
356 server_connection_authenticate(conn) < 0) {
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
357 server_connection_destroy(&conn);
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
358 return;
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
359 } else if (conn->handshaked) {
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
360 i_error("doveadm authentication failed (%s)",
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
361 line+1);
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
362 server_connection_destroy(&conn);
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
363 return;
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
364 }
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
365 } else {
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
366 i_error("doveadm server sent invalid handshake: %s",
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
367 line);
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
368 server_connection_destroy(&conn);
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
369 return;
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
370 }
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
371 conn->handshaked = TRUE;
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
372 }
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
373
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
374 if (line == NULL) {
16674
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
375 if (conn->input->eof || conn->input->stream_errno != 0) {
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
376 server_log_disconnect_error(conn);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 server_connection_destroy(&conn);
16674
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
378 }
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 }
22554
8c27d8d766bd doveadm-server: Refactor connection handshake and authentication
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21784
diff changeset
380 return;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382
15641
19403b3926f9 Several fixes to handling "istream input line too long" conditions.
Timo Sirainen <tss@iki.fi>
parents: 15578
diff changeset
383 if (i_stream_read(conn->input) < 0) {
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 /* disconnected */
16674
c5c3eba6ae14 doveadm: If server connection gets disconnected, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16667
diff changeset
385 server_log_disconnect_error(conn);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 server_connection_destroy(&conn);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 return;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
390 while (server_connection_input_one(conn)) ;
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
391 }
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
392
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
393 static bool server_connection_input_one(struct server_connection *conn)
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
394 {
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
395 const unsigned char *data;
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
396 size_t size;
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
397 const char *line;
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
398 int exit_code;
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
399
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
400 data = i_stream_get_data(conn->input, &size);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
401 if (size == 0)
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
402 return FALSE;
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
403
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
404 /* check logs */
22614
cf66220d281e doveadm proxy: Don't crash if remote doesn't support log proxying
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22595
diff changeset
405 if (conn->log_input != NULL)
cf66220d281e doveadm proxy: Don't crash if remote doesn't support log proxying
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22595
diff changeset
406 (void)server_connection_print_log(conn);
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
407
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 switch (conn->state) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 case SERVER_REPLY_STATE_DONE:
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 i_error("doveadm server sent unexpected input");
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 server_connection_destroy(&conn);
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
412 return FALSE;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 case SERVER_REPLY_STATE_PRINT:
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 server_handle_input(conn, data, size);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 if (conn->state != SERVER_REPLY_STATE_RET)
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
416 return FALSE;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 /* fall through */
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 case SERVER_REPLY_STATE_RET:
14299
9d47d53650be doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
419 line = i_stream_next_line(conn->input);
9d47d53650be doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
420 if (line == NULL)
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
421 return FALSE;
14299
9d47d53650be doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
422 if (line[0] == '+')
16667
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
423 server_connection_callback(conn, 0, "");
14299
9d47d53650be doveadm: Handle -NOUSER replies from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
424 else if (line[0] == '-') {
16505
63092465c522 doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents: 16161
diff changeset
425 line++;
21784
b7f788e99e86 doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
426 exit_code = doveadm_str_to_exit_code(line);
b7f788e99e86 doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
427 if (exit_code == DOVEADM_EX_UNKNOWN &&
b7f788e99e86 doveadm: Send and receive exit codes correctly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
428 str_to_int(line, &exit_code) < 0) {
16505
63092465c522 doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents: 16161
diff changeset
429 /* old doveadm-server */
63092465c522 doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents: 16161
diff changeset
430 exit_code = EX_TEMPFAIL;
63092465c522 doveadm: Pass through the exit code from doveadm-server to client.
Timo Sirainen <tss@iki.fi>
parents: 16161
diff changeset
431 }
16667
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
432 server_connection_callback(conn, exit_code, line);
15923
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
433 } else {
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
434 i_error("doveadm server sent broken input "
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
435 "(expected cmd reply): %s", line);
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
436 server_connection_destroy(&conn);
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
437 return FALSE;
15923
8e54e73bdade doveadm: If doveadm-server sends broken input, disconnect.
Timo Sirainen <tss@iki.fi>
parents: 15922
diff changeset
438 }
15520
275a57b8dc70 doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents: 15289
diff changeset
439 if (conn->callback == NULL) {
275a57b8dc70 doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents: 15289
diff changeset
440 /* we're finished, close the connection */
275a57b8dc70 doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents: 15289
diff changeset
441 server_connection_destroy(&conn);
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
442 return FALSE;
15520
275a57b8dc70 doveadm: Don't disconnect from server too early while there are still commands.
Timo Sirainen <tss@iki.fi>
parents: 15289
diff changeset
443 }
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
444 return TRUE;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
20610
faa75dd3298b doveadm-server: Fixed potential hang when reading replies to multiple commands
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20609
diff changeset
446 i_unreached();
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
449 static int server_connection_read_settings(struct server_connection *conn)
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
450 {
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
451 const struct setting_parser_info *set_roots[] = {
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
452 &doveadm_setting_parser_info,
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
453 NULL
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
454 };
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
455 struct master_service_settings_input input;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
456 struct master_service_settings_output output;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
457 const char *error;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18897
diff changeset
458 in_port_t port;
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
459 void *set;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
460
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: 20612
diff changeset
461 i_zero(&input);
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
462 input.roots = set_roots;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
463 input.service = "doveadm";
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
464
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
465 (void)net_getsockname(conn->fd, &input.local_ip, &port);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
466 (void)net_getpeername(conn->fd, &input.remote_ip, &port);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
467
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
468 if (master_service_settings_read(master_service, &input,
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
469 &output, &error) < 0) {
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
470 i_error("Error reading configuration: %s", error);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
471 return -1;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
472 }
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
473 set = master_service_settings_get_others(master_service)[0];
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
474 conn->set = settings_dup(&doveadm_setting_parser_info, set, conn->pool);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
475 return 0;
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
476 }
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
477
16154
970914436288 lib-ssl-iostream: ssl_iostream_set_handshake_callback() API changed.
Timo Sirainen <tss@iki.fi>
parents: 16145
diff changeset
478 static int server_connection_ssl_handshaked(const char **error_r, void *context)
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
479 {
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
480 struct server_connection *conn = context;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
481 const char *host, *p;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
482
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
483 host = conn->server->name;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
484 p = strrchr(host, ':');
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
485 if (p != NULL)
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
486 host = t_strdup_until(host, p);
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
487
16161
ef939a32de27 lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents: 16159
diff changeset
488 if (ssl_iostream_check_cert_validity(conn->ssl_iostream, host, error_r) < 0)
16156
4e9851e24c28 lib-ssl-iostream: If handshake callback fails, close the iostreams immediately.
Timo Sirainen <tss@iki.fi>
parents: 16154
diff changeset
489 return -1;
16161
ef939a32de27 lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents: 16159
diff changeset
490 if (doveadm_debug)
ef939a32de27 lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents: 16159
diff changeset
491 i_debug("%s: SSL handshake successful", conn->server->name);
ef939a32de27 lib-ssl-iostream: Simplified certificate validation. Also give better error messages.
Timo Sirainen <tss@iki.fi>
parents: 16159
diff changeset
492 return 0;
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
493 }
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
494
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
495 static int server_connection_init_ssl(struct server_connection *conn)
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
496 {
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
497 struct ssl_iostream_settings ssl_set;
16145
02f6b66458b1 lib-ssl-iostream: API changes to return error strings if init() functions fail.
Timo Sirainen <tss@iki.fi>
parents: 15934
diff changeset
498 const char *error;
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
499
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
500 if (conn->server->ssl_ctx == NULL)
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
501 return 0;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
502
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: 20612
diff changeset
503 i_zero(&ssl_set);
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
504 ssl_set.verify_remote_cert = TRUE;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
505 ssl_set.require_valid_cert = TRUE;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
506 ssl_set.verbose_invalid_cert = TRUE;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
507
16159
f4bac0352464 lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents: 16156
diff changeset
508 if (io_stream_create_ssl_client(conn->server->ssl_ctx,
f4bac0352464 lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents: 16156
diff changeset
509 conn->server->name, &ssl_set,
f4bac0352464 lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents: 16156
diff changeset
510 &conn->input, &conn->output,
f4bac0352464 lib-ssl-iostream: Added support for TLS SNI, which caused some API changes.
Timo Sirainen <tss@iki.fi>
parents: 16156
diff changeset
511 &conn->ssl_iostream, &error) < 0) {
16145
02f6b66458b1 lib-ssl-iostream: API changes to return error strings if init() functions fail.
Timo Sirainen <tss@iki.fi>
parents: 15934
diff changeset
512 i_error("Couldn't initialize SSL client: %s", error);
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
513 return -1;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
514 }
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
515 ssl_iostream_set_handshake_callback(conn->ssl_iostream,
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
516 server_connection_ssl_handshaked,
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
517 conn);
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
518 if (ssl_iostream_handshake(conn->ssl_iostream) < 0) {
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
519 i_error("SSL handshake failed: %s",
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
520 ssl_iostream_get_last_error(conn->ssl_iostream));
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
521 return -1;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
522 }
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
523 return 0;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
524 }
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
525
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
526 int server_connection_create(struct doveadm_server *server,
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
527 struct server_connection **conn_r)
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 struct server_connection *conn;
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
530 pool_t pool;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
532 pool = pool_alloconly_create("doveadm server connection", 1024*16);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
533 conn = p_new(pool, struct server_connection, 1);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
534 conn->pool = pool;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 conn->server = server;
15922
b2bc9dd5f8d9 doveadm: When connecting to doveadm socket without :port, use doveadm_port setting.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
536 conn->fd = doveadm_connect_with_default_port(server->name,
b2bc9dd5f8d9 doveadm: When connecting to doveadm socket without :port, use doveadm_port setting.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
537 doveadm_settings->doveadm_port);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 net_set_nonblock(conn->fd, TRUE);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 conn->io = io_add(conn->fd, IO_READ, server_connection_input, conn);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 conn->input = i_stream_create_fd(conn->fd, MAX_INBUF_SIZE, FALSE);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
542 o_stream_set_flush_callback(conn->output, server_connection_output, conn);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
543
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
544 i_stream_set_name(conn->input, server->name);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
545 o_stream_set_name(conn->output, server->name);
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
546
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
547 array_append(&conn->server->connections, &conn, 1);
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
548
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
549 if (server_connection_read_settings(conn) < 0 ||
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
550 server_connection_init_ssl(conn) < 0) {
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
551 server_connection_destroy(&conn);
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
552 return -1;
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
553 }
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
554
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14299
diff changeset
555 o_stream_set_no_error_handling(conn->output, TRUE);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 conn->state = SERVER_REPLY_STATE_DONE;
22555
e05ab5f8a8bc doveadm: Refactor server/client code to support versioning properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22554
diff changeset
557 o_stream_nsend_str(conn->output, DOVEADM_SERVER_PROTOCOL_VERSION_LINE"\n");
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
559 *conn_r = conn;
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14681
diff changeset
560 return 0;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 void server_connection_destroy(struct server_connection **_conn)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 struct server_connection *conn = *_conn;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 struct server_connection *const *conns;
16667
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
567 const char *error;
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 unsigned int i, count;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 *_conn = NULL;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 conns = array_get(&conn->server->connections, &count);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573 for (i = 0; i < count; i++) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 if (conns[i] == conn) {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 array_delete(&conn->server->connections, i, 1);
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 break;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579
16667
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
580 if (conn->callback != NULL) {
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
581 error = conn->ssl_iostream == NULL ? NULL :
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
582 ssl_iostream_get_last_error(conn->ssl_iostream);
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
583 if (error == NULL) {
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
584 error = conn->input->stream_errno == 0 ? "EOF" :
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
585 strerror(conn->input->stream_errno);
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
586 }
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
587 server_connection_callback(conn, SERVER_EXIT_CODE_DISCONNECTED,
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
588 error);
07557a9c59b1 doveadm: If we get disconnected from server, log the reason.
Timo Sirainen <tss@iki.fi>
parents: 16505
diff changeset
589 }
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 if (printing_conn == conn)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 print_connection_released();
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592
20611
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
593 if (conn->to_input != NULL)
be966bc4b758 doveadm: Avoid recursively calling server input callback
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20610
diff changeset
594 timeout_remove(&conn->to_input);
15929
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
595 if (conn->input != NULL)
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
596 i_stream_destroy(&conn->input);
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
597 if (conn->output != NULL)
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
598 o_stream_destroy(&conn->output);
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
599 if (conn->cmd_input != NULL)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
600 i_stream_destroy(&conn->cmd_input);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
601 /* close cmd_output after its parent, so the "." isn't sent */
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
602 if (conn->cmd_output != NULL)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
603 o_stream_destroy(&conn->cmd_output);
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
604 if (conn->ssl_iostream != NULL)
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
605 ssl_iostream_unref(&conn->ssl_iostream);
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
606 if (conn->io_log != NULL)
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
607 io_remove(&conn->io_log);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
608 /* make sure all logs got consumed */
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
609 if (conn->log_input != NULL) {
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
610 server_connection_print_log(conn);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
611 i_stream_unref(&conn->log_input);
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
612 }
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 if (conn->io != NULL)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614 io_remove(&conn->io);
15929
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
615 if (conn->fd != -1) {
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
616 if (close(conn->fd) < 0)
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
617 i_error("close(server) failed: %m");
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
618 }
22556
ba71422dc32f doveadm: Deliver remote logs over doveadm socket
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22555
diff changeset
619
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
620 pool_unref(&conn->pool);
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623 struct doveadm_server *
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 server_connection_get_server(struct server_connection *conn)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
625 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626 return conn->server;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 void server_connection_cmd(struct server_connection *conn, const char *line,
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
630 struct istream *cmd_input,
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 server_cmd_callback_t *callback, void *context)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632 {
13179
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
633 i_assert(conn->delayed_cmd == NULL);
09eb79247e71 doveadm-server: Many fixes to make it actually work properly.
Timo Sirainen <tss@iki.fi>
parents: 13036
diff changeset
634
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
635 conn->state = SERVER_REPLY_STATE_PRINT;
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
636 if (cmd_input != NULL) {
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
637 i_assert(conn->cmd_input == NULL);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
638 i_stream_ref(cmd_input);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
639 conn->cmd_input = cmd_input;
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
640 }
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
641 if (!conn->authenticated)
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
642 conn->delayed_cmd = p_strdup(conn->pool, line);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
643 else {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14299
diff changeset
644 o_stream_nsend_str(conn->output, line);
18254
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
645 server_connection_send_cmd_input(conn);
22a5eda76490 doveadm: Added support for mail commands to read an input stream (from stdin)
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
646 }
11897
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 conn->callback = callback;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 conn->context = context;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 }
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 bool server_connection_is_idle(struct server_connection *conn)
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652 {
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 return conn->callback == NULL;
b60e225386bf doveadm: Added client/server architecture support for running mail commands.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 }
15924
08edb5716823 dsync: Added tcp:host[:port] target for syncing via doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15923
diff changeset
655
15929
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
656 void server_connection_extract(struct server_connection *conn,
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
657 struct istream **istream_r,
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
658 struct ostream **ostream_r,
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
659 struct ssl_iostream **ssl_iostream_r)
15924
08edb5716823 dsync: Added tcp:host[:port] target for syncing via doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15923
diff changeset
660 {
15929
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
661 *istream_r = conn->input;
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
662 *ostream_r = conn->output;
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
663 *ssl_iostream_r = conn->ssl_iostream;
15929
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
664
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
665 conn->input = NULL;
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
666 conn->output = NULL;
15934
95ecdd9e13bf dsync: Added tcps (TCP+SSL) target.
Timo Sirainen <tss@iki.fi>
parents: 15929
diff changeset
667 conn->ssl_iostream = NULL;
15929
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
668 if (conn->io != NULL)
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
669 io_remove(&conn->io);
1841a4b95783 dsync: Use iostreams instead of fd when receiving connection from doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15924
diff changeset
670 conn->fd = -1;
15924
08edb5716823 dsync: Added tcp:host[:port] target for syncing via doveadm-server.
Timo Sirainen <tss@iki.fi>
parents: 15923
diff changeset
671 }