X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Faliasbr.c;h=b00f51bc4b42c89368379e5b6d821d395bd2aba7;hp=752cda702202c3faa380a8d844408e2a8a03c22a;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=a485ed478abbd599d8c9aab48934e7a26733ecb1 diff --git a/uip/aliasbr.c b/uip/aliasbr.c index 752cda7..b00f51b 100644 --- a/uip/aliasbr.c +++ b/uip/aliasbr.c @@ -1,16 +1,17 @@ /* - * aliasbr.c -- new aliasing mechanism - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - */ +** aliasbr.c -- new aliasing mechanism +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +*/ #include #include #include #include #include +#include static int akvis; static char *akerrst; @@ -22,42 +23,38 @@ struct home *homehead = NULL; struct home *hometail = NULL; /* - * prototypes - */ -int alias (char *); -int akvisible (void); -void init_pw (void); -char *akresult (struct aka *); -char *akvalue (char *); -char *akerror (int); - -static char *akval (struct aka *, char *); -static int aleq (char *, char *); -static char *scanp (unsigned char *); -static char *getp (char *); -static char *seekp (char *, char *, char **); -static int addfile (struct aka *, char *); -static int addgroup (struct aka *, char *); -static int addmember (struct aka *, char *); -static int addall (struct aka *); -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 *); +** prototypes +*/ +int alias(char *); +int akvisible(void); +void init_pw(void); +char *akresult(struct aka *); +char *akvalue(char *); +char *akerror(int); + +static char *akval(struct aka *, char *); +static int aleq(char *, char *); +static char *scanp(unsigned char *); +static char *getp(char *); +static char *seekp(char *, char *, char **); +static int addfile(struct aka *, char *); +static int addgroup(struct aka *, char *); +static int addmember(struct aka *, char *); +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. */ char * -akvalue (char *s) +akvalue(char *s) { - register char *v; - - if (akahead == NULL) - alias (AliasFile); + char *v; akvis = -1; - v = akval (akahead, s); + v = akval(akahead, s); if (akvis == -1) akvis = 0; return v; @@ -65,27 +62,27 @@ akvalue (char *s) int -akvisible (void) +akvisible(void) { return akvis; } char * -akresult (struct aka *ak) +akresult(struct aka *ak) { - register char *cp = NULL, *dp, *pp; - register struct adr *ad; + char *cp = NULL, *dp, *pp; + struct adr *ad; for (ad = ak->ak_addr; ad; ad = ad->ad_next) { - pp = ad->ad_local ? akval (ak->ak_next, ad->ad_text) - : getcpy (ad->ad_text); + pp = ad->ad_local ? akval(ak->ak_next, ad->ad_text) + : mh_xstrdup(ad->ad_text); if (cp) { dp = cp; - cp = concat (cp, ",", pp, NULL); - free (dp); - free (pp); + cp = concat(cp, ",", pp, NULL); + mh_free0(&dp); + mh_free0(&pp); } else cp = pp; } @@ -97,177 +94,176 @@ akresult (struct aka *ak) static char * -akval (struct aka *ak, char *s) +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); + if (aleq(s, ak->ak_name)) + return akresult(ak); - return getcpy (s); + return mh_xstrdup(s); } static int -aleq (char *string, char *aliasent) +aleq(char *string, char *aliasent) { - register char c; + char c; while ((c = *string++)) if (*aliasent == '*') return 1; + else if ((c | 040) != (*aliasent | 040)) + return 0; else - if ((c | 040) != (*aliasent | 040)) - return 0; - else - aliasent++; + aliasent++; return (*aliasent == 0 || *aliasent == '*'); } +/* +** file needs to be absolute or relative to cwd +*/ int -alias (char *file) +alias(char *file) { int i; - register char *bp, *cp, *pp; + char *bp, *cp, *pp; char lc, *ap; - register struct aka *ak = NULL; - register FILE *fp; + struct aka *ak = NULL; + FILE *fp; - if (*file != '/' - && (strncmp (file, "./", 2) && strncmp (file, "../", 3))) - file = etcpath (file); - if ((fp = fopen (file, "r")) == NULL) { + if ((fp = fopen(file, "r")) == NULL) { akerrst = file; return AK_NOFILE; } - while (vfgets (fp, &ap) == OK) { + while (vfgets(fp, &ap) == OK) { bp = ap; - switch (*(pp = scanp (bp))) { - case '<': /* recurse a level */ - if (!*(cp = getp (pp + 1))) { - akerrst = "'<' without alias-file"; - fclose (fp); - return AK_ERROR; - } - if ((i = alias (cp)) != AK_OK) { - fclose (fp); - return i; - } - - case ':': /* comment */ - case ';': - case '#': - case 0: - continue; + switch (*(pp = scanp(bp))) { + case '<': /* recurse a level */ + if (!*(cp = getp(pp + 1))) { + akerrst = "'<' without alias-file"; + fclose(fp); + return AK_ERROR; + } + if ((i = alias(cp)) != AK_OK) { + fclose(fp); + return i; + } + + case ':': /* comment */ + case ';': + case '#': + case 0: + continue; } akerrst = bp; - if (!*(cp = seekp (pp, &lc, &ap))) { - fclose (fp); + if (!*(cp = seekp(pp, &lc, &ap))) { + fclose(fp); return AK_ERROR; } - if (!(ak = akalloc (cp))) { - fclose (fp); + if (!(ak = akalloc(cp))) { + fclose(fp); return AK_LIMIT; } switch (lc) { - case ':': - ak->ak_visible = 0; - break; + case ':': + ak->ak_visible = 0; + break; - case ';': - ak->ak_visible = 1; - break; + case ';': + ak->ak_visible = 1; + break; - default: - fclose (fp); - return AK_ERROR; + default: + fclose(fp); + return AK_ERROR; } - switch (*(pp = scanp (ap))) { - case 0: /* EOL */ - fclose (fp); - return AK_ERROR; - - case '<': /* read values from file */ - if (!*(cp = getp (pp + 1))) { - fclose (fp); - return AK_ERROR; - } - if (!addfile (ak, cp)) { - fclose (fp); - return AK_NOFILE; - } - break; + switch (*(pp = scanp(ap))) { + case 0: /* EOL */ + fclose(fp); + return AK_ERROR; - case '=': /* UNIX group */ - if (!*(cp = getp (pp + 1))) { - fclose (fp); - return AK_ERROR; - } - if (!addgroup (ak, cp)) { - fclose (fp); - return AK_NOGROUP; - } - break; + case '<': /* read values from file */ + if (!*(cp = getp(pp + 1))) { + fclose(fp); + return AK_ERROR; + } + if (!addfile(ak, cp)) { + fclose(fp); + return AK_NOFILE; + } + break; - case '+': /* UNIX group members */ - if (!*(cp = getp (pp + 1))) { - fclose (fp); - return AK_ERROR; - } - if (!addmember (ak, cp)) { - fclose (fp); - return AK_NOGROUP; - } - break; + case '=': /* UNIX group */ + if (!*(cp = getp(pp + 1))) { + fclose(fp); + return AK_ERROR; + } + if (!addgroup(ak, cp)) { + fclose(fp); + return AK_NOGROUP; + } + break; - case '*': /* Everyone */ - addall (ak); - break; + case '+': /* UNIX group members */ + if (!*(cp = getp(pp + 1))) { + fclose(fp); + return AK_ERROR; + } + if (!addmember(ak, cp)) { + fclose(fp); + return AK_NOGROUP; + } + break; - default: /* list */ - while ((cp = getalias (pp))) - add_aka (ak, cp); - break; + default: /* list */ + while ((cp = getalias(pp))) + add_aka(ak, cp); + break; } } - fclose (fp); + fclose(fp); return AK_OK; } char * -akerror (int i) +akerror(int i) { static char buffer[BUFSIZ]; switch (i) { - case AK_NOFILE: - snprintf (buffer, sizeof(buffer), "unable to read '%s'", akerrst); - break; - - case AK_ERROR: - snprintf (buffer, sizeof(buffer), "error in line '%s'", akerrst); - break; - - case AK_LIMIT: - snprintf (buffer, sizeof(buffer), "out of memory while on '%s'", akerrst); - break; - - case AK_NOGROUP: - snprintf (buffer, sizeof(buffer), "no such group as '%s'", akerrst); - break; - - default: - snprintf (buffer, sizeof(buffer), "unknown error (%d)", i); - break; + case AK_NOFILE: + snprintf(buffer, sizeof(buffer), "unable to read '%s'", + akerrst); + break; + + case AK_ERROR: + snprintf(buffer, sizeof(buffer), "error in line '%s'", + akerrst); + break; + + case AK_LIMIT: + snprintf(buffer, sizeof(buffer), "out of memory while on '%s'", + akerrst); + break; + + case AK_NOGROUP: + snprintf(buffer, sizeof(buffer), "no such group as '%s'", + akerrst); + break; + + default: + snprintf(buffer, sizeof(buffer), "unknown error (%d)", i); + break; } return buffer; @@ -275,21 +271,21 @@ akerror (int i) static char * -scanp (unsigned char *p) +scanp(unsigned char *p) { - while (isspace (*p)) + while (isspace(*p)) p++; return p; } static char * -getp (char *p) +getp(char *p) { - register unsigned char *cp = scanp (p); + unsigned char *cp = scanp(p); p = cp; - while (!isspace (*cp) && *cp) + while (!isspace(*cp) && *cp) cp++; *cp = 0; @@ -298,12 +294,12 @@ getp (char *p) static char * -seekp (char *p, char *c, char **a) +seekp(char *p, char *c, char **a) { - register unsigned char *cp; + unsigned char *cp; - p = cp = scanp (p); - while (!isspace (*cp) && *cp && *cp != ':' && *cp != ';') + p = cp = scanp(p); + while (!isspace(*cp) && *cp && *cp != ':' && *cp != ';') cp++; *c = *cp; *cp++ = 0; @@ -314,125 +310,90 @@ seekp (char *p, char *c, char **a) static int -addfile (struct aka *ak, char *file) +addfile(struct aka *ak, char *file) { - register char *cp; + char *cp; char buffer[BUFSIZ]; - register FILE *fp; + FILE *fp; - if (!(fp = fopen (etcpath (file), "r"))) { + if (!(fp = fopen(etcpath(file), "r"))) { akerrst = file; return 0; } - while (fgets (buffer, sizeof buffer, fp)) - while ((cp = getalias (buffer))) - add_aka (ak, cp); + while (fgets(buffer, sizeof buffer, fp)) + while ((cp = getalias(buffer))) + add_aka(ak, cp); - fclose (fp); + fclose(fp); return 1; } static int -addgroup (struct aka *ak, char *grp) +addgroup(struct aka *ak, char *grp) { - register char *gp; - register struct group *gr = getgrnam (grp); - register struct home *hm = NULL; + char *gp; + struct group *gr = getgrnam(grp); + struct home *hm = NULL; if (!gr) - gr = getgrgid (atoi (grp)); + gr = getgrgid(atoi(grp)); if (!gr) { akerrst = 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); + if (strcmp(hm->h_name, gp)==0) { + add_aka(ak, hm->h_name); break; } -#ifdef DBMPWD - if ((pw = getpwnam(gp))) - { - hmalloc(pw); - add_aka (ak, gp); + if ((pw = getpwnam(gp))) { + hmalloc(pw); + add_aka(ak, gp); } } -#endif /* DBMPWD */ return 1; } static int -addmember (struct aka *ak, char *grp) +addmember(struct aka *ak, char *grp) { gid_t gid; - register struct group *gr = getgrnam (grp); - register struct home *hm = NULL; + struct group *gr = getgrnam(grp); + struct home *hm = NULL; if (gr) gid = gr->gr_gid; else { - gid = atoi (grp); - gr = getgrgid (gid); + gid = atoi(grp); + gr = getgrgid(gid); } if (!gr) { akerrst = 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) - add_aka (ak, hm->h_name); + add_aka(ak, hm->h_name); return 1; } -static int -addall (struct aka *ak) -{ - int noshell = NoShell == NULL || *NoShell == 0; - register struct home *hm; - -#ifndef DBMPWD - if (homehead == NULL) -#endif /* DBMPWD */ - init_pw (); - if (Everyone < 0) - Everyone = EVERYONE; - - for (hm = homehead; hm; hm = hm->h_next) - if (hm->h_uid > Everyone - && (noshell || strcmp (hm->h_shell, NoShell))) - add_aka (ak, hm->h_name); - - return homehead != NULL; -} - - static char * -getalias (char *addrs) +getalias(char *addrs) { - register unsigned char *pp, *qp; + unsigned char *pp, *qp; static char *cp = NULL; if (cp == NULL) @@ -441,7 +402,7 @@ getalias (char *addrs) if (*cp == 0) return (cp = NULL); - for (pp = cp; isspace (*pp); pp++) + for (pp = cp; isspace(*pp); pp++) continue; if (*pp == 0) return (cp = NULL); @@ -451,7 +412,7 @@ getalias (char *addrs) *qp++ = 0; for (cp = qp, qp--; qp > pp; qp--) if (*qp != 0) { - if (isspace (*qp)) + if (isspace(*qp)) *qp = 0; else break; @@ -462,17 +423,17 @@ getalias (char *addrs) static void -add_aka (struct aka *ak, char *pp) +add_aka(struct aka *ak, char *pp) { - register struct adr *ad, *ld; + struct adr *ad, *ld; for (ad = ak->ak_addr, ld = NULL; ad; ld = ad, ad = ad->ad_next) - if (!strcmp (pp, ad->ad_text)) + if (strcmp(pp, ad->ad_text)==0) return; - ad = (struct adr *) mh_xmalloc (sizeof(*ad)); - ad->ad_text = getcpy (pp); - ad->ad_local = strchr(pp, '@') == NULL && strchr(pp, '!') == NULL; + ad = mh_xcalloc(1, sizeof(*ad)); + ad->ad_text = mh_xstrdup(pp); + ad->ad_local = strchr(pp, '@') == NULL; ad->ad_next = NULL; if (ak->ak_addr) ld->ad_next = ad; @@ -482,42 +443,34 @@ add_aka (struct aka *ak, char *pp) void -init_pw (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 */ - - setpwent (); + struct passwd *pw; + static int init = 0; - while ((pw = getpwent ())) - if (!hmalloc (pw)) - break; + if (!init) { + /* read the passwd database and build a list */ + setpwent(); + while ((pw = getpwent())) { + if (!hmalloc(pw)) { + break; + } + } + endpwent(); - endpwent (); -#ifdef DBMPWD + init++; /* now we're initialized */ } -#endif /* DBMPWD */ } static struct aka * -akalloc (char *id) +akalloc(char *id) { - register struct aka *p; + struct aka *p; - p = (struct aka *) mh_xmalloc (sizeof(*p)); + p = mh_xcalloc(1, sizeof(*p)); - p->ak_name = getcpy (id); + p->ak_name = mh_xstrdup(id); p->ak_visible = 0; p->ak_addr = NULL; p->ak_next = NULL; @@ -532,23 +485,24 @@ akalloc (char *id) static struct home * -hmalloc (struct passwd *pw) +hmalloc(struct passwd *pw) { - register struct home *p; + struct home *p; - p = (struct home *) mh_xmalloc (sizeof(*p)); + p = mh_xcalloc(1, sizeof(*p)); - p->h_name = getcpy (pw->pw_name); + p->h_name = mh_xstrdup(pw->pw_name); p->h_uid = pw->pw_uid; p->h_gid = pw->pw_gid; - p->h_home = getcpy (pw->pw_dir); - p->h_shell = getcpy (pw->pw_shell); + p->h_home = mh_xstrdup(pw->pw_dir); + p->h_shell = mh_xstrdup(pw->pw_shell); p->h_ngrps = 0; p->h_next = NULL; - if (hometail != NULL) - hometail->h_next = p; - if (homehead == NULL) + /* append to end */ + if (!homehead) homehead = p; + if (hometail) + hometail->h_next = p; hometail = p; return p; @@ -556,39 +510,32 @@ hmalloc (struct passwd *pw) struct home * -seek_home (char *name) +seek_home(char *name) { - register struct home *hp; -#ifdef DBMPWD + struct home *hp; 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)) + 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++) { + ** 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); + *c1 = tolower(*c); else *c1 = *c; } *c1 = '\0'; if ((pw = getpwnam(lname))) return(hmalloc(pw)); -#endif /* DBMPWD */ return NULL; }