#include <h/utils.h>
#include <grp.h>
#include <pwd.h>
+#include <ctype.h>
static int akvis;
static char *akerrst;
/*
** 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 *);
+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;
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;
}
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;
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;
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;
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);
+ 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)
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);
*qp++ = 0;
for (cp = qp, qp--; qp > pp; qp--)
if (*qp != 0) {
- if (isspace (*qp))
+ if (isspace(*qp))
*qp = 0;
else
break;
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;
void
-init_pw (void)
+init_pw(void)
{
- register struct passwd *pw;
-#ifdef DBMPWD
- static int init;
+ struct passwd *pw;
+ static int init = 0;
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 ();
-
- while ((pw = getpwent ()))
- if (!hmalloc (pw))
+ /* 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;
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;
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);
+ 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;
}