Annotation of 43BSDReno/contrib/mh/uip/aliasbr.c, revision 1.1

1.1     ! root        1: /* aliasbr.c - new aliasing mechanism */
        !             2: 
        !             3: #include "../h/mh.h"
        !             4: #include "../h/aliasbr.h"
        !             5: #include <ctype.h>
        !             6: #include <grp.h>
        !             7: #include <pwd.h>
        !             8: #include <stdio.h>
        !             9: 
        !            10: 
        !            11: static int  akvis;
        !            12: static char *akerrst;
        !            13: 
        !            14: struct aka *akahead = NULL;
        !            15: struct aka *akatail = NULL;
        !            16: 
        !            17: struct home *homehead = NULL;
        !            18: struct home *hometail = NULL;
        !            19: 
        !            20: struct passwd  *getpwent ();
        !            21: struct group   *getgrnam (), *getgrgid ();
        !            22: 
        !            23: static char *akval(), *scanp(), *getp(), *seekp(), *getalias();
        !            24: static int aleq(), addfile(), addgroup(), addmember(), addall();
        !            25: static void add_aka();
        !            26: static struct aka *akalloc();
        !            27: static struct home *hmalloc();
        !            28: #ifndef        MMDFMTS
        !            29: struct home *seek_home();
        !            30: #endif
        !            31: 
        !            32: /*  */
        !            33: 
        !            34: char *
        !            35: akvalue(s)
        !            36:        register char *s;
        !            37: {
        !            38:     register char  *v;
        !            39: 
        !            40:     if (akahead == NULL)
        !            41:        (void) alias (AliasFile);
        !            42: 
        !            43:     akvis = -1;
        !            44:     v = akval (akahead, s);
        !            45:     if (akvis == -1)
        !            46:        akvis = 0;
        !            47:     return v;
        !            48: }
        !            49: 
        !            50: 
        !            51: int     akvisible () {
        !            52:     return akvis;
        !            53: }
        !            54: 
        !            55: /*  */
        !            56: 
        !            57: char *
        !            58: akresult(ak)
        !            59:        register struct aka *ak;
        !            60: {
        !            61:     register char  *cp = NULL,
        !            62:                    *dp,
        !            63:                    *pp;
        !            64:     register struct adr *ad;
        !            65: 
        !            66:     for (ad = ak -> ak_addr; ad; ad = ad -> ad_next) {
        !            67:        pp = ad -> ad_local ? akval (ak -> ak_next, ad -> ad_text)
        !            68:            : getcpy (ad -> ad_text);
        !            69: 
        !            70:        if (dp = cp) {
        !            71:            cp = concat (cp, ",", pp, NULLCP);
        !            72:            free (dp);
        !            73:            free (pp);
        !            74:        }
        !            75:        else
        !            76:            cp = pp;
        !            77:     }
        !            78: 
        !            79:     if (akvis == -1)
        !            80:        akvis = ak -> ak_visible;
        !            81:     return cp;
        !            82: }
        !            83: 
        !            84: 
        !            85: static char *
        !            86: akval(ak, s)
        !            87:        register struct aka *ak;
        !            88:        register char *s;
        !            89: {
        !            90:     for (; ak; ak = ak -> ak_next)
        !            91:        if (aleq (s, ak -> ak_name))
        !            92:            return akresult (ak);
        !            93: 
        !            94:     return getcpy (s);
        !            95: }
        !            96: 
        !            97: 
        !            98: static int
        !            99: aleq(string, aliasent)
        !           100:        register char *string, *aliasent;
        !           101: {
        !           102:     register char    c;
        !           103: 
        !           104:     while (c = *string++)
        !           105:        if (*aliasent == '*')
        !           106:            return 1;
        !           107:        else
        !           108:            if ((c | 040) != (*aliasent | 040))
        !           109:                return 0;
        !           110:            else
        !           111:                aliasent++;
        !           112: 
        !           113:     return (*aliasent == NULL || *aliasent == '*');
        !           114: }
        !           115: 
        !           116: /*  */
        !           117: 
        !           118: alias(file)
        !           119:        register char *file;
        !           120: {
        !           121:     int     i;
        !           122:     register char  *bp,
        !           123:                   *cp,
        !           124:                    *pp;
        !           125:     char    lc,
        !           126:           *ap;
        !           127:     register struct aka *ak = NULL;
        !           128:     register    FILE *fp;
        !           129: 
        !           130:     if (*file != '/'
        !           131:            && (strncmp (file, "./", 2) && strncmp (file, "../", 3)))
        !           132:        file = libpath (file);
        !           133:     if ((fp = fopen (file, "r")) == NULL) {
        !           134:        akerrst = file;
        !           135:        return AK_NOFILE;
        !           136:     }
        !           137: 
        !           138:     while (vfgets (fp, &ap) == OK) {
        !           139:        bp = ap;
        !           140:        switch (*(pp = scanp (bp))) {
        !           141:            case '<':           /* recurse a level */
        !           142:                if (!*(cp = getp (pp + 1))) {
        !           143:                    akerrst = "'<' without alias-file";
        !           144:                    (void) fclose (fp);
        !           145:                    return AK_ERROR;
        !           146:                }
        !           147:                if ((i = alias (cp) != AK_OK)) {
        !           148:                    (void) fclose (fp);
        !           149:                    return i;
        !           150:                }
        !           151: 
        !           152:            case ':':           /* comment */
        !           153:            case ';':
        !           154:            case NULL:
        !           155:                continue;
        !           156:        }
        !           157: 
        !           158:        akerrst = bp;
        !           159:        if (!*(cp = seekp (pp, &lc, &ap))) {
        !           160:            (void) fclose (fp);
        !           161:            return AK_ERROR;
        !           162:        }
        !           163:        if (!(ak = akalloc (cp))) {
        !           164:            (void) fclose (fp);
        !           165:            return AK_LIMIT;
        !           166:        }
        !           167:        switch (lc) {
        !           168:            case ':':
        !           169:                ak -> ak_visible = 0;
        !           170:                break;
        !           171: 
        !           172:            case ';':
        !           173:                ak -> ak_visible = 1;
        !           174:                break;
        !           175: 
        !           176:            default:
        !           177:                (void) fclose (fp);
        !           178:                return AK_ERROR;
        !           179:        }
        !           180: 
        !           181:        switch (*(pp = scanp (ap))) {
        !           182:            case NULL:          /* EOL */
        !           183:                (void) fclose (fp);
        !           184:                return AK_ERROR;
        !           185: 
        !           186:            case '<':           /* read values from file */
        !           187:                if (!*(cp = getp (pp + 1))) {
        !           188:                    (void) fclose (fp);
        !           189:                    return AK_ERROR;
        !           190:                }
        !           191:                if (!addfile (ak, cp)) {
        !           192:                    (void) fclose (fp);
        !           193:                    return AK_NOFILE;
        !           194:                }
        !           195:                break;
        !           196: 
        !           197:            case '=':           /* UNIX group */
        !           198:                if (!*(cp = getp (pp + 1))) {
        !           199:                    (void) fclose (fp);
        !           200:                    return AK_ERROR;
        !           201:                }
        !           202:                if (!addgroup (ak, cp)) {
        !           203:                    (void) fclose (fp);
        !           204:                    return AK_NOGROUP;
        !           205:                }
        !           206:                break;
        !           207: 
        !           208:            case '+':           /* UNIX group members */
        !           209:                if (!*(cp = getp (pp + 1))) {
        !           210:                    (void) fclose (fp);
        !           211:                    return AK_ERROR;
        !           212:                }
        !           213:                if (!addmember (ak, cp)) {
        !           214:                    (void) fclose (fp);
        !           215:                    return AK_NOGROUP;
        !           216:                }
        !           217:                break;
        !           218: 
        !           219:            case '*':           /* Everyone */
        !           220:                (void) addall (ak);
        !           221:                break;
        !           222: 
        !           223:            default:            /* list */
        !           224:                while (cp = getalias (pp))
        !           225:                    add_aka (ak, cp);
        !           226:                break;
        !           227:        }
        !           228:     }
        !           229: 
        !           230:     (void) fclose (fp);
        !           231:     return AK_OK;
        !           232: }
        !           233: 
        !           234: /*  */
        !           235: 
        !           236: char *
        !           237: akerror(i)
        !           238:        int i;
        !           239: {
        !           240:     static char buffer[BUFSIZ];
        !           241: 
        !           242:     switch (i) {
        !           243:        case AK_NOFILE:
        !           244:            (void) sprintf (buffer, "unable to read '%s'", akerrst);
        !           245:            break;
        !           246: 
        !           247:        case AK_ERROR:
        !           248:            (void) sprintf (buffer, "error in line '%s'", akerrst);
        !           249:            break;
        !           250: 
        !           251:        case AK_LIMIT:
        !           252:            (void) sprintf (buffer, "out of memory while on '%s'", akerrst);
        !           253:            break;
        !           254: 
        !           255:        case AK_NOGROUP:
        !           256:            (void) sprintf (buffer, "no such group as '%s'", akerrst);
        !           257:            break;
        !           258: 
        !           259:        default:
        !           260:            (void) sprintf (buffer, "unknown error (%d)", i);
        !           261:            break;
        !           262:     }
        !           263: 
        !           264:     return buffer;
        !           265: }
        !           266: 
        !           267: /*  */
        !           268: 
        !           269: static char *
        !           270: scanp(p)
        !           271:        register char *p;
        !           272: {
        !           273:     while (isspace (*p))
        !           274:        p++;
        !           275:     return p;
        !           276: }
        !           277: 
        !           278: 
        !           279: static char *
        !           280: getp(p)
        !           281:        register char *p;
        !           282: {
        !           283:     register char  *cp = scanp (p);
        !           284: 
        !           285:     p = cp;
        !           286:     while (!isspace (*cp) && *cp)
        !           287:        cp++;
        !           288:     *cp = NULL;
        !           289: 
        !           290:     return p;
        !           291: }
        !           292: 
        !           293: 
        !           294: static char *
        !           295: seekp(p, c, a)
        !           296:        register char *p, *c, **a;
        !           297: {
        !           298:     register char  *cp = scanp (p);
        !           299: 
        !           300:     p = cp;
        !           301:     while (!isspace (*cp) && *cp && *cp != ':' && *cp != ';')
        !           302:        cp++;
        !           303:     *c = *cp;
        !           304:     *cp++ = NULL;
        !           305:     *a = cp;
        !           306: 
        !           307:     return p;
        !           308: }
        !           309: 
        !           310: /*  */
        !           311: 
        !           312: static int
        !           313: addfile(ak, file)
        !           314:        register struct aka *ak;
        !           315:        register char *file;
        !           316: {
        !           317:     register char  *cp;
        !           318:     char    buffer[BUFSIZ];
        !           319:     register    FILE *fp;
        !           320: 
        !           321:     if ((fp = fopen (libpath (file), "r")) == NULL) {
        !           322:        akerrst = file;
        !           323:        return NULL;
        !           324:     }
        !           325: 
        !           326:     while (fgets (buffer, sizeof buffer, fp) != NULL)
        !           327:        while (cp = getalias (buffer))
        !           328:            add_aka (ak, cp);
        !           329: 
        !           330:     (void) fclose (fp);
        !           331:     return 1;
        !           332: }
        !           333: 
        !           334: /*  */
        !           335: 
        !           336: static int
        !           337: addgroup(ak, grp)
        !           338:        register struct aka *ak;
        !           339:        register char *grp;
        !           340: {
        !           341:     register char  *gp;
        !           342:     register struct group  *gr = getgrnam (grp);
        !           343:     register struct home   *hm = NULL;
        !           344: 
        !           345:     if (!gr)
        !           346:        gr = getgrgid (atoi (grp));
        !           347:     if (!gr) {
        !           348:        akerrst = grp;
        !           349:        return NULL;
        !           350:     }
        !           351: 
        !           352:     if (homehead == NULL)
        !           353:        init_pw ();
        !           354: 
        !           355:     while (gp = *gr -> gr_mem++)
        !           356:        for (hm = homehead; hm; hm = hm -> h_next)
        !           357:            if (!strcmp (hm -> h_name, gp)) {
        !           358:                add_aka (ak, hm -> h_name);
        !           359:                break;
        !           360:            }
        !           361: 
        !           362:     return 1;
        !           363: }
        !           364: 
        !           365: /*  */
        !           366: 
        !           367: static int
        !           368: addmember(ak, grp)
        !           369:        register struct aka *ak;
        !           370:        register char *grp;
        !           371: {
        !           372:     int     gid;
        !           373:     register struct group  *gr = getgrnam (grp);
        !           374:     register struct home   *hm = NULL;
        !           375: 
        !           376:     if (gr)
        !           377:        gid = gr -> gr_gid;
        !           378:     else {
        !           379:        gid = atoi (grp);
        !           380:        gr = getgrgid (gid);
        !           381:     }
        !           382:     if (!gr) {
        !           383:        akerrst = grp;
        !           384:        return NULL;
        !           385:     }
        !           386: 
        !           387:     if (homehead == NULL)
        !           388:        init_pw ();
        !           389: 
        !           390:     for (hm = homehead; hm; hm = hm -> h_next)
        !           391:        if (hm -> h_gid == gid)
        !           392:            add_aka (ak, hm -> h_name);
        !           393: 
        !           394:     return 1;
        !           395: }
        !           396: 
        !           397: /*  */
        !           398: 
        !           399: static int
        !           400: addall(ak)
        !           401:        register struct aka *ak;
        !           402: {
        !           403:     int     noshell = NoShell == NULLCP || *NoShell == NULL;
        !           404:     register struct home   *hm;
        !           405: 
        !           406:     if (homehead == NULL)
        !           407:        init_pw ();
        !           408:     if (Everyone < 0)
        !           409:        Everyone = EVERYONE;
        !           410: 
        !           411:     for (hm = homehead; hm; hm = hm -> h_next)
        !           412:        if (hm -> h_uid > Everyone
        !           413:                && (noshell || strcmp (hm -> h_shell, NoShell)))
        !           414:            add_aka (ak, hm -> h_name);
        !           415: 
        !           416:     return homehead != NULL;
        !           417: }
        !           418: 
        !           419: /*  */
        !           420: 
        !           421: static char *
        !           422: getalias(addrs)
        !           423:        register char *addrs;
        !           424: {
        !           425:     register char  *pp,
        !           426:                    *qp;
        !           427:     static char *cp = NULL;
        !           428: 
        !           429:     if (cp == NULL)
        !           430:        cp = addrs;
        !           431:     else
        !           432:        if (*cp == NULL)
        !           433:            return (cp = NULL);
        !           434: 
        !           435:     for (pp = cp; isspace (*pp); pp++)
        !           436:        continue;
        !           437:     if (*pp == NULL)
        !           438:        return (cp = NULL);
        !           439:     for (qp = pp; *qp != NULL && *qp != ','; qp++)
        !           440:        continue;
        !           441:     if (*qp == ',')
        !           442:        *qp++ = NULL;
        !           443:     for (cp = qp, qp--; qp > pp; qp--)
        !           444:        if (*qp != NULL)
        !           445:            if (isspace (*qp))
        !           446:                *qp = NULL;
        !           447:            else
        !           448:                break;
        !           449: 
        !           450:     return pp;
        !           451: }
        !           452: 
        !           453: /*  */
        !           454: 
        !           455: static void
        !           456: add_aka(ak, pp)
        !           457:        register struct aka *ak;
        !           458:        register char *pp;
        !           459: {
        !           460:     register struct adr *ad,
        !           461:                        *ld;
        !           462: 
        !           463:     for (ad = ak -> ak_addr, ld = NULL; ad; ld = ad, ad = ad -> ad_next)
        !           464:        if (!strcmp (pp, ad -> ad_text))
        !           465:            return;
        !           466: 
        !           467:     ad = (struct adr   *) malloc (sizeof *ad);
        !           468:     if (ad == NULL)
        !           469:        return;
        !           470:     ad -> ad_text = getcpy (pp);
        !           471:     ad -> ad_local = index (pp, '@') == NULL && index (pp, '!') == NULL;
        !           472:     ad -> ad_next = NULL;
        !           473:     if (ak -> ak_addr)
        !           474:        ld -> ad_next = ad;
        !           475:     else
        !           476:        ak -> ak_addr = ad;
        !           477: }
        !           478: 
        !           479: 
        !           480: init_pw()
        !           481: {
        !           482:     register struct passwd  *pw;
        !           483: 
        !           484:     (void) setpwent ();
        !           485: 
        !           486:     while (pw = getpwent ())
        !           487:        if (!hmalloc (pw))
        !           488:            break;
        !           489: 
        !           490:     (void) endpwent ();
        !           491: }
        !           492: 
        !           493: /*  */
        !           494: 
        !           495: static struct aka *
        !           496: akalloc(id)
        !           497:        register char *id;
        !           498: {
        !           499:     register struct aka *p = (struct aka   *) malloc (sizeof *p);
        !           500: 
        !           501:     if (!p)
        !           502:        return NULL;
        !           503: 
        !           504:     p -> ak_name = getcpy (id);
        !           505:     p -> ak_visible = 0;
        !           506:     p -> ak_addr = NULL;
        !           507:     p -> ak_next = NULL;
        !           508:     if (akatail != NULL)
        !           509:        akatail -> ak_next = p;
        !           510:     if (akahead == NULL)
        !           511:        akahead = p;
        !           512:     akatail = p;
        !           513: 
        !           514:     return p;
        !           515: }
        !           516: 
        !           517: 
        !           518: static struct home *
        !           519: hmalloc(pw)
        !           520:        struct passwd *pw;
        !           521: {
        !           522:     register struct home   *p = (struct home   *) malloc (sizeof *p);
        !           523: 
        !           524:     if (!p)
        !           525:        return NULL;
        !           526: 
        !           527:     p -> h_name = getcpy (pw -> pw_name);
        !           528:     p -> h_uid = pw -> pw_uid;
        !           529:     p -> h_gid = pw -> pw_gid;
        !           530:     p -> h_home = getcpy (pw -> pw_dir);
        !           531:     p -> h_shell = getcpy (pw -> pw_shell);
        !           532: #ifdef BSD42
        !           533:     p -> h_ngrps = 0;
        !           534: #endif BSD42
        !           535:     p -> h_next = NULL;
        !           536:     if (hometail != NULL)
        !           537:        hometail -> h_next = p;
        !           538:     if (homehead == NULL)
        !           539:        homehead = p;
        !           540:     hometail = p;
        !           541: 
        !           542:     return p;
        !           543: }
        !           544: 
        !           545: /*  */
        !           546: 
        !           547: #ifndef        MMDFMTS
        !           548: struct home *
        !           549: seek_home(name)
        !           550:        register char *name;
        !           551: {
        !           552:     register struct home *hp;
        !           553: 
        !           554:     if (homehead == NULL)
        !           555:        init_pw ();
        !           556: 
        !           557:     for (hp = homehead; hp; hp = hp -> h_next)
        !           558:        if (uleq (name, hp -> h_name))
        !           559:            return hp;
        !           560: 
        !           561:     return NULL;
        !           562: }
        !           563: #endif MMDFMTS

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.