dovecot-2.2: lib-lda: lmtp client now supports checking for time...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Mar 6 14:34:03 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/9a384f83b2a3
changeset: 18301:9a384f83b2a3
user: Timo Sirainen <tss at iki.fi>
date: Fri Mar 06 16:30:55 2015 +0200
description:
lib-lda: lmtp client now supports checking for timeouts internally.
The default is still to have no timeout.
diffstat:
src/lib-lda/lmtp-client.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/lib-lda/lmtp-client.h | 3 +++
2 files changed, 50 insertions(+), 0 deletions(-)
diffs (135 lines):
diff -r 0effbc9afeee -r 9a384f83b2a3 src/lib-lda/lmtp-client.c
--- a/src/lib-lda/lmtp-client.c Fri Mar 06 11:55:45 2015 +0200
+++ b/src/lib-lda/lmtp-client.c Fri Mar 06 16:30:55 2015 +0200
@@ -55,6 +55,7 @@
struct istream *input;
struct ostream *output;
struct io *io;
+ struct timeout *to;
int fd;
void (*data_output_callback)(void *);
@@ -103,6 +104,7 @@
client->set.source_port = set->source_port;
client->set.proxy_ttl = set->proxy_ttl;
client->set.proxy_timeout_secs = set->proxy_timeout_secs;
+ client->set.timeout_secs = set->timeout_secs;
client->finish_callback = finish_callback;
client->finish_context = context;
client->fd = -1;
@@ -115,6 +117,8 @@
{
if (client->dns_lookup != NULL)
dns_lookup_abort(&client->dns_lookup);
+ if (client->to != NULL)
+ timeout_remove(&client->to);
if (client->io != NULL)
io_remove(&client->io);
if (client->input != NULL)
@@ -604,6 +608,8 @@
" (disconnected in input)");
}
o_stream_uncork(client->output);
+ if (client->to != NULL)
+ timeout_reset(client->to);
lmtp_client_unref(&client);
}
@@ -619,11 +625,21 @@
" (connect)");
return;
}
+ if (client->to != NULL)
+ timeout_remove(&client->to);
io_remove(&client->io);
client->io = io_add(client->fd, IO_READ, lmtp_client_input, client);
lmtp_client_input(client);
}
+static void lmtp_client_connect_timeout(struct lmtp_client *client)
+{
+ i_error("lmtp client: connect(%s, %u) failed: Timed out in %u secs",
+ client->host, client->port, client->set.timeout_secs);
+ lmtp_client_fail(client, ERRSTR_TEMP_REMOTE_FAILURE
+ " (connect timeout)");
+}
+
static int lmtp_client_output(struct lmtp_client *client)
{
int ret;
@@ -636,12 +652,16 @@
else if (client->input_state == LMTP_INPUT_STATE_DATA)
(void)lmtp_client_send_data(client);
o_stream_uncork(client->output);
+ if (client->to != NULL)
+ timeout_reset(client->to);
lmtp_client_unref(&client);
return ret;
}
static int lmtp_client_connect(struct lmtp_client *client)
{
+ i_assert(client->fd == -1);
+
client->fd = net_connect_ip(&client->ip, client->port, NULL);
if (client->fd == -1) {
i_error("lmtp client: connect(%s, %u) failed: %m",
@@ -656,6 +676,10 @@
/* we're already sending data in ostream, so can't use IO_WRITE here */
client->io = io_add(client->fd, IO_READ,
lmtp_client_wait_connect, client);
+ if (client->set.timeout_secs > 0) {
+ client->to = timeout_add(client->set.timeout_secs*1000,
+ lmtp_client_connect_timeout, client);
+ }
return 0;
}
@@ -808,11 +832,34 @@
lmtp_client_send_rcpts(client);
}
+static void lmtp_client_timeout(struct lmtp_client *client)
+{
+ const char *line;
+
+ line = t_strdup_printf(ERRSTR_TEMP_REMOTE_FAILURE
+ " (Timed out after %u secs while waiting for reply to %s)",
+ client->set.timeout_secs, lmtp_client_state_to_string(client));
+ lmtp_client_fail(client, line);
+}
+
void lmtp_client_send(struct lmtp_client *client, struct istream *data_input)
{
+ i_assert(client->data_input == NULL);
+
i_stream_ref(data_input);
client->data_input = data_input;
+ /* now we actually want to start doing I/O. start the timeout
+ handling. */
+ if (client->set.timeout_secs > 0) {
+ if (client->to != NULL) {
+ /* still waiting for connect to finish */
+ timeout_remove(&client->to);
+ }
+ client->to = timeout_add(client->set.timeout_secs*1000,
+ lmtp_client_timeout, client);
+ }
+
(void)lmtp_client_send_data_cmd(client);
}
diff -r 0effbc9afeee -r 9a384f83b2a3 src/lib-lda/lmtp-client.h
--- a/src/lib-lda/lmtp-client.h Fri Mar 06 11:55:45 2015 +0200
+++ b/src/lib-lda/lmtp-client.h Fri Mar 06 16:30:55 2015 +0200
@@ -42,6 +42,9 @@
this many seconds, so it should try to keep lock waits and such
lower than this. */
unsigned int proxy_timeout_secs;
+ /* Don't wait an answer from destination server longer than this many
+ seconds (0 = unlimited) */
+ unsigned int timeout_secs;
};
/* reply contains the reply coming from remote server, or NULL
More information about the dovecot-cvs
mailing list