|
|
@ -694,11 +694,10 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan ) |
|
|
|
debug( " no more %s\n", str_ms[t] ); |
|
|
|
debug( " no more %s\n", str_ms[t] ); |
|
|
|
} else if (del[1-t]) { |
|
|
|
} else if (del[1-t]) { |
|
|
|
/* c.4) d.9) / b.4) d.4) */ |
|
|
|
/* c.4) d.9) / b.4) d.4) */ |
|
|
|
debug( " %s vanished\n", str_ms[1-t] ); |
|
|
|
|
|
|
|
if (srec->msg[t] && srec->msg[t]->flags != nflags) |
|
|
|
if (srec->msg[t] && srec->msg[t]->flags != nflags) |
|
|
|
info( "Info: conflicting changes in (%d,%d)\n", srec->uid[M], srec->uid[S] ); |
|
|
|
info( "Info: conflicting changes in (%d,%d)\n", srec->uid[M], srec->uid[S] ); |
|
|
|
if (chan->ops[t] & OP_DELETE) { |
|
|
|
if (chan->ops[t] & OP_DELETE) { |
|
|
|
debug( " -> %s delete\n", str_hl[t] ); |
|
|
|
debug( " %sing delete\n", str_hl[t] ); |
|
|
|
switch (driver[t]->set_flags( ctx[t], srec->msg[t], srec->uid[t], F_DELETED, 0 )) { |
|
|
|
switch (driver[t]->set_flags( ctx[t], srec->msg[t], srec->uid[t], F_DELETED, 0 )) { |
|
|
|
case DRV_STORE_BAD: ret = SYNC_BAD(t); goto finish; |
|
|
|
case DRV_STORE_BAD: ret = SYNC_BAD(t); goto finish; |
|
|
|
case DRV_BOX_BAD: ret = SYNC_FAIL; goto finish; |
|
|
|
case DRV_BOX_BAD: ret = SYNC_FAIL; goto finish; |
|
|
@ -708,7 +707,8 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan ) |
|
|
|
Fprintf( jfp, "%c %d %d 0\n", "><"[t], srec->uid[M], srec->uid[S] ); |
|
|
|
Fprintf( jfp, "%c %d %d 0\n", "><"[t], srec->uid[M], srec->uid[S] ); |
|
|
|
srec->uid[1-t] = 0; |
|
|
|
srec->uid[1-t] = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else |
|
|
|
|
|
|
|
debug( " not %sing delete\n", str_hl[t] ); |
|
|
|
} else if (!srec->msg[1-t]) |
|
|
|
} else if (!srec->msg[1-t]) |
|
|
|
/* c.1) c.2) d.7) d.8) / b.1) b.2) d.2) d.3) */ |
|
|
|
/* c.1) c.2) d.7) d.8) / b.1) b.2) d.2) d.3) */ |
|
|
|
; |
|
|
|
; |
|
|
@ -717,9 +717,7 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan ) |
|
|
|
; /* handled above */ |
|
|
|
; /* handled above */ |
|
|
|
else if (!del[t]) { |
|
|
|
else if (!del[t]) { |
|
|
|
/* a) & b.3) / c.3) */ |
|
|
|
/* a) & b.3) / c.3) */ |
|
|
|
debug( " may %s\n", str_hl[t] ); |
|
|
|
|
|
|
|
if (chan->ops[t] & OP_FLAGS) { |
|
|
|
if (chan->ops[t] & OP_FLAGS) { |
|
|
|
debug( " -> %sing flags\n", str_hl[t] ); |
|
|
|
|
|
|
|
sflags = srec->msg[1-t]->flags; |
|
|
|
sflags = srec->msg[1-t]->flags; |
|
|
|
aflags = sflags & ~nflags; |
|
|
|
aflags = sflags & ~nflags; |
|
|
|
dflags = ~sflags & nflags; |
|
|
|
dflags = ~sflags & nflags; |
|
|
@ -743,6 +741,12 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan ) |
|
|
|
aflags &= F_DELETED; |
|
|
|
aflags &= F_DELETED; |
|
|
|
dflags = 0; |
|
|
|
dflags = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (DFlags & DEBUG) { |
|
|
|
|
|
|
|
char afbuf[16], dfbuf[16]; /* enlarge when support for keywords is added */ |
|
|
|
|
|
|
|
make_flags( aflags, afbuf ); |
|
|
|
|
|
|
|
make_flags( dflags, dfbuf ); |
|
|
|
|
|
|
|
debug( " %sing flags: +%s -%s\n", str_hl[t], afbuf, dfbuf ); |
|
|
|
|
|
|
|
} |
|
|
|
switch ((aflags | dflags) ? driver[t]->set_flags( ctx[t], srec->msg[t], srec->uid[t], aflags, dflags ) : DRV_OK) { |
|
|
|
switch ((aflags | dflags) ? driver[t]->set_flags( ctx[t], srec->msg[t], srec->uid[t], aflags, dflags ) : DRV_OK) { |
|
|
|
case DRV_STORE_BAD: ret = SYNC_BAD(t); goto finish; |
|
|
|
case DRV_STORE_BAD: ret = SYNC_BAD(t); goto finish; |
|
|
|
case DRV_BOX_BAD: ret = SYNC_FAIL; goto finish; |
|
|
|
case DRV_BOX_BAD: ret = SYNC_FAIL; goto finish; |
|
|
@ -760,7 +764,8 @@ sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan ) |
|
|
|
srec->status &= ~S_EXPIRED; |
|
|
|
srec->status &= ~S_EXPIRED; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else |
|
|
|
|
|
|
|
debug( " not %sing flags\n", str_hl[t] ); |
|
|
|
} /* else b.4) / c.4) */ |
|
|
|
} /* else b.4) / c.4) */ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|