Просмотр исходного кода

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.
Oswald Buddenhagen 13 лет назад
Родитель
Сommit
28cccf4b35
3 измененных файлов с 8 добавлено и 5 удалено
  1. 4 3
      src/isync.h
  2. 3 1
      src/main.c
  3. 1 1
      src/sync.c

+ 4 - 3
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,

+ 3 - 1
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 );

+ 1 - 1
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;
 		}