X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Faliasbr.c;h=d8350f9dfa6f55b74106461725d813c7bedb44b2;hb=d8a78332490cd5a5928d6a23d06797ca9caa2b45;hp=b1a7e619cd0e0a2c9be06d49e6a2d7e4fc9a75fd;hpb=5dd6771b28c257af405d7248639ed0e3bcdce38b;p=mmh diff --git a/uip/aliasbr.c b/uip/aliasbr.c index b1a7e61..d8350f9 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 *); @@ -104,9 +105,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); } @@ -350,29 +387,20 @@ addgroup (struct aka *ak, char *grp) return 0; } -#ifndef DBMPWD - if (homehead == NULL) - init_pw (); -#endif /* DBMPWD */ - while ((gp = *gr->gr_mem++)) -#ifdef DBMPWD { struct passwd *pw; -#endif /* DBMPWD */ for (hm = homehead; hm; hm = hm->h_next) if (!strcmp (hm->h_name, gp)) { add_aka (ak, hm->h_name); break; } -#ifdef DBMPWD if ((pw = getpwnam(gp))) { hmalloc(pw); add_aka (ak, gp); } } -#endif /* DBMPWD */ return 1; } @@ -396,10 +424,7 @@ addmember (struct aka *ak, char *grp) return 0; } -#ifndef DBMPWD - if (homehead == NULL) -#endif /* DBMPWD */ - init_pw (); + init_pw (); for (hm = homehead; hm; hm = hm->h_next) if (hm->h_gid == gid) @@ -415,15 +440,13 @@ addall (struct aka *ak) int noshell = NoShell == NULL || *NoShell == 0; register struct home *hm; -#ifndef DBMPWD - if (homehead == NULL) -#endif /* DBMPWD */ - init_pw (); + init_pw (); + if (Everyone < 0) Everyone = EVERYONE; for (hm = homehead; hm; hm = hm->h_next) - if (hm->h_uid > Everyone + if ((int) hm->h_uid > Everyone && (noshell || strcmp (hm->h_shell, NoShell))) add_aka (ak, hm->h_name); @@ -443,12 +466,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--) @@ -487,28 +513,24 @@ void init_pw (void) { register struct passwd *pw; -#ifdef DBMPWD static int init; if (!init) { - /* if the list has yet to be initialized */ - /* zap the list, and rebuild from scratch */ - homehead=NULL; - hometail=NULL; - init++; -#endif /* DBMPWD */ + /* if the list has yet to be initialized */ + /* zap the list, and rebuild from scratch */ + homehead=NULL; + hometail=NULL; + init++; - setpwent (); + setpwent (); - while ((pw = getpwent ())) - if (!hmalloc (pw)) - break; + while ((pw = getpwent ())) + if (!hmalloc (pw)) + break; - endpwent (); -#ifdef DBMPWD + endpwent (); } -#endif /* DBMPWD */ } @@ -561,27 +583,22 @@ struct home * seek_home (char *name) { register struct home *hp; -#ifdef DBMPWD struct passwd *pw; char lname[32]; unsigned char *c; char *c1; -#else /* DBMPWD */ - - if (homehead == NULL) - init_pw (); -#endif /* DBMPWD */ for (hp = homehead; hp; hp = hp->h_next) if (!mh_strcasecmp (name, hp->h_name)) return hp; -#ifdef DBMPWD /* * 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 < sizeof(lname) - 1); c++, c1++) { + for (c = name, c1 = lname; + *c && (c1 - lname < (int) sizeof(lname) - 1); + c++, c1++) { if (isalpha(*c) && isupper(*c)) *c1 = tolower (*c); else @@ -590,7 +607,6 @@ seek_home (char *name) *c1 = '\0'; if ((pw = getpwnam(lname))) return(hmalloc(pw)); -#endif /* DBMPWD */ - + return NULL; }