Annotation of researchv10no/cmd/ls.c, revision 1.1

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

unix.superglobalmegacorp.com

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