Fix uip/whom.c for C89 compatibility
[mmh] / uip / aliasbr.c
index 752cda7..b00f51b 100644 (file)
@@ -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 <h/mh.h>
 #include <h/aliasbr.h>
 #include <h/utils.h>
 #include <grp.h>
 #include <pwd.h>
+#include <ctype.h>
 
 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;
 }