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:
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;
}