diff -u -r fetchmail-6.2.5/conf.c fetchmail.patched/conf.c --- fetchmail-6.2.5/conf.c Wed Oct 15 21:22:31 2003 +++ fetchmail.patched/conf.c Sun Jan 16 17:48:59 2005 @@ -274,7 +274,7 @@ else stringdump("envelope", ctl->server.envelope); numdump("envskip", ctl->server.envskip); - stringdump("qvirtual", ctl->server.qvirtual); + listdump("qvirtual", ctl->server.qvirtual); if (ctl->server.authenticate == A_ANY) stringdump("auth", "any"); diff -u -r fetchmail-6.2.5/fetchmail.c fetchmail.patched/fetchmail.c --- fetchmail-6.2.5/fetchmail.c Sun Jan 16 18:53:05 2005 +++ fetchmail.patched/fetchmail.c Sun Jan 16 18:16:32 2005 @@ -818,6 +818,7 @@ /* merge two options records */ { list_merge(&h2->server.localdomains, &h1->server.localdomains, force); + list_merge(&h2->server.qvirtual, &h1->server.qvirtual, force); list_merge(&h2->localnames, &h1->localnames, force); list_merge(&h2->mailboxes, &h1->mailboxes, force); list_merge(&h2->smtphunt, &h1->smtphunt, force); @@ -838,7 +839,6 @@ FLAG_MERGE(server.timeout); FLAG_MERGE(server.envelope); FLAG_MERGE(server.envskip); - FLAG_MERGE(server.qvirtual); FLAG_MERGE(server.skip); FLAG_MERGE(server.dns); FLAG_MERGE(server.headerfallback); @@ -1787,9 +1787,12 @@ printf(GT_(" Number of envelope header to be parsed: %d\n"), ctl->server.envskip); if (ctl->server.qvirtual) - printf(GT_(" Prefix %s will be removed from user id\n"), - ctl->server.qvirtual); - else if (outlevel >= O_VERBOSE) + { + struct idlist *idp; + for (idp = ctl->server.qvirtual; idp; idp = idp->next) + printf(GT_(" Prefix %s will be removed from user id\n"), + idp->next); + } else if (outlevel >= O_VERBOSE) printf(GT_(" No prefix stripping\n")); } diff -u -r fetchmail-6.2.5/fetchmail.h fetchmail.patched/fetchmail.h --- fetchmail-6.2.5/fetchmail.h Sun Jan 16 18:53:05 2005 +++ fetchmail.patched/fetchmail.h Sun Jan 16 17:48:18 2005 @@ -220,7 +220,7 @@ int timeout; /* inactivity timout in seconds */ char *envelope; /* envelope address list header */ int envskip; /* skip to numbered envelope header */ - char *qvirtual; /* prefix removed from local user id */ + struct idlist *qvirtual; /* prefix removed from local user id */ flag skip; /* suppress poll in implicit mode? */ flag dns; /* do DNS lookup on multidrop? */ flag headerfallback; /* fallback to received/To if envelope header not found? */ diff -u -r fetchmail-6.2.5/options.c fetchmail.patched/options.c --- fetchmail-6.2.5/options.c Wed Oct 15 21:22:31 2003 +++ fetchmail.patched/options.c Sun Jan 16 18:06:03 2005 @@ -442,9 +442,14 @@ break; case 'Q': case LA_QVIRTUAL: - ctl->server.qvirtual = xstrdup(optarg); + xalloca(buf, char *, strlen(optarg) + 1); + strcpy(buf, optarg); + cp = strtok(buf, ","); + do { + save_str(&ctl->server.qvirtual, cp, TRUE); + } while + ((cp = strtok((char *)NULL, ","))); break; - case 'u': case LA_USERNAME: ctl->remotename = xstrdup(optarg); diff -u -r fetchmail-6.2.5/rcfile_y.y fetchmail.patched/rcfile_y.y --- fetchmail-6.2.5/rcfile_y.y Sun Jan 16 18:53:05 2005 +++ fetchmail.patched/rcfile_y.y Sun Jan 16 18:52:21 2005 @@ -140,6 +140,10 @@ | domain_list STRING {save_str(¤t.server.localdomains,$2,0);} ; +qvirtual_list : STRING {save_str(¤t.server.qvirtual,$1,0);} + | qvirtual_list STRING {save_str(¤t.server.qvirtual,$2,0);} + ; + serv_option : AKA alias_list | VIA STRING {current.server.via = xstrdup($2);} | LOCALDOMAINS domain_list @@ -208,7 +212,7 @@ current.server.envskip = 0; } - | QVIRTUAL STRING {current.server.qvirtual=xstrdup($2);} + | QVIRTUAL qvirtual_list | NETSEC STRING { #ifdef NET_SECURITY void *request; diff -u -r fetchmail-6.2.5/transact.c fetchmail.patched/transact.c --- fetchmail-6.2.5/transact.c Sun Jan 16 18:53:05 2005 +++ fetchmail.patched/transact.c Sun Jan 16 18:13:11 2005 @@ -108,10 +108,15 @@ */ if (ctl->server.qvirtual) { - int sl = strlen(ctl->server.qvirtual); - - if (!strncasecmp(cp, ctl->server.qvirtual, sl)) - cp += sl; + struct idlist *idp; + for (idp = ctl->server.qvirtual; idp; idp = idp->next) { + int sl = strlen(idp->id); + + if (!strncasecmp(cp, idp->id, sl)) { + cp += sl; + break; + } + } } if ((atsign = strchr(cp, '@'))) {