Annotation of 42BSD/bin/ls.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)ls.c        4.20 (Berkeley) 9/22/83";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * ls
        !             7:  *
        !             8:  * 4.2bsd version for symbolic links, variable length
        !             9:  * directory entries, block size in the inode, etc.
        !            10:  */
        !            11: #include <sys/param.h>
        !            12: #include <sys/stat.h>
        !            13: #include <sys/dir.h>
        !            14: #include <stdio.h>
        !            15: #include <sgtty.h>
        !            16: 
        !            17: #define        kbytes(size)    (((size) + 1023) / 1024)
        !            18: 
        !            19: struct afile {
        !            20:        char    ftype;          /* file type, e.g. 'd', 'c', 'f' */
        !            21:        ino_t   fnum;           /* inode number of file */
        !            22:        short   fflags;         /* mode&~S_IFMT, perhaps ISARG */
        !            23:        short   fnl;            /* number of links */
        !            24:        short   fuid;           /* owner id */
        !            25:        short   fgid;           /* group id */
        !            26:        long    fsize;          /* file size */
        !            27:        long    fblks;          /* number of blocks used */
        !            28:        time_t  fmtime;         /* time (modify or access or create) */
        !            29:        char    *fname;         /* file name */
        !            30:        char    *flinkto;       /* symbolic link value */
        !            31: };
        !            32: 
        !            33: #define ISARG  0x8000          /* extra ``mode'' */
        !            34: 
        !            35: struct subdirs {
        !            36:        char    *sd_name;
        !            37:        struct  subdirs *sd_next;
        !            38: } *subdirs;
        !            39: 
        !            40: int    aflg, dflg, gflg, lflg, sflg, tflg, uflg, iflg, fflg, cflg, rflg = 1;
        !            41: int    qflg, Aflg, Cflg, Fflg, Lflg, Rflg;
        !            42: 
        !            43: int    usetabs;
        !            44: 
        !            45: time_t now, sixmonthsago;
        !            46: 
        !            47: char   *dotp = ".";
        !            48: 
        !            49: struct afile *gstat();
        !            50: int    fcmp();
        !            51: char   *cat(), *savestr();
        !            52: char   *fmtentry();
        !            53: char   *getname(), *getgroup();
        !            54: 
        !            55: char   *ctime();
        !            56: char   *malloc(), *calloc(), *realloc();
        !            57: char   *sprintf(), *strcpy(), *strcat();
        !            58: 
        !            59: main(argc, argv)
        !            60:        int argc;
        !            61:        char *argv[];
        !            62: {
        !            63:        int i;
        !            64:        struct afile *fp0, *fplast;
        !            65:        register struct afile *fp;
        !            66:        struct sgttyb sgbuf;
        !            67: 
        !            68:        argc--, argv++;
        !            69:        if (getuid() == 0)
        !            70:                Aflg++;
        !            71:        (void) time(&now); sixmonthsago = now - 6L*30L*24L*60L*60L; now += 60;
        !            72:        if (isatty(1)) {
        !            73:                qflg = Cflg = 1;
        !            74:                (void) gtty(1, &sgbuf);
        !            75:                if ((sgbuf.sg_flags & XTABS) == 0)
        !            76:                        usetabs = 1;
        !            77:        } else
        !            78:                usetabs = 1;
        !            79:        while (argc > 0 && **argv == '-') {
        !            80:                (*argv)++;
        !            81:                while (**argv) switch (*(*argv)++) {
        !            82: 
        !            83:                case 'C':
        !            84:                        Cflg = 1; break;
        !            85:                case 'q':
        !            86:                        qflg = 1; break;
        !            87:                case '1':
        !            88:                        Cflg = 0; break;
        !            89:                case 'a':
        !            90:                        aflg++; break;
        !            91:                case 'A':
        !            92:                        Aflg++; break;
        !            93:                case 'c':
        !            94:                        cflg++; break;
        !            95:                case 's':
        !            96:                        sflg++; break;
        !            97:                case 'd':
        !            98:                        dflg++; break;
        !            99:                case 'g':
        !           100:                        gflg++; break;
        !           101:                case 'l':
        !           102:                        lflg++; break;
        !           103:                case 'r':
        !           104:                        rflg = -1; break;
        !           105:                case 't':
        !           106:                        tflg++; break;
        !           107:                case 'u':
        !           108:                        uflg++; break;
        !           109:                case 'i':
        !           110:                        iflg++; break;
        !           111:                case 'f':
        !           112:                        fflg++; break;
        !           113:                case 'L':
        !           114:                        Lflg++; break;
        !           115:                case 'F':
        !           116:                        Fflg++; break;
        !           117:                case 'R':
        !           118:                        Rflg++; break;
        !           119:                }
        !           120:                argc--, argv++;
        !           121:        }
        !           122:        if (fflg) { 
        !           123:                aflg++; lflg = 0; sflg = 0; tflg = 0;
        !           124:        }
        !           125:        if (lflg)
        !           126:                Cflg = 0;
        !           127:        if (argc == 0) {
        !           128:                argc++;
        !           129:                argv = &dotp;
        !           130:        }
        !           131:        fp = (struct afile *)calloc(argc, sizeof (struct afile));
        !           132:        if (fp == 0) {
        !           133:                fprintf(stderr, "ls: out of memory\n");
        !           134:                exit(1);
        !           135:        }
        !           136:        fp0 = fp;
        !           137:        for (i = 0; i < argc; i++) {
        !           138:                if (gstat(fp, *argv, 1, (int *)0)) {
        !           139:                        fp->fname = *argv;
        !           140:                        fp->fflags |= ISARG;
        !           141:                        fp++;
        !           142:                }
        !           143:                argv++;
        !           144:        }
        !           145:        fplast = fp;
        !           146:        qsort(fp0, fplast - fp0, sizeof (struct afile), fcmp);
        !           147:        if (dflg) {
        !           148:                formatf(fp0, fplast);
        !           149:                exit(0);
        !           150:        }
        !           151:        if (fflg)
        !           152:                fp = fp0;
        !           153:        else {
        !           154:                for (fp = fp0; fp < fplast && fp->ftype != 'd'; fp++)
        !           155:                        continue;
        !           156:                formatf(fp0, fp);
        !           157:        }
        !           158:        if (fp < fplast) {
        !           159:                if (fp > fp0)
        !           160:                        printf("\n");
        !           161:                for (;;) {
        !           162:                        formatd(fp->fname, argc > 1);
        !           163:                        while (subdirs) {
        !           164:                                struct subdirs *t;
        !           165: 
        !           166:                                t = subdirs; subdirs = t->sd_next;
        !           167:                                printf("\n");
        !           168:                                formatd(t->sd_name, 1);
        !           169:                                cfree(t->sd_name);
        !           170:                                cfree((char *)t);
        !           171:                        }
        !           172:                        if (++fp == fplast)
        !           173:                                break;
        !           174:                        printf("\n");
        !           175:                }
        !           176:        }
        !           177:        exit(0);
        !           178: }
        !           179: 
        !           180: formatd(name, title)
        !           181:        char *name;
        !           182:        int title;
        !           183: {
        !           184:        register struct afile *fp;
        !           185:        register struct subdirs *dp;
        !           186:        struct afile *dfp0, *dfplast;
        !           187:        int nkb;
        !           188: 
        !           189:        nkb = getdir(name, &dfp0, &dfplast);
        !           190:        if (dfp0 == 0)
        !           191:                return;
        !           192:        if (fflg == 0)
        !           193:                qsort(dfp0, dfplast - dfp0, sizeof (struct afile), fcmp);
        !           194:        if (title)
        !           195:                printf("%s:\n", name);
        !           196:        if (lflg || sflg)
        !           197:                printf("total %ld\n", nkb);
        !           198:        formatf(dfp0, dfplast);
        !           199:        if (Rflg)
        !           200:                for (fp = dfplast; fp >= dfp0; fp--) {
        !           201:                        if (fp->ftype != 'd' ||
        !           202:                            !strcmp(fp->fname, ".") ||
        !           203:                            !strcmp(fp->fname, ".."))
        !           204:                                continue;
        !           205:                        dp = (struct subdirs *)malloc(sizeof (struct subdirs));
        !           206:                        dp->sd_name = savestr(cat(name, fp->fname));
        !           207:                        dp->sd_next = subdirs; subdirs = dp;
        !           208:                }
        !           209:        for (fp = dfp0; fp < dfplast; fp++) {
        !           210:                if ((fp->fflags&ISARG) == 0 && fp->fname)
        !           211:                        cfree(fp->fname);
        !           212:                if (fp->flinkto)
        !           213:                        cfree(fp->flinkto);
        !           214:        }
        !           215:        cfree((char *)dfp0);
        !           216: }
        !           217: 
        !           218: getdir(dir, pfp0, pfplast)
        !           219:        char *dir;
        !           220:        struct afile **pfp0, **pfplast;
        !           221: {
        !           222:        register struct afile *fp;
        !           223:        DIR *dirp;
        !           224:        register struct direct *dp;
        !           225:        int nb, nent = 20;
        !           226: 
        !           227:        dirp = opendir(dir);
        !           228:        if (dirp == NULL) {
        !           229:                *pfp0 = *pfplast = NULL;
        !           230:                printf("%s unreadable\n", dir);         /* not stderr! */
        !           231:                return (0);
        !           232:        }
        !           233:        fp = *pfp0 = (struct afile *)calloc(nent, sizeof (struct afile));
        !           234:        *pfplast = *pfp0 + nent;
        !           235:        nb = 0;
        !           236:        while (dp = readdir(dirp)) {
        !           237:                if (dp->d_ino == 0)
        !           238:                        continue;
        !           239:                if (aflg == 0 && dp->d_name[0]=='.' &&
        !           240:                    (Aflg == 0 || dp->d_name[1]==0 ||
        !           241:                     dp->d_name[1]=='.' && dp->d_name[2]==0))
        !           242:                        continue;
        !           243:                if (gstat(fp, cat(dir, dp->d_name), Fflg+Rflg, &nb) == 0)
        !           244:                        continue;
        !           245:                fp->fnum = dp->d_ino;
        !           246:                fp->fname = savestr(dp->d_name);
        !           247:                fp++;
        !           248:                if (fp == *pfplast) {
        !           249:                        *pfp0 = (struct afile *)realloc((char *)*pfp0,
        !           250:                            2 * nent * sizeof (struct afile));
        !           251:                        if (*pfp0 == 0) {
        !           252:                                fprintf(stderr, "ls: out of memory\n");
        !           253:                                exit(1);
        !           254:                        }
        !           255:                        fp = *pfp0 + nent;
        !           256:                        *pfplast = fp + nent;
        !           257:                        nent *= 2;
        !           258:                }
        !           259:        }
        !           260:        closedir(dirp);
        !           261:        *pfplast = fp;
        !           262:        return (kbytes(dbtob(nb)));
        !           263: }
        !           264: 
        !           265: int    stat(), lstat();
        !           266: 
        !           267: struct afile *
        !           268: gstat(fp, file, statarg, pnb)
        !           269:        register struct afile *fp;
        !           270:        char *file;
        !           271:        int statarg, *pnb;
        !           272: {
        !           273:        int (*statf)() = Lflg ? stat : lstat;
        !           274:        char buf[BUFSIZ]; int cc;
        !           275:        static struct afile azerofile;
        !           276: 
        !           277:        *fp = azerofile;
        !           278:        fp->fflags = 0;
        !           279:        fp->fnum = 0;
        !           280:        fp->ftype = '-';
        !           281:        if (statarg || sflg || lflg || tflg) {
        !           282:                struct stat stb, stb1;
        !           283: 
        !           284:                if ((*statf)(file, &stb) < 0) {
        !           285:                        if (statf == lstat || lstat(file, &stb) < 0) {
        !           286:                                fprintf(stderr, "%s not found\n", file);
        !           287:                                return (0);
        !           288:                        }
        !           289:                }
        !           290:                fp->fblks = stb.st_blocks;
        !           291:                fp->fsize = stb.st_size;
        !           292:                switch (stb.st_mode & S_IFMT) {
        !           293: 
        !           294:                case S_IFDIR:
        !           295:                        fp->ftype = 'd'; break;
        !           296:                case S_IFBLK:
        !           297:                        fp->ftype = 'b'; fp->fsize = stb.st_rdev; break;
        !           298:                case S_IFCHR:
        !           299:                        fp->ftype = 'c'; fp->fsize = stb.st_rdev; break;
        !           300:                case S_IFSOCK:
        !           301:                        fp->ftype = 's'; fp->fsize = 0; break;
        !           302:                case S_IFLNK:
        !           303:                        fp->ftype = 'l';
        !           304:                        if (lflg) {
        !           305:                                cc = readlink(file, buf, BUFSIZ);
        !           306:                                if (cc >= 0) {
        !           307:                                        buf[cc] = 0;
        !           308:                                        fp->flinkto = savestr(buf);
        !           309:                                }
        !           310:                                break;
        !           311:                        }
        !           312:                        if (stat(file, &stb1) < 0)
        !           313:                                break;
        !           314:                        if ((stb1.st_mode & S_IFMT) == S_IFDIR) {
        !           315:                                stb = stb1;
        !           316:                                fp->ftype = 'd';
        !           317:                                fp->fsize = stb.st_size;
        !           318:                                fp->fblks = stb.st_blocks;
        !           319:                        }
        !           320:                        break;
        !           321:                }
        !           322:                fp->fnum = stb.st_ino;
        !           323:                fp->fflags = stb.st_mode & ~S_IFMT;
        !           324:                fp->fnl = stb.st_nlink;
        !           325:                fp->fuid = stb.st_uid;
        !           326:                fp->fgid = stb.st_gid;
        !           327:                if (uflg)
        !           328:                        fp->fmtime = stb.st_atime;
        !           329:                else if (cflg)
        !           330:                        fp->fmtime = stb.st_ctime;
        !           331:                else
        !           332:                        fp->fmtime = stb.st_mtime;
        !           333:                if (pnb)
        !           334:                        *pnb += stb.st_blocks;
        !           335:        }
        !           336:        return (fp);
        !           337: }
        !           338: 
        !           339: formatf(fp0, fplast)
        !           340:        struct afile *fp0, *fplast;
        !           341: {
        !           342:        register struct afile *fp;
        !           343:        int width = 0, w, nentry = fplast - fp0;
        !           344:        int i, j, columns, lines;
        !           345:        char *cp;
        !           346: 
        !           347:        if (fp0 == fplast)
        !           348:                return;
        !           349:        if (lflg || Cflg == 0)
        !           350:                columns = 1;
        !           351:        else {
        !           352:                for (fp = fp0; fp < fplast; fp++) {
        !           353:                        int len = strlen(fmtentry(fp));
        !           354: 
        !           355:                        if (len > width)
        !           356:                                width = len;
        !           357:                }
        !           358:                if (usetabs)
        !           359:                        width = (width + 8) &~ 7;
        !           360:                else
        !           361:                        width += 2;
        !           362:                columns = 80 / width;
        !           363:                if (columns == 0)
        !           364:                        columns = 1;
        !           365:        }
        !           366:        lines = (nentry + columns - 1) / columns;
        !           367:        for (i = 0; i < lines; i++) {
        !           368:                for (j = 0; j < columns; j++) {
        !           369:                        fp = fp0 + j * lines + i;
        !           370:                        cp = fmtentry(fp);
        !           371:                        printf("%s", cp);
        !           372:                        if (fp + lines >= fplast) {
        !           373:                                printf("\n");
        !           374:                                break;
        !           375:                        }
        !           376:                        w = strlen(cp);
        !           377:                        while (w < width)
        !           378:                                if (usetabs) {
        !           379:                                        w = (w + 8) &~ 7;
        !           380:                                        putchar('\t');
        !           381:                                } else {
        !           382:                                        w++;
        !           383:                                        putchar(' ');
        !           384:                                }
        !           385:                }
        !           386:        }
        !           387: }
        !           388: 
        !           389: fcmp(f1, f2)
        !           390:        register struct afile *f1, *f2;
        !           391: {
        !           392: 
        !           393:        if (dflg == 0 && fflg == 0) {
        !           394:                if ((f1->fflags&ISARG) && f1->ftype == 'd') {
        !           395:                        if ((f2->fflags&ISARG) == 0 || f2->ftype != 'd')
        !           396:                                return (1);
        !           397:                } else {
        !           398:                        if ((f2->fflags&ISARG) && f2->ftype == 'd')
        !           399:                                return (-1);
        !           400:                }
        !           401:        }
        !           402:        if (tflg) {
        !           403:                if (f2->fmtime == f1->fmtime)
        !           404:                        return (0);
        !           405:                if (f2->fmtime > f1->fmtime)
        !           406:                        return (rflg);
        !           407:                return (-rflg);
        !           408:        }
        !           409:        return (rflg * strcmp(f1->fname, f2->fname));
        !           410: }
        !           411: 
        !           412: char *
        !           413: cat(dir, file)
        !           414:        char *dir, *file;
        !           415: {
        !           416:        static char dfile[BUFSIZ];
        !           417: 
        !           418:        if (strlen(dir)+1+strlen(file)+1 > BUFSIZ) {
        !           419:                fprintf(stderr, "ls: filename too long\n");
        !           420:                exit(1);
        !           421:        }
        !           422:        if (!strcmp(dir, "") || !strcmp(dir, ".")) {
        !           423:                (void) strcpy(dfile, file);
        !           424:                return (dfile);
        !           425:        }
        !           426:        (void) strcpy(dfile, dir);
        !           427:        if (dir[strlen(dir) - 1] != '/' && *file != '/')
        !           428:                (void) strcat(dfile, "/");
        !           429:        (void) strcat(dfile, file);
        !           430:        return (dfile);
        !           431: }
        !           432: 
        !           433: char *
        !           434: savestr(str)
        !           435:        char *str;
        !           436: {
        !           437:        char *cp = malloc(strlen(str) + 1);
        !           438: 
        !           439:        if (cp == NULL) {
        !           440:                fprintf(stderr, "ls: out of memory\n");
        !           441:                exit(1);
        !           442:        }
        !           443:        (void) strcpy(cp, str);
        !           444:        return (cp);
        !           445: }
        !           446: 
        !           447: char   *fmtinum(), *fmtsize(), *fmtlstuff(), *fmtmode();
        !           448: 
        !           449: char *
        !           450: fmtentry(fp)
        !           451:        register struct afile *fp;
        !           452: {
        !           453:        static char fmtres[BUFSIZ];
        !           454:        register char *cp, *dp;
        !           455: 
        !           456:        (void) sprintf(fmtres, "%s%s%s",
        !           457:            iflg ? fmtinum(fp) : "",
        !           458:            sflg ? fmtsize(fp) : "",
        !           459:            lflg ? fmtlstuff(fp) : "");
        !           460:        dp = &fmtres[strlen(fmtres)];
        !           461:        for (cp = fp->fname; *cp; cp++)
        !           462:                if (qflg && (*cp < ' ' || *cp >= 0177))
        !           463:                        *dp++ = '?';
        !           464:                else
        !           465:                        *dp++ = *cp;
        !           466:        if (Fflg) {
        !           467:                if (fp->ftype == 'd')
        !           468:                        *dp++ = '/';
        !           469:                else if (fp->ftype == 'l')
        !           470:                        *dp++ = '@';
        !           471:                else if (fp->ftype == 's')
        !           472:                        *dp++ = '=';
        !           473:                else if (fp->fflags & 0111)
        !           474:                        *dp++ = '*';
        !           475:        }
        !           476:        if (lflg && fp->flinkto) {
        !           477:                (void) strcpy(dp, " -> "); dp += 4;
        !           478:                for (cp = fp->flinkto; *cp; cp++)
        !           479:                        if (qflg && (*cp < ' ' || *cp >= 0177))
        !           480:                                *dp++ = '?';
        !           481:                        else
        !           482:                                *dp++ = *cp;
        !           483:        }
        !           484:        *dp++ = 0;
        !           485:        return (fmtres);
        !           486: }
        !           487: 
        !           488: char *
        !           489: fmtinum(p)
        !           490:        register struct afile *p;
        !           491: {
        !           492:        static char inumbuf[8];
        !           493: 
        !           494:        (void) sprintf(inumbuf, "%5d ", p->fnum);
        !           495:        return (inumbuf);
        !           496: }
        !           497: 
        !           498: char *
        !           499: fmtsize(p)
        !           500:        register struct afile *p;
        !           501: {
        !           502:        static char sizebuf[32];
        !           503: 
        !           504:        (void) sprintf(sizebuf, "%4ld ", kbytes(dbtob(p->fblks)));
        !           505:        return (sizebuf);
        !           506: }
        !           507: 
        !           508: char *
        !           509: fmtlstuff(p)
        !           510:        register struct afile *p;
        !           511: {
        !           512:        static char lstuffbuf[256];
        !           513:        char gname[32], uname[32], fsize[32], ftime[32];
        !           514:        register char *lp = lstuffbuf;
        !           515: 
        !           516:        /* type mode uname gname fsize ftime */
        !           517: /* get uname */
        !           518:        { char *cp = getname(p->fuid);
        !           519:          if (cp)
        !           520:                (void) sprintf(uname, "%-9.9s", cp);
        !           521:          else
        !           522:                (void) sprintf(uname, "%-9d", p->fuid);
        !           523:        }
        !           524: /* get gname */
        !           525:        if (gflg) {
        !           526:          char *cp = getgroup(p->fgid);
        !           527:          if (cp)
        !           528:                (void) sprintf(gname, "%-9.9s", cp);
        !           529:          else
        !           530:                (void) sprintf(gname, "%-9d", p->fgid);
        !           531:        }
        !           532: /* get fsize */
        !           533:        if (p->ftype == 'b' || p->ftype == 'c')
        !           534:                (void) sprintf(fsize, "%3d,%4d",
        !           535:                    major(p->fsize), minor(p->fsize));
        !           536:        else if (p->ftype == 's')
        !           537:                (void) sprintf(fsize, "%8ld", 0);
        !           538:        else
        !           539:                (void) sprintf(fsize, "%8ld", p->fsize);
        !           540: /* get ftime */
        !           541:        { char *cp = ctime(&p->fmtime);
        !           542:          if ((p->fmtime < sixmonthsago) || (p->fmtime > now))
        !           543:                (void) sprintf(ftime, " %-7.7s %-4.4s ", cp+4, cp+20);
        !           544:          else
        !           545:                (void) sprintf(ftime, " %-12.12s ", cp+4);
        !           546:        }
        !           547: /* splat */
        !           548:        *lp++ = p->ftype;
        !           549:        lp = fmtmode(lp, p->fflags);
        !           550:        (void) sprintf(lp, "%3d %s%s%s%s",
        !           551:            p->fnl, uname, gflg ? gname : "", fsize, ftime);
        !           552:        return (lstuffbuf);
        !           553: }
        !           554: 
        !           555: int    m1[] = { 1, S_IREAD>>0, 'r', '-' };
        !           556: int    m2[] = { 1, S_IWRITE>>0, 'w', '-' };
        !           557: int    m3[] = { 2, S_ISUID, 's', S_IEXEC>>0, 'x', '-' };
        !           558: int    m4[] = { 1, S_IREAD>>3, 'r', '-' };
        !           559: int    m5[] = { 1, S_IWRITE>>3, 'w', '-' };
        !           560: int    m6[] = { 2, S_ISGID, 's', S_IEXEC>>3, 'x', '-' };
        !           561: int    m7[] = { 1, S_IREAD>>6, 'r', '-' };
        !           562: int    m8[] = { 1, S_IWRITE>>6, 'w', '-' };
        !           563: int    m9[] = { 2, S_ISVTX, 't', S_IEXEC>>6, 'x', '-' };
        !           564: 
        !           565: int    *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9};
        !           566: 
        !           567: char *
        !           568: fmtmode(lp, flags)
        !           569:        char *lp;
        !           570:        int flags;
        !           571: {
        !           572:        int **mp;
        !           573: 
        !           574:        for (mp = &m[0]; mp < &m[sizeof(m)/sizeof(m[0])]; ) {
        !           575:                register int *pairp = *mp++;
        !           576:                register int n = *pairp++;
        !           577: 
        !           578:                while (--n >= 0 && (flags&*pairp++) == 0)
        !           579:                        pairp++;
        !           580:                *lp++ = *pairp;
        !           581:        }
        !           582:        return (lp);
        !           583: }
        !           584: 
        !           585: /* rest should be done with nameserver or database */
        !           586: 
        !           587: #include <pwd.h>
        !           588: #include <grp.h>
        !           589: #include <utmp.h>
        !           590: 
        !           591: struct utmp utmp;
        !           592: #define        NMAX    (sizeof (utmp.ut_name))
        !           593: #define SCPYN(a, b)    strncpy(a, b, NMAX)
        !           594: 
        !           595: #define NUID   2048
        !           596: #define NGID   300
        !           597: 
        !           598: char   names[NUID][NMAX+1];
        !           599: char   outrangename[NMAX+1];
        !           600: int    outrangeuid = -1;
        !           601: char   groups[NGID][NMAX+1];
        !           602: char   outrangegroup[NMAX+1];
        !           603: int    outrangegid = -1;
        !           604: 
        !           605: char *
        !           606: getname(uid)
        !           607: {
        !           608:        register struct passwd *pw;
        !           609:        static init;
        !           610:        struct passwd *getpwent();
        !           611: 
        !           612:        if (uid >= 0 && uid < NUID && names[uid][0])
        !           613:                return (&names[uid][0]);
        !           614:        if (uid >= 0 && uid == outrangeuid)
        !           615:                return (outrangename);
        !           616: rescan:
        !           617:        if (init == 2) {
        !           618:                if (uid < NUID)
        !           619:                        return (0);
        !           620:                setpwent();
        !           621:                while (pw = getpwent()) {
        !           622:                        if (pw->pw_uid != uid)
        !           623:                                continue;
        !           624:                        outrangeuid = pw->pw_uid;
        !           625:                        SCPYN(outrangename, pw->pw_name);
        !           626:                        endpwent();
        !           627:                        return (outrangename);
        !           628:                }
        !           629:                endpwent();
        !           630:                return (0);
        !           631:        }
        !           632:        if (init == 0)
        !           633:                setpwent(), init = 1;
        !           634:        while (pw = getpwent()) {
        !           635:                if (pw->pw_uid < 0 || pw->pw_uid >= NUID) {
        !           636:                        if (pw->pw_uid == uid) {
        !           637:                                outrangeuid = pw->pw_uid;
        !           638:                                SCPYN(outrangename, pw->pw_name);
        !           639:                                return (outrangename);
        !           640:                        }
        !           641:                        continue;
        !           642:                }
        !           643:                if (names[pw->pw_uid][0])
        !           644:                        continue;
        !           645:                SCPYN(names[pw->pw_uid], pw->pw_name);
        !           646:                if (pw->pw_uid == uid)
        !           647:                        return (&names[uid][0]);
        !           648:        }
        !           649:        init = 2;
        !           650:        goto rescan;
        !           651: }
        !           652: 
        !           653: char *
        !           654: getgroup(gid)
        !           655: {
        !           656:        register struct group *gr;
        !           657:        static init;
        !           658:        struct group *getgrent();
        !           659: 
        !           660:        if (gid >= 0 && gid < NGID && groups[gid][0])
        !           661:                return (&groups[gid][0]);
        !           662:        if (gid >= 0 && gid == outrangegid)
        !           663:                return (outrangegroup);
        !           664: rescan:
        !           665:        if (init == 2) {
        !           666:                if (gid < NGID)
        !           667:                        return (0);
        !           668:                setgrent();
        !           669:                while (gr = getgrent()) {
        !           670:                        if (gr->gr_gid != gid)
        !           671:                                continue;
        !           672:                        outrangegid = gr->gr_gid;
        !           673:                        SCPYN(outrangegroup, gr->gr_name);
        !           674:                        endgrent();
        !           675:                        return (outrangegroup);
        !           676:                }
        !           677:                endgrent();
        !           678:                return (0);
        !           679:        }
        !           680:        if (init == 0)
        !           681:                setgrent(), init = 1;
        !           682:        while (gr = getgrent()) {
        !           683:                if (gr->gr_gid < 0 || gr->gr_gid >= NGID) {
        !           684:                        if (gr->gr_gid == gid) {
        !           685:                                outrangegid = gr->gr_gid;
        !           686:                                SCPYN(outrangegroup, gr->gr_name);
        !           687:                                return (outrangegroup);
        !           688:                        }
        !           689:                        continue;
        !           690:                }
        !           691:                if (groups[gr->gr_gid][0])
        !           692:                        continue;
        !           693:                SCPYN(groups[gr->gr_gid], gr->gr_name);
        !           694:                if (gr->gr_gid == gid)
        !           695:                        return (&groups[gid][0]);
        !           696:        }
        !           697:        init = 2;
        !           698:        goto rescan;
        !           699: }

unix.superglobalmegacorp.com

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