fix error handling of invalid SyncState *

when we find that the store is incompatible with in-store sync state,
we want to fail the whole channel. however, we must not claim that the
store died, otherwise it won't be disposed of properly.
This commit is contained in:
Oswald Buddenhagen 2012-08-18 12:48:08 +02:00
parent 1bc9c6d9cf
commit 28cccf4b35
3 changed files with 8 additions and 5 deletions

View File

@ -451,9 +451,10 @@ extern const char *str_ms[2], *str_hl[2];
#define SYNC_OK 0 /* assumed to be 0 */ #define SYNC_OK 0 /* assumed to be 0 */
#define SYNC_FAIL 1 #define SYNC_FAIL 1
#define SYNC_BAD(ms) (2<<(ms)) #define SYNC_FAIL_ALL 2
#define SYNC_NOGOOD 8 /* internal */ #define SYNC_BAD(ms) (4<<(ms))
#define SYNC_CANCELED 16 /* internal */ #define SYNC_NOGOOD 16 /* internal */
#define SYNC_CANCELED 32 /* internal */
/* All passed pointers must stay alive until cb is called. */ /* All passed pointers must stay alive until cb is called. */
void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan, void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan,

View File

@ -746,11 +746,13 @@ done_sync( int sts, void *aux )
if (sts) { if (sts) {
mvars->ret = 1; mvars->ret = 1;
if (sts & (SYNC_BAD(M) | SYNC_BAD(S))) { if (sts & (SYNC_BAD(M) | SYNC_BAD(S))) {
mvars->skip = 1;
if (sts & SYNC_BAD(M)) if (sts & SYNC_BAD(M))
mvars->state[M] = ST_CLOSED; mvars->state[M] = ST_CLOSED;
if (sts & SYNC_BAD(S)) if (sts & SYNC_BAD(S))
mvars->state[S] = ST_CLOSED; mvars->state[S] = ST_CLOSED;
mvars->skip = 1;
} else if (sts & SYNC_FAIL_ALL) {
mvars->skip = 1;
} }
} }
sync_chans( mvars, E_SYNC ); sync_chans( mvars, E_SYNC );

View File

@ -647,7 +647,7 @@ box_selected( int sts, void *aux )
if (!ctx[S]->path) { if (!ctx[S]->path) {
error( "Error: store '%s' does not support in-box sync state\n", chan->stores[S]->name ); error( "Error: store '%s' does not support in-box sync state\n", chan->stores[S]->name );
sbail: sbail:
svars->ret = SYNC_BAD(S); svars->ret = SYNC_FAIL;
sync_bail2( svars ); sync_bail2( svars );
return; return;
} }