isync

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

commit 96b5ae8360054cf7f1c48bc2d3a85124fc5a5908
parent c886f71054a1f28a992cc1f81833c09aa44f1a31
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Fri, 24 Mar 2017 15:29:06 +0100

don't mess with the driver's mailbox list from outside

the api specifies that the list remains owned by the driver, so poking
around in it is ugly and risky.

Diffstat:
Msrc/main.c | 34++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/main.c b/src/main.c @@ -381,6 +381,7 @@ typedef struct { store_t *ctx[2]; chan_ent_t *chanptr; box_ent_t *boxptr; + string_list_t *boxes[2]; char *names[2]; int ret, all, list, state[2]; char done, skip, cben; @@ -835,8 +836,8 @@ sync_chans( main_vars_t *mvars, int ent ) if (!mvars->chanptr->boxlist && mvars->chan->patterns) { mvars->chanptr->boxlist = 2; - boxes[M] = filter_boxes( mvars->ctx[M]->boxes, mvars->chan->boxes[M], mvars->chan->patterns ); - boxes[S] = filter_boxes( mvars->ctx[S]->boxes, mvars->chan->boxes[S], mvars->chan->patterns ); + boxes[M] = filter_boxes( mvars->boxes[M], mvars->chan->boxes[M], mvars->chan->patterns ); + boxes[S] = filter_boxes( mvars->boxes[S], mvars->chan->boxes[S], mvars->chan->patterns ); mboxapp = &mvars->chanptr->boxes; for (mb = sb = 0; ; ) { char *mname = boxes[M] ? boxes[M][mb] : 0; @@ -901,7 +902,9 @@ sync_chans( main_vars_t *mvars, int ent ) next: mvars->cben = 0; - for (t = 0; t < 2; t++) + for (t = 0; t < 2; t++) { + free_string_list( mvars->boxes[t] ); + mvars->boxes[t] = 0; if (mvars->state[t] == ST_FRESH) { /* An unconnected store may be only cancelled. */ mvars->state[t] = ST_CLOSED; @@ -910,6 +913,7 @@ sync_chans( main_vars_t *mvars, int ent ) mvars->state[t] = ST_CANCELING; mvars->drv[t]->cancel_cmds( mvars->ctx[t], cancel_prep_done, AUX ); } + } mvars->cben = 1; if (mvars->state[M] != ST_CLOSED || mvars->state[S] != ST_CLOSED) { mvars->skip = 1; @@ -998,7 +1002,8 @@ static void store_listed( int sts, void *aux ) { MVARS(aux) - string_list_t **box, *bx; + string_list_t *boxes = mvars->ctx[t]->boxes; + string_list_t *box; switch (sts) { case DRV_CANCELED: @@ -1006,25 +1011,26 @@ store_listed( int sts, void *aux ) case DRV_OK: if (DFlags & DEBUG_MAIN) { debug( "got mailbox list from %s:\n", str_ms[t] ); - for (bx = mvars->ctx[t]->boxes; bx; bx = bx->next) - debug( " %s\n", bx->string ); + for (box = boxes; box; box = box->next) + debug( " %s\n", box->string ); } - if (mvars->ctx[t]->conf->flat_delim) { - for (box = &mvars->ctx[t]->boxes; *box; box = &(*box)->next) { + for (box = boxes; box; box = box->next) { + if (mvars->ctx[t]->conf->flat_delim) { string_list_t *nbox; - if (map_name( (*box)->string, (char **)&nbox, offsetof(string_list_t, string), mvars->ctx[t]->conf->flat_delim, "/" ) < 0) { - error( "Error: flattened mailbox name '%s' contains canonical hierarchy delimiter\n", (*box)->string ); + if (map_name( box->string, (char **)&nbox, offsetof(string_list_t, string), mvars->ctx[t]->conf->flat_delim, "/" ) < 0) { + error( "Error: flattened mailbox name '%s' contains canonical hierarchy delimiter\n", box->string ); mvars->ret = mvars->skip = 1; } else { - nbox->next = (*box)->next; - free( *box ); - *box = nbox; + nbox->next = mvars->boxes[t]; + mvars->boxes[t] = nbox; } + } else { + add_string_list( &mvars->boxes[t], box->string ); } } if (mvars->ctx[t]->conf->map_inbox) { debug( "adding mapped inbox to %s: %s\n", str_ms[t], mvars->ctx[t]->conf->map_inbox ); - add_string_list( &mvars->ctx[t]->boxes, mvars->ctx[t]->conf->map_inbox ); + add_string_list( &mvars->boxes[t], mvars->ctx[t]->conf->map_inbox ); } break; default: