X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Faliasbr.c;h=493725105ef5d59875ffa6edd5b75ac5b9b07c04;hb=47dca82001bf41dcd6954f72d2d27e3fbc2e8e9d;hp=b2e51f560cfbda2dc4241af104264f294442c5f2;hpb=13ae9ba066e6b8c114daa6714895a56816465f49;p=mmh diff --git a/uip/aliasbr.c b/uip/aliasbr.c index b2e51f5..4937251 100644 --- a/uip/aliasbr.c +++ b/uip/aliasbr.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -25,7 +26,7 @@ struct home *hometail = NULL; /* * prototypes */ -int alias (char *); +int alias (char *); int akvisible (void); void init_pw (void); char *akresult (struct aka *); @@ -45,7 +46,6 @@ static char *getalias (char *); static void add_aka (struct aka *, char *); static struct aka *akalloc (char *); static struct home *hmalloc (struct passwd *); -struct home *seek_home (char *); /* Do mh alias substitution on 's' and return the results. */ @@ -104,9 +104,45 @@ akval (struct aka *ak, char *s) if (!s) return s; /* XXX */ - for (; ak; ak = ak->ak_next) - if (aleq (s, ak->ak_name)) + 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 getcpy (s); } @@ -429,12 +465,15 @@ getalias (char *addrs) if (*cp == 0) return (cp = NULL); + /* Remove leading any space from the address. */ for (pp = cp; isspace (*pp); pp++) continue; if (*pp == 0) return (cp = NULL); + /* Find the end of the address. */ for (qp = pp; *qp != 0 && *qp != ','; qp++) continue; + /* Set cp to point to the remainder of the addresses. */ if (*qp == ',') *qp++ = 0; for (cp = qp, qp--; qp > pp; qp--) @@ -537,36 +576,3 @@ hmalloc (struct passwd *pw) return p; } - - -struct home * -seek_home (char *name) -{ - register struct home *hp; - struct passwd *pw; - char lname[32]; - unsigned char *c; - char *c1; - - for (hp = homehead; hp; hp = hp->h_next) - if (!mh_strcasecmp (name, hp->h_name)) - return hp; - - /* - * The only place where there might be problems. - * This assumes that ALL usernames are kept in lowercase. - */ - for (c = name, c1 = lname; - *c && (c1 - lname < (int) sizeof(lname) - 1); - c++, c1++) { - if (isalpha(*c) && isupper(*c)) - *c1 = tolower (*c); - else - *c1 = *c; - } - *c1 = '\0'; - if ((pw = getpwnam(lname))) - return(hmalloc(pw)); - - return NULL; -}