|
|
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.