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;
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;
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 {
#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 {
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();
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);
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 &&
/* 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);
}
}