Home | History | Annotate | Line # | Download | only in catman
catman.c revision 1.1
      1 /*
      2  * Copyright (c) 1993 Winning Strategies, Inc.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *      This product includes software developed by Winning Strategies, Inc.
     16  * 4. The name of the author may not be used to endorse or promote products
     17  *    derived from this software withough specific prior written permission
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  *
     30  * $Header: /tank/opengrok/rsync2/NetBSD/src/usr.sbin/catman/catman.c,v 1.1 1993/07/27 21:29:32 jtc Exp $
     31  */
     32 
     33 #include <stdio.h>
     34 #include <stdlib.h>
     35 #include <string.h>
     36 #include <sys/types.h>
     37 #include <sys/stat.h>
     38 #include <dirent.h>
     39 #include <unistd.h>
     40 #include <limits.h>
     41 #include <errno.h>
     42 #include <err.h>
     43 
     44 int             no_whatis = 0;
     45 int             just_print = 0;
     46 int             just_whatis = 0;
     47 
     48 char            manpath[] = "/usr/share/man";
     49 char            sections[] = "12345678lnop";
     50 char           *mp = manpath;
     51 char	       *sp = sections;
     52 
     53 void            catman();
     54 void            makewhatis();
     55 void            usage();
     56 
     57 int
     58 main(argc, argv)
     59 	int             argc;
     60 	char          **argv;
     61 {
     62 	int             c;
     63 
     64 	while ((c = getopt(argc, argv, "npwM:")) != EOF) {
     65 		switch (c) {
     66 		case 'n':
     67 			no_whatis = 1;
     68 			break;
     69 		case 'p':
     70 			just_print = 1;
     71 			break;
     72 		case 'w':
     73 			just_whatis = 1;
     74 			break;
     75 
     76 		case 'M':
     77 			mp = optarg;
     78 			break;
     79 
     80 		case '?':
     81 		default:
     82 			usage();
     83 		}
     84 	}
     85 
     86 	argc -= optind;
     87 	argv += optind;
     88 
     89 	if (argc > 1)
     90 		usage ();
     91 	if (argc == 0)
     92 		sp = *argv;
     93 
     94 	catman(mp, sp);
     95 
     96 	exit(0);
     97 }
     98 
     99 
    100 void
    101 catman(path, section)
    102 	char           *path;
    103 	char           *section;
    104 {
    105 	DIR            *dirp;
    106 	struct dirent  *dp;
    107 	struct stat     manstat;
    108 	struct stat	catstat;
    109 	char            mandir[PATH_MAX];
    110 	char            catdir[PATH_MAX];
    111 	char            manpage[PATH_MAX];
    112 	char            catpage[PATH_MAX];
    113 	char            sysbuf[1024];
    114 	char           *s;
    115 	int             formatted = 0;
    116 
    117 	if (!just_whatis) {
    118 		for (s = section; *s; s++) {
    119 			sprintf(mandir, "%s/man%c", path, *s);
    120 			sprintf(catdir, "%s/cat%c", path, *s);
    121 
    122 			if ((dirp = opendir(mandir)) == 0) {
    123 				warn("can't open %s", mandir);
    124 				continue;
    125 			}
    126 
    127 			if (stat(catdir, &catstat) < 0) {
    128 				if (errno != ENOENT) {
    129 					warn("can't stat %s", catdir);
    130 					closedir(dirp);
    131 					continue;
    132 				}
    133 				if (just_print) {
    134 					printf("mkdir %s\n", catdir);
    135 				} else if (mkdir(catdir, 0755) < 0) {
    136 					warn("can't create %s", catdir);
    137 					closedir(dirp);
    138 					return;
    139 				}
    140 			}
    141 
    142 			while ((dp = readdir(dirp)) != NULL) {
    143 				if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
    144 					continue;
    145 
    146 				sprintf(manpage, "%s/%s", mandir, dp->d_name);
    147 				sprintf(catpage, "%s/%s", catdir, dp->d_name);
    148 				if ((s = strrchr(catpage, '.')) != NULL)
    149 					strcpy(s, ".0");
    150 
    151 				if (stat(manpage, &manstat) < 0) {
    152 					warn("can't stat %s", manpage);
    153 					continue;
    154 				}
    155 
    156 				if (!S_ISREG(manstat.st_mode)) {
    157 					warnx("not a regular file %s", manpage);
    158 					continue;
    159 				}
    160 
    161 				if (stat(catpage, &catstat) < 0 && errno != ENOENT) {
    162 					warn("can't stat %s", catpage);
    163 					continue;
    164 				}
    165 
    166 				if (errno == ENOENT || manstat.st_mtime >= catstat.st_mtime) {
    167 					/*
    168 					 * manpage is out of date,
    169 					 * reformat
    170 					 */
    171 					sprintf(sysbuf, "nroff -mandoc %s > %s", manpage, catpage);
    172 
    173 					if (just_print) {
    174 						printf("%s\n", sysbuf);
    175 					} else {
    176 						if (system(sysbuf) != 0) {
    177 						}
    178 					}
    179 					formatted = 1;
    180 				}
    181 			}
    182 
    183 			closedir(dirp);
    184 		}
    185 	}
    186 
    187 	if (!no_whatis && formatted) {
    188 		makewhatis(path);
    189 	}
    190 }
    191 
    192 void
    193 makewhatis(path)
    194 {
    195 	char            sysbuf[1024];
    196 
    197 	sprintf(sysbuf, "/usr/libexec/makewhatis %s", path);
    198 	if (just_print) {
    199 		printf("%s\n", sysbuf);
    200 	} else {
    201 		if (system(sysbuf) != 0) {
    202 		}
    203 	}
    204 }
    205 
    206 
    207 void
    208 usage()
    209 {
    210 	(void) fprintf(stderr, "usage: catman [-npw] [-M manpath] [sections]\n");
    211 	exit(1);
    212 }
    213