Merge branch 'isync_1_2_branch'

This commit is contained in:
Oswald Buddenhagen 2015-04-26 20:59:11 +02:00
commit a041766140
4 changed files with 31 additions and 9 deletions

View File

@ -41,7 +41,6 @@ typedef struct store_conf {
const char *trash; const char *trash;
uint max_size; /* off_t is overkill */ uint max_size; /* off_t is overkill */
char trash_remote_new, trash_only_new; char trash_remote_new, trash_only_new;
char failed;
} store_conf_t; } store_conf_t;
/* For message->flags */ /* For message->flags */
@ -249,6 +248,9 @@ struct driver {
/* Get approximate amount of memory occupied by the driver. */ /* Get approximate amount of memory occupied by the driver. */
int (*memory_usage)( store_t *ctx ); int (*memory_usage)( store_t *ctx );
/* Get the FAIL_* state of the driver. */
int (*fail_state)( store_conf_t *conf );
}; };
void free_generic_messages( message_t * ); void free_generic_messages( message_t * );

View File

@ -57,6 +57,7 @@ typedef struct imap_server_conf {
#ifdef HAVE_LIBSSL #ifdef HAVE_LIBSSL
char ssl_type; char ssl_type;
#endif #endif
char failed;
} imap_server_conf_t; } imap_server_conf_t;
typedef struct imap_store_conf { typedef struct imap_store_conf {
@ -2166,7 +2167,7 @@ imap_open_store_bail( imap_store_t *ctx, int failed )
{ {
void (*cb)( store_t *srv, void *aux ) = ctx->callbacks.imap_open; void (*cb)( store_t *srv, void *aux ) = ctx->callbacks.imap_open;
void *aux = ctx->callback_aux; void *aux = ctx->callback_aux;
ctx->gen.conf->failed = failed; ((imap_store_conf_t *)ctx->gen.conf)->server->failed = failed;
imap_cancel_store( &ctx->gen ); imap_cancel_store( &ctx->gen );
cb( 0, aux ); cb( 0, aux );
} }
@ -2668,6 +2669,14 @@ imap_memory_usage( store_t *gctx )
return ctx->buffer_mem + ctx->conn.buffer_mem; return ctx->buffer_mem + ctx->conn.buffer_mem;
} }
/******************* imap_fail_state *******************/
static int
imap_fail_state( store_conf_t *gconf )
{
return ((imap_store_conf_t *)gconf)->server->failed;
}
/******************* imap_parse_store *******************/ /******************* imap_parse_store *******************/
imap_server_conf_t *servers, **serverapp = &servers; imap_server_conf_t *servers, **serverapp = &servers;
@ -2950,4 +2959,5 @@ struct driver imap_driver = {
imap_cancel_cmds, imap_cancel_cmds,
imap_commit_cmds, imap_commit_cmds,
imap_memory_usage, imap_memory_usage,
imap_fail_state,
}; };

View File

