X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Faliasbr.c;h=3faa3733d33b98522d873ddfbc111efee3ed7f94;hb=9e6f6b822a6de620c0aab4b122937e2c598169ed;hp=b00f51bc4b42c89368379e5b6d821d395bd2aba7;hpb=9cf6132a6ea29968131a000bc2fb6860affac45e;p=mmh diff --git a/uip/aliasbr.c b/uip/aliasbr.c index b00f51b..3faa373 100644 --- a/uip/aliasbr.c +++ b/uip/aliasbr.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -99,9 +100,47 @@ akval(struct aka *ak, char *s) if (!s) return s; /* XXX */ - for (; ak; ak = ak->ak_next) - if (aleq(s, ak->ak_name)) - return akresult(ak); + for (; ak; ak = ak->ak_next) { + if (aleq (s, ak->ak_name)) { + return akresult (ak); + } else if (strchr (s, ':')) { + /* + ** The first address in a blind list will contain the + ** alias name, so try to match, but just with just the + ** address (not including the list name). If there's a + ** match, then replace the alias part with its + ** expansion. + */ + + char *name = getname(s); + char *cp = NULL; + + if (name) { + /* + ** s is of the form "Blind list: address". If address + ** is an alias, expand it. + */ + struct mailname *mp = getm(name, NULL, 0, AD_NAME, NULL); + + if (mp && mp->m_ingrp) { + char *gname = add (mp->m_gname, NULL); + + if (gname && aleq(name, ak->ak_name)) { + /* Will leak cp. */ + cp = concat (gname, akresult (ak), NULL); + free(gname); + } + } + mnfree(mp); + } + /* Need to flush getname after use. */ + while (getname("")) continue; + + if (cp) { + return cp; + } + } + } return mh_xstrdup(s); }