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