isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 28cccf4b351b00e5804ed1876d1f01c0cf4e501d
parent 1bc9c6d9cf10dca14f1c9162ee246bc92bc86132
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sat, 18 Aug 2012 12:48:08 +0200

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.

Diffstat:
Msrc/isync.h | 7++++---
Msrc/main.c | 4+++-
Msrc/sync.c | 2+-
3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/isync.h b/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, diff --git a/src/main.c b/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 ); diff --git a/src/sync.c b/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; }