|
|
1.1 ! root 1: static char *sccsid = "@(#)catman.c 4.1 (Berkeley) 10/1/80"; ! 2: # include <stdio.h> ! 3: # include <sys/types.h> ! 4: # include <dir.h> ! 5: # include <stat.h> ! 6: # include <ctype.h> ! 7: ! 8: # define reg register ! 9: # define bool char ! 10: ! 11: # define SYSTEM(str) (pflag ? printf("%s\n", str) : system(str)) ! 12: ! 13: char buf[BUFSIZ], ! 14: pflag = 0, ! 15: nflag = 0, ! 16: wflag = 0; ! 17: ! 18: main(ac, av) ! 19: int ac; ! 20: char *av[]; { ! 21: ! 22: reg char *tsp, *msp, *csp, *man, *cat, *sp; ! 23: reg FILE *mdir, *inf; ! 24: reg long time; ! 25: reg char *sections; ! 26: reg int exstat = 0; ! 27: reg bool changed = 0; ! 28: static struct dir dir; ! 29: static struct stat sbuf; ! 30: ! 31: while (ac > 1) { ! 32: av++; ! 33: if (strcmp(*av, "-p") == 0) ! 34: pflag++; ! 35: else if (strcmp(*av, "-n") == 0) ! 36: nflag++; ! 37: else if (strcmp(*av, "-w") == 0) ! 38: wflag++; ! 39: else if (*av[0] == '-') ! 40: goto usage; ! 41: else ! 42: break; ! 43: ac--; ! 44: } ! 45: if (ac == 2) ! 46: sections = *av; ! 47: else if (ac < 2) ! 48: sections = "12345678"; ! 49: else { ! 50: usage: ! 51: printf("usage: catman [ -p ] [ -n ] [ -w ] [ sections ]\n"); ! 52: exit(-1); ! 53: } ! 54: if (wflag) ! 55: goto whatis; ! 56: chdir("/usr/man"); ! 57: man = "manx/xxxxxxxxxxxxxx"; ! 58: cat = "catx/xxxxxxxxxxxxxx"; ! 59: msp = &man[5]; ! 60: csp = &cat[5]; ! 61: umask(0); ! 62: for (sp = sections; *sp; sp++) { ! 63: man[3] = cat[3] = *sp; ! 64: *msp = *csp = '\0'; ! 65: if ((mdir = fopen(man, "r")) == NULL) { ! 66: fprintf(stderr, "fopen:"); ! 67: perror(man); ! 68: exstat = 1; ! 69: continue; ! 70: } ! 71: if (stat(cat, &sbuf) < 0) { ! 72: sprintf(buf, "mkdir %s", cat); ! 73: SYSTEM(buf); ! 74: stat(cat, &sbuf); ! 75: } ! 76: if ((sbuf.st_mode & 0777) != 0777) ! 77: chmod(cat, 0777); ! 78: while (fread((char *) &dir, sizeof dir, 1, mdir) > 0) { ! 79: if (dir.d_ino == 0 || dir.d_name[0] == '.') ! 80: continue; ! 81: /* ! 82: * make sure this is a man file, i.e., that it ! 83: * ends in .[0-9] or .[0-9][a-z] ! 84: */ ! 85: tsp = rindex(dir.d_name, '.'); ! 86: if (tsp == NULL) ! 87: continue; ! 88: if (!isdigit(*++tsp) || ((*++tsp && !isalpha(*tsp)) || *++tsp)) ! 89: continue; ! 90: ! 91: strncpy(msp, dir.d_name, DIRSIZ); ! 92: if ((inf = fopen(man, "r")) == NULL) { ! 93: perror(man); ! 94: exstat = 1; ! 95: continue; ! 96: } ! 97: if (getc(inf) == '.' && getc(inf) == 's' ! 98: && getc(inf) == 'o') { ! 99: fclose(inf); ! 100: continue; ! 101: } ! 102: fclose(inf); ! 103: strncpy(csp, dir.d_name, DIRSIZ); ! 104: if (stat(cat, &sbuf) >= 0) { ! 105: time = sbuf.st_mtime; ! 106: stat(man, &sbuf); ! 107: if (time >= sbuf.st_mtime) ! 108: continue; ! 109: unlink(cat); ! 110: } ! 111: sprintf(buf, "nroff -man %s > %s", man, cat); ! 112: SYSTEM(buf); ! 113: changed = 1; ! 114: } ! 115: fclose(mdir); ! 116: } ! 117: if (changed && !nflag) { ! 118: whatis: ! 119: if (pflag) ! 120: printf("/bin/sh /usr/lib/makewhatis\n"); ! 121: else { ! 122: execl("/bin/sh", "/bin/sh", "/usr/lib/makewhatis", 0); ! 123: perror("/bin/sh /usr/lib/makewhatis"); ! 124: exstat = 1; ! 125: } ! 126: } ! 127: exit(exstat); ! 128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.