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