فهرست منبع

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.
Oswald Buddenhagen 8 سال پیش
والد
کامیت
96b5ae8360
1فایلهای تغییر یافته به همراه20 افزوده شده و 14 حذف شده
  1. 20 14
      src/main.c

+ 20 - 14
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: