|
@@ -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:
|