Annotation of 43BSDReno/contrib/mh/uip/aliasbr.c, revision 1.1.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.