X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Faliasbr.c;h=752cda702202c3faa380a8d844408e2a8a03c22a;hp=b1a7e619cd0e0a2c9be06d49e6a2d7e4fc9a75fd;hb=a485ed478abbd599d8c9aab48934e7a26733ecb1;hpb=f480c03187724e54e5391ee61b810827da319a6c diff --git a/uip/aliasbr.c b/uip/aliasbr.c index b1a7e61..752cda7 100644 --- a/uip/aliasbr.c +++ b/uip/aliasbr.c @@ -1,4 +1,3 @@ - /* * aliasbr.c -- new aliasing mechanism * @@ -25,7 +24,7 @@ struct home *hometail = NULL; /* * prototypes */ -int alias (char *); +int alias (char *); int akvisible (void); void init_pw (void); char *akresult (struct aka *); @@ -52,462 +51,461 @@ struct home *seek_home (char *); char * akvalue (char *s) { - register char *v; + register char *v; - if (akahead == NULL) - alias (AliasFile); + if (akahead == NULL) + alias (AliasFile); - akvis = -1; - v = akval (akahead, s); - if (akvis == -1) - akvis = 0; - return v; + akvis = -1; + v = akval (akahead, s); + if (akvis == -1) + akvis = 0; + return v; } int akvisible (void) { - return akvis; + return akvis; } char * akresult (struct aka *ak) { - register char *cp = NULL, *dp, *pp; - register 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); - - if (cp) { - dp = cp; - cp = concat (cp, ",", pp, NULL); - free (dp); - free (pp); + register char *cp = NULL, *dp, *pp; + register 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); + + if (cp) { + dp = cp; + cp = concat (cp, ",", pp, NULL); + free (dp); + free (pp); + } else + cp = pp; } - else - cp = pp; - } - if (akvis == -1) - akvis = ak->ak_visible; - return cp; + if (akvis == -1) + akvis = ak->ak_visible; + return cp; } -static char * +static char * akval (struct aka *ak, char *s) { - if (!s) - return s; /* XXX */ + if (!s) + return s; /* XXX */ - for (; ak; ak = ak->ak_next) - if (aleq (s, ak->ak_name)) - return akresult (ak); + for (; ak; ak = ak->ak_next) + if (aleq (s, ak->ak_name)) + return akresult (ak); - return getcpy (s); + return getcpy (s); } static int aleq (char *string, char *aliasent) { - register char c; - - while ((c = *string++)) - if (*aliasent == '*') - return 1; - else - if ((c | 040) != (*aliasent | 040)) - return 0; - else - aliasent++; - - return (*aliasent == 0 || *aliasent == '*'); + register char c; + + while ((c = *string++)) + if (*aliasent == '*') + return 1; + else + if ((c | 040) != (*aliasent | 040)) + return 0; + else + aliasent++; + + return (*aliasent == 0 || *aliasent == '*'); } int alias (char *file) { - int i; - register char *bp, *cp, *pp; - char lc, *ap; - register struct aka *ak = NULL; - register FILE *fp; - - if (*file != '/' - && (strncmp (file, "./", 2) && strncmp (file, "../", 3))) - file = etcpath (file); - if ((fp = fopen (file, "r")) == NULL) { - akerrst = file; - return AK_NOFILE; - } - - 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; - } - - akerrst = bp; - if (!*(cp = seekp (pp, &lc, &ap))) { - fclose (fp); - return AK_ERROR; - } - if (!(ak = akalloc (cp))) { - fclose (fp); - return AK_LIMIT; - } - switch (lc) { - case ':': - ak->ak_visible = 0; - break; - - case ';': - ak->ak_visible = 1; - break; - - default: - fclose (fp); - return AK_ERROR; + int i; + register char *bp, *cp, *pp; + char lc, *ap; + register struct aka *ak = NULL; + register FILE *fp; + + if (*file != '/' + && (strncmp (file, "./", 2) && strncmp (file, "../", 3))) + file = etcpath (file); + if ((fp = fopen (file, "r")) == NULL) { + akerrst = file; + return AK_NOFILE; } - 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; + 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; } - break; - case '=': /* UNIX group */ - if (!*(cp = getp (pp + 1))) { - fclose (fp); - return AK_ERROR; + akerrst = bp; + if (!*(cp = seekp (pp, &lc, &ap))) { + fclose (fp); + return AK_ERROR; } - if (!addgroup (ak, cp)) { - fclose (fp); - return AK_NOGROUP; + if (!(ak = akalloc (cp))) { + fclose (fp); + return AK_LIMIT; } - break; - - case '+': /* UNIX group members */ - if (!*(cp = getp (pp + 1))) { - fclose (fp); - return AK_ERROR; - } - if (!addmember (ak, cp)) { - fclose (fp); - return AK_NOGROUP; + switch (lc) { + case ':': + ak->ak_visible = 0; + break; + + case ';': + ak->ak_visible = 1; + break; + + default: + fclose (fp); + return AK_ERROR; } - break; - - case '*': /* Everyone */ - addall (ak); - break; - default: /* list */ - while ((cp = getalias (pp))) - add_aka (ak, cp); - break; + 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; + + case '=': /* UNIX group */ + if (!*(cp = getp (pp + 1))) { + fclose (fp); + return AK_ERROR; + } + if (!addgroup (ak, cp)) { + fclose (fp); + return AK_NOGROUP; + } + 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 '*': /* Everyone */ + addall (ak); + break; + + default: /* list */ + while ((cp = getalias (pp))) + add_aka (ak, cp); + break; + } } - } - fclose (fp); - return AK_OK; + fclose (fp); + return AK_OK; } char * akerror (int i) { - static char buffer[BUFSIZ]; + static char buffer[BUFSIZ]; - switch (i) { - case AK_NOFILE: - snprintf (buffer, sizeof(buffer), "unable to read '%s'", akerrst); - break; + 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_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_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; + case AK_NOGROUP: + snprintf (buffer, sizeof(buffer), "no such group as '%s'", akerrst); + break; - default: - snprintf (buffer, sizeof(buffer), "unknown error (%d)", i); - break; - } + default: + snprintf (buffer, sizeof(buffer), "unknown error (%d)", i); + break; + } - return buffer; + return buffer; } static char * scanp (unsigned char *p) { - while (isspace (*p)) - p++; - return p; + while (isspace (*p)) + p++; + return p; } static char * getp (char *p) { - register unsigned char *cp = scanp (p); + register unsigned char *cp = scanp (p); - p = cp; - while (!isspace (*cp) && *cp) - cp++; - *cp = 0; + p = cp; + while (!isspace (*cp) && *cp) + cp++; + *cp = 0; - return p; + return p; } static char * seekp (char *p, char *c, char **a) { - register unsigned char *cp; + register unsigned char *cp; - p = cp = scanp (p); - while (!isspace (*cp) && *cp && *cp != ':' && *cp != ';') - cp++; - *c = *cp; - *cp++ = 0; - *a = cp; + p = cp = scanp (p); + while (!isspace (*cp) && *cp && *cp != ':' && *cp != ';') + cp++; + *c = *cp; + *cp++ = 0; + *a = cp; - return p; + return p; } static int addfile (struct aka *ak, char *file) { - register char *cp; - char buffer[BUFSIZ]; - register FILE *fp; + register char *cp; + char buffer[BUFSIZ]; + register FILE *fp; - if (!(fp = fopen (etcpath (file), "r"))) { - akerrst = file; - return 0; - } + 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); - return 1; + fclose (fp); + return 1; } static int addgroup (struct aka *ak, char *grp) { - register char *gp; - register struct group *gr = getgrnam (grp); - register struct home *hm = NULL; - - if (!gr) - gr = getgrgid (atoi (grp)); - if (!gr) { - akerrst = grp; - return 0; - } + register char *gp; + register struct group *gr = getgrnam (grp); + register struct home *hm = NULL; + + if (!gr) + gr = getgrgid (atoi (grp)); + if (!gr) { + akerrst = grp; + return 0; + } #ifndef DBMPWD - if (homehead == NULL) - init_pw (); + if (homehead == NULL) + init_pw (); #endif /* DBMPWD */ - while ((gp = *gr->gr_mem++)) + while ((gp = *gr->gr_mem++)) #ifdef DBMPWD - { - struct passwd *pw; + { + 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; - } + 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); + if ((pw = getpwnam(gp))) + { + hmalloc(pw); + add_aka (ak, gp); + } } - } #endif /* DBMPWD */ - return 1; + return 1; } static int addmember (struct aka *ak, char *grp) { - gid_t gid; - register struct group *gr = getgrnam (grp); - register struct home *hm = NULL; - - if (gr) - gid = gr->gr_gid; - else { - gid = atoi (grp); - gr = getgrgid (gid); - } - if (!gr) { - akerrst = grp; - return 0; - } + gid_t gid; + register struct group *gr = getgrnam (grp); + register struct home *hm = NULL; + + if (gr) + gid = gr->gr_gid; + else { + gid = atoi (grp); + gr = getgrgid (gid); + } + if (!gr) { + akerrst = grp; + return 0; + } #ifndef DBMPWD - if (homehead == NULL) + 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); + for (hm = homehead; hm; hm = hm->h_next) + if (hm->h_gid == gid) + add_aka (ak, hm->h_name); - return 1; + return 1; } static int addall (struct aka *ak) { - int noshell = NoShell == NULL || *NoShell == 0; - register struct home *hm; + int noshell = NoShell == NULL || *NoShell == 0; + register struct home *hm; #ifndef DBMPWD - if (homehead == NULL) + if (homehead == NULL) #endif /* DBMPWD */ - init_pw (); - if (Everyone < 0) - Everyone = EVERYONE; + 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); + 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; + return homehead != NULL; } static char * getalias (char *addrs) { - register unsigned char *pp, *qp; - static char *cp = NULL; - - if (cp == NULL) - cp = addrs; - else - if (*cp == 0) - return (cp = NULL); - - for (pp = cp; isspace (*pp); pp++) - continue; - if (*pp == 0) - return (cp = NULL); - for (qp = pp; *qp != 0 && *qp != ','; qp++) - continue; - if (*qp == ',') - *qp++ = 0; - for (cp = qp, qp--; qp > pp; qp--) - if (*qp != 0) { - if (isspace (*qp)) - *qp = 0; - else - break; - } + register unsigned char *pp, *qp; + static char *cp = NULL; + + if (cp == NULL) + cp = addrs; + else + if (*cp == 0) + return (cp = NULL); - return pp; + for (pp = cp; isspace (*pp); pp++) + continue; + if (*pp == 0) + return (cp = NULL); + for (qp = pp; *qp != 0 && *qp != ','; qp++) + continue; + if (*qp == ',') + *qp++ = 0; + for (cp = qp, qp--; qp > pp; qp--) + if (*qp != 0) { + if (isspace (*qp)) + *qp = 0; + else + break; + } + + return pp; } static void add_aka (struct aka *ak, char *pp) { - register struct adr *ad, *ld; - - for (ad = ak->ak_addr, ld = NULL; ad; ld = ad, ad = ad->ad_next) - if (!strcmp (pp, ad->ad_text)) - return; - - ad = (struct adr *) mh_xmalloc (sizeof(*ad)); - ad->ad_text = getcpy (pp); - ad->ad_local = strchr(pp, '@') == NULL && strchr(pp, '!') == NULL; - ad->ad_next = NULL; - if (ak->ak_addr) - ld->ad_next = ad; - else - ak->ak_addr = ad; + register struct adr *ad, *ld; + + for (ad = ak->ak_addr, ld = NULL; ad; ld = ad, ad = ad->ad_next) + if (!strcmp (pp, ad->ad_text)) + return; + + ad = (struct adr *) mh_xmalloc (sizeof(*ad)); + ad->ad_text = getcpy (pp); + ad->ad_local = strchr(pp, '@') == NULL && strchr(pp, '!') == NULL; + ad->ad_next = NULL; + if (ak->ak_addr) + ld->ad_next = ad; + else + ak->ak_addr = ad; } void init_pw (void) { - register struct passwd *pw; + 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++; + 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 (); + setpwent (); - while ((pw = getpwent ())) - if (!hmalloc (pw)) - break; + while ((pw = getpwent ())) + if (!hmalloc (pw)) + break; - endpwent (); + endpwent (); #ifdef DBMPWD - } + } #endif /* DBMPWD */ } @@ -515,82 +513,82 @@ init_pw (void) static struct aka * akalloc (char *id) { - register struct aka *p; + register struct aka *p; - p = (struct aka *) mh_xmalloc (sizeof(*p)); + p = (struct aka *) mh_xmalloc (sizeof(*p)); - p->ak_name = getcpy (id); - p->ak_visible = 0; - p->ak_addr = NULL; - p->ak_next = NULL; - if (akatail != NULL) - akatail->ak_next = p; - if (akahead == NULL) - akahead = p; - akatail = p; + p->ak_name = getcpy (id); + p->ak_visible = 0; + p->ak_addr = NULL; + p->ak_next = NULL; + if (akatail != NULL) + akatail->ak_next = p; + if (akahead == NULL) + akahead = p; + akatail = p; - return p; + return p; } static struct home * hmalloc (struct passwd *pw) { - register struct home *p; - - p = (struct home *) mh_xmalloc (sizeof(*p)); - - p->h_name = getcpy (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_ngrps = 0; - p->h_next = NULL; - if (hometail != NULL) - hometail->h_next = p; - if (homehead == NULL) - homehead = p; - hometail = p; - - return p; + register struct home *p; + + p = (struct home *) mh_xmalloc (sizeof(*p)); + + p->h_name = getcpy (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_ngrps = 0; + p->h_next = NULL; + if (hometail != NULL) + hometail->h_next = p; + if (homehead == NULL) + homehead = p; + hometail = p; + + return p; } struct home * seek_home (char *name) { - register struct home *hp; + register struct home *hp; #ifdef DBMPWD - struct passwd *pw; - char lname[32]; - unsigned char *c; - char *c1; + struct passwd *pw; + char lname[32]; + unsigned char *c; + char *c1; #else /* DBMPWD */ - if (homehead == NULL) - init_pw (); + if (homehead == NULL) + init_pw (); #endif /* DBMPWD */ - for (hp = homehead; hp; hp = hp->h_next) - if (!mh_strcasecmp (name, hp->h_name)) - return hp; + 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++) { - if (isalpha(*c) && isupper(*c)) - *c1 = tolower (*c); - else - *c1 = *c; - } - *c1 = '\0'; - if ((pw = getpwnam(lname))) - return(hmalloc(pw)); + /* + * 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++) { + if (isalpha(*c) && isupper(*c)) + *c1 = tolower (*c); + else + *c1 = *c; + } + *c1 = '\0'; + if ((pw = getpwnam(lname))) + return(hmalloc(pw)); #endif /* DBMPWD */ - - return NULL; + + return NULL; }