@ -57,6 +57,7 @@ typedef struct maildir_store_conf {
int alt_map; int alt_map;
#endif /* USE_DB */ #endif /* USE_DB */
char info_delimiter; char info_delimiter;
char failed;
char *info_prefix, *info_stop; /* precalculated from info_delimiter */ char *info_prefix, *info_stop; /* precalculated from info_delimiter */
} maildir_store_conf_t; } maildir_store_conf_t;
@ -141,12 +142,12 @@ maildir_validate_path( store_conf_t *conf )
if (!conf->path) { if (!conf->path) {
error( "Maildir error: store '%s' has no Path\n", conf->name ); error( "Maildir error: store '%s' has no Path\n", conf->name );
conf->failed = FAIL_FINAL; ((maildir_store_conf_t *)conf)->failed = FAIL_FINAL;
return -1; return -1;
} }
if (stat( conf->path, &st ) || !S_ISDIR(st.st_mode)) { if (stat( conf->path, &st ) || !S_ISDIR(st.st_mode)) {
error( "Maildir error: cannot open store '%s'\n", conf->path ); error( "Maildir error: cannot open store '%s'\n", conf->path );
conf->failed = FAIL_FINAL; ((maildir_store_conf_t *)conf)->failed = FAIL_FINAL;
return -1; return -1;
} }
return 0; return 0;
@ -432,7 +433,7 @@ maildir_validate( const char *box, int create, maildir_store_t *ctx )
return DRV_BOX_BAD; return DRV_BOX_BAD;
if (make_box_dir( buf, bl )) { if (make_box_dir( buf, bl )) {
sys_error( "Maildir error: cannot create mailbox '%s'", box ); sys_error( "Maildir error: cannot create mailbox '%s'", box );
ctx->gen.conf->failed = FAIL_FINAL; ((maildir_store_conf_t *)ctx->gen.conf)->failed = FAIL_FINAL;
maildir_invoke_bad_callback( &ctx->gen ); maildir_invoke_bad_callback( &ctx->gen );
return DRV_CANCELED; return DRV_CANCELED;
} }
@ -1630,6 +1631,12 @@ maildir_memory_usage( store_t *gctx ATTR_UNUSED )
return 0; return 0;
} }
static int
maildir_fail_state( store_conf_t *gconf )
{
return ((maildir_store_conf_t *)gconf)->failed;
}
static int static int
maildir_parse_store( conffile_t *cfg, store_conf_t **storep ) maildir_parse_store( conffile_t *cfg, store_conf_t **storep )
{ {
@ -1698,4 +1705,5 @@ struct driver maildir_driver = {
maildir_cancel_cmds, maildir_cancel_cmds,
maildir_commit_cmds, maildir_commit_cmds,
maildir_memory_usage, maildir_memory_usage,
maildir_fail_state,
}; };

View File

@ -448,7 +448,7 @@ main( int argc, char **argv )
else if (!strcmp( opt, "-net" )) else if (!strcmp( opt, "-net" ))
op = VERBOSE | DEBUG_NET; op = VERBOSE | DEBUG_NET;
else if (!strcmp( opt, "-net-all" )) else if (!strcmp( opt, "-net-all" ))
op = VERBOSE | DEBUG_NET_ALL; op = VERBOSE | DEBUG_NET | DEBUG_NET_ALL;
else if (!strcmp( opt, "-sync" )) else if (!strcmp( opt, "-sync" ))
op = VERBOSE | DEBUG_SYNC; op = VERBOSE | DEBUG_SYNC;
else else
@ -637,7 +637,7 @@ main( int argc, char **argv )
op |= DEBUG_NET | VERBOSE; op |= DEBUG_NET | VERBOSE;
break; break;
case 'N': case 'N':
op |= DEBUG_NET_ALL | VERBOSE; op |= DEBUG_NET | DEBUG_NET_ALL | VERBOSE;
break; break;
case 's': case 's':
op |= DEBUG_SYNC | VERBOSE; op |= DEBUG_SYNC | VERBOSE;
@ -757,8 +757,10 @@ sync_chans( main_vars_t *mvars, int ent )
info( "Channel %s\n", mvars->chan->name ); info( "Channel %s\n", mvars->chan->name );
mvars->skip = mvars->cben = 0; mvars->skip = mvars->cben = 0;
for (t = 0; t < 2; t++) { for (t = 0; t < 2; t++) {
if (mvars->chan->stores[t]->failed != FAIL_TEMP) { int st = mvars->chan->stores[t]->driver->fail_state( mvars->chan->stores[t] );
info( "Skipping due to failed %s store %s.\n", str_ms[t], mvars->chan->stores[t]->name ); if (st != FAIL_TEMP) {
info( "Skipping due to %sfailed %s store %s.\n",
(st == FAIL_WAIT) ? "temporarily " : "", str_ms[t], mvars->chan->stores[t]->name );
mvars->skip = 1; mvars->skip = 1;
} }
} }