|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.