Browse Source

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.
wip/maildir-uid-dupes-test
Oswald Buddenhagen 13 years ago
parent
commit
28cccf4b35
  1. 7
      src/isync.h
  2. 4
      src/main.c
  3. 2
      src/sync.c

7
src/isync.h

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

4
src/main.c

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

2
src/sync.c

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

Loading…
Cancel
Save