1 static char *sccsid = "@(#)catman.c 4.1 (Berkeley) 10/01/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 } 129