]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client: Connect and command timeouts are now configurable.
authorTimo Sirainen <tss@iki.fi>
Fri, 31 May 2013 14:05:13 +0000 (17:05 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 31 May 2013 14:05:13 +0000 (17:05 +0300)
Also use the same connect timeout for the DNS lookup's timeout.

src/lib-imap-client/imapc-client.c
src/lib-imap-client/imapc-client.h
src/lib-imap-client/imapc-connection.c

index 3e979b762be15bf927e556732b4447cafd660f9b..b5592d37652a05d4333bc5d1b8269b886844b405 100644 (file)
@@ -59,6 +59,11 @@ imapc_client_init(const struct imapc_client_settings *set)
                p_strdup(pool, set->temp_path_prefix);
        client->set.rawlog_dir = p_strdup(pool, set->rawlog_dir);
        client->set.max_idle_time = set->max_idle_time;
+       client->set.connect_timeout_msecs = set->connect_timeout_msecs != 0 ?
+               set->connect_timeout_msecs :
+               IMAPC_DEFAULT_CONNECT_TIMEOUT_MSECS;
+       client->set.cmd_timeout_msecs = set->cmd_timeout_msecs != 0 ?
+               set->cmd_timeout_msecs : IMAPC_DEFAULT_COMMAND_TIMEOUT_MSECS;
 
        if (set->ssl_mode != IMAPC_CLIENT_SSL_MODE_NONE) {
                client->set.ssl_mode = set->ssl_mode;
index 9f59cd66774a9632246d17affd12940cffd807f0..516763eeaea27349df21bbcfaffd27b7ba4b9bad 100644 (file)
@@ -49,6 +49,9 @@ enum imapc_client_ssl_mode {
        IMAPC_CLIENT_SSL_MODE_STARTTLS
 };
 
+#define IMAPC_DEFAULT_CONNECT_TIMEOUT_MSECS (1000*30)
+#define IMAPC_DEFAULT_COMMAND_TIMEOUT_MSECS (1000*60*5)
+
 struct imapc_client_settings {
        const char *host;
        unsigned int port;
@@ -68,6 +71,12 @@ struct imapc_client_settings {
        const char *rawlog_dir;
        const char *ssl_crypto_device;
        bool debug;
+
+       /* Timeout for logging in. 0 = default. */
+       unsigned int connect_timeout_msecs;
+       /* Timeout for IMAP commands. Reset every time more data is being
+          sent or received. 0 = default. */
+       unsigned int cmd_timeout_msecs;
 };
 
 struct imapc_command_reply {
index 391a133184efc5d8809f7fd21b76b0a26efadaad..11331b16f9c3f58d77c640e4ab3d53f2c905a338 100644 (file)
@@ -20,9 +20,6 @@
 #include <unistd.h>
 #include <ctype.h>
 
-#define IMAPC_DNS_LOOKUP_TIMEOUT_MSECS (1000*30)
-#define IMAPC_CONNECT_TIMEOUT_MSECS (1000*30)
-#define IMAPC_COMMAND_TIMEOUT_MSECS (1000*60*5)
 #define IMAPC_MAX_INLINE_LITERAL_SIZE (1024*32)
 
 enum imapc_input_state {
@@ -1238,11 +1235,11 @@ static void imapc_connection_timeout(struct imapc_connection *conn)
        case IMAPC_CONNECTION_STATE_CONNECTING:
                i_error("imapc(%s): connect(%s, %u) timed out after %u seconds",
                        conn->name, net_ip2addr(ip), conn->client->set.port,
-                       IMAPC_CONNECT_TIMEOUT_MSECS/1000);
+                       conn->client->set.connect_timeout_msecs/1000);
                break;
        case IMAPC_CONNECTION_STATE_AUTHENTICATING:
                i_error("imapc(%s): Authentication timed out after %u seconds",
-                       conn->name, IMAPC_CONNECT_TIMEOUT_MSECS/1000);
+                       conn->name, conn->client->set.connect_timeout_msecs/1000);
                break;
        default:
                i_unreached();
@@ -1307,7 +1304,7 @@ static void imapc_connection_connect_next_ip(struct imapc_connection *conn)
                                    conn);
        conn->io = io_add(fd, IO_WRITE, imapc_connection_connected, conn);
        conn->parser = imap_parser_create(conn->input, NULL, (size_t)-1);
-       conn->to = timeout_add(IMAPC_CONNECT_TIMEOUT_MSECS,
+       conn->to = timeout_add(conn->client->set.connect_timeout_msecs,
                               imapc_connection_timeout, conn);
        conn->to_output = timeout_add(conn->client->set.max_idle_time*1000,
                                      imapc_connection_reset_idle, conn);
@@ -1364,7 +1361,7 @@ void imapc_connection_connect(struct imapc_connection *conn,
        memset(&dns_set, 0, sizeof(dns_set));
        dns_set.dns_client_socket_path =
                conn->client->set.dns_client_socket_path;
-       dns_set.timeout_msecs = IMAPC_DNS_LOOKUP_TIMEOUT_MSECS;
+       dns_set.timeout_msecs = conn->client->set.connect_timeout_msecs;
 
        imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_CONNECTING);
        if (conn->ips_count == 0 &&
@@ -1679,7 +1676,7 @@ static void imapc_connection_cmd_send(struct imapc_command *cmd)
                /* add timeout for commands if there's not one yet
                   (pre-login has its own timeout) */
                if (conn->to == NULL) {
-                       conn->to = timeout_add(IMAPC_COMMAND_TIMEOUT_MSECS,
+                       conn->to = timeout_add(conn->client->set.cmd_timeout_msecs,
                                               imapc_command_timeout, conn);
                }
        }