const char *error;
pool_t pool;
+ i_assert(set->connect_retry_count == 0 ||
+ set->connect_retry_interval_secs > 0);
+
pool = pool_alloconly_create("imapc client", 1024);
client = p_new(pool, struct imapc_client, 1);
client->pool = pool;
client->set.connect_timeout_msecs = set->connect_timeout_msecs != 0 ?
set->connect_timeout_msecs :
IMAPC_DEFAULT_CONNECT_TIMEOUT_MSECS;
+ client->set.connect_retry_count = set->connect_retry_count;
+ client->set.connect_retry_interval_secs = set->connect_retry_interval_secs;
client->set.cmd_timeout_msecs = set->cmd_timeout_msecs != 0 ?
set->cmd_timeout_msecs : IMAPC_DEFAULT_COMMAND_TIMEOUT_MSECS;
client->set.max_line_length = set->max_line_length != 0 ?
/* Timeout for logging in. 0 = default. */
unsigned int connect_timeout_msecs;
+ /* Number of retries, -1 = infinity */
+ unsigned int connect_retry_count;
+ /* Interval between retries, must be > 0 if retries > 0 */
+ unsigned int connect_retry_interval_secs;
+
/* Timeout for IMAP commands. Reset every time more data is being
sent or received. 0 = default. */
unsigned int cmd_timeout_msecs;
#define IMAPC_COMMAND_STATE_AUTHENTICATE_CONTINUE 10000
#define IMAPC_MAX_INLINE_LITERAL_SIZE (1024*32)
-#define IMAPC_RECONNECT_MIN_RETRY_SECS 10
/* If LOGOUT reply takes longer than this, disconnect. */
#define IMAPC_LOGOUT_TIMEOUT_MSECS 5000
{
if (conn->client->logging_out)
return FALSE;
+ if (conn->client->set.connect_retry_count == 0 ||
+ (conn->client->set.connect_retry_count < UINT_MAX &&
+ conn->reconnect_count >= conn->client->set.connect_retry_count))
+ return FALSE;
+
if (conn->selected_box != NULL)
return imapc_client_mailbox_can_reconnect(conn->selected_box);
else {
DEF(SET_STR, imapc_list_prefix),
DEF(SET_TIME, imapc_cmd_timeout),
DEF(SET_TIME, imapc_max_idle_time),
+ DEF(SET_UINT, imapc_connection_retry_count),
+ DEF(SET_TIME, imapc_connection_retry_interval_secs),
DEF(SET_SIZE, imapc_max_line_length),
DEF(SET_STR, pop3_deleted_flag),
.imapc_list_prefix = "",
.imapc_cmd_timeout = 5*60,
.imapc_max_idle_time = 60*29,
+ .imapc_connection_retry_count = 1,
+ .imapc_connection_retry_interval_secs = 10,
.imapc_max_line_length = 0,
.pop3_deleted_flag = ""
const char *imapc_list_prefix;
unsigned int imapc_cmd_timeout;
unsigned int imapc_max_idle_time;
+ unsigned int imapc_connection_retry_count;
+ unsigned int imapc_connection_retry_interval_secs;
uoff_t imapc_max_line_length;
const char *pop3_deleted_flag;
set.sasl_mechanisms = imapc_set->imapc_sasl_mechanisms;
set.use_proxyauth = (imapc_set->parsed_features & IMAPC_FEATURE_PROXYAUTH) != 0;
set.cmd_timeout_msecs = imapc_set->imapc_cmd_timeout * 1000;
+ set.connect_retry_count = imapc_set->imapc_connection_retry_count;
+ set.connect_retry_interval_secs = imapc_set->imapc_connection_retry_interval_secs;
set.max_idle_time = imapc_set->imapc_max_idle_time;
set.max_line_length = imapc_set->imapc_max_line_length;
set.dns_client_socket_path = *ns->user->set->base_dir == '\0' ? "" :