summaryrefslogtreecommitdiff
path: root/libexec/makewhatis/makewhatis.c
diff options
context:
space:
mode:
authortron <tron@NetBSD.org>2005-09-15 14:20:01 +0000
committertron <tron@NetBSD.org>2005-09-15 14:20:01 +0000
commit19577e1caefaf7db02f48767eec596b671e1ae64 (patch)
tree1a5a0507c388d31e9d1cc2bcfe90410e27b79d25 /libexec/makewhatis/makewhatis.c
parentccaf4d670665a12fedf33ac8dbcc81756714d89c (diff)
Reject unformatted manual pages with "[" characters in the description
because "makewhatis" cannot handle nroff macros properly. This fixes the result of "apropos chrtbl". Problem pointed out by wizd(8) in private e-mail.
Diffstat (limited to 'libexec/makewhatis/makewhatis.c')
-rw-r--r--libexec/makewhatis/makewhatis.c212
1 files changed, 114 insertions, 98 deletions
diff --git a/libexec/makewhatis/makewhatis.c b/libexec/makewhatis/makewhatis.c
index 0a443989c67..cbf381a802f 100644
--- a/libexec/makewhatis/makewhatis.c
+++ b/libexec/makewhatis/makewhatis.c
@@ -1,4 +1,4 @@
-/* $NetBSD: makewhatis.c,v 1.36 2005/06/01 15:53:31 lukem Exp $ */
+/* $NetBSD: makewhatis.c,v 1.37 2005/09/15 14:20:01 tron Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
#if !defined(lint)
__COPYRIGHT("@(#) Copyright (c) 1999 The NetBSD Foundation, Inc.\n\
All rights reserved.\n");
-__RCSID("$NetBSD: makewhatis.c,v 1.36 2005/06/01 15:53:31 lukem Exp $");
+__RCSID("$NetBSD: makewhatis.c,v 1.37 2005/09/15 14:20:01 tron Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -91,55 +91,64 @@ struct whatisstruct {
char wi_prefix[1];
};
-int main(int, char * const *);
-char *findwhitespace(char *);
-char *strmove(char *,char *);
-char *GetS(gzFile, char *, size_t);
-int pathnamesection(const char *, const char *);
-int manpagesection(char *);
-char *createsectionstring(char *);
-void addmanpage(manpage **, ino_t, char *, size_t, size_t);
-void addwhatis(whatis **, char *, char *);
-char *makesection(int);
-char *makewhatisline(const char *, const char *, const char *);
-void catpreprocess(char *);
-char *parsecatpage(const char *, gzFile *);
-int manpreprocess(char *);
-char *nroff(const char *, gzFile *);
-char *parsemanpage(const char *, gzFile *, int);
-char *getwhatisdata(char *);
-void processmanpages(manpage **,whatis **);
-void dumpwhatis(FILE *, whatis *);
-void *emalloc(size_t);
-char *estrdup(const char *);
-static int makewhatis(char * const *manpath);
-
-char * const default_manpath[] = {
+int main(int, char * const *);
+static char *findwhitespace(char *);
+static char *strmove(char *,char *);
+static char *GetS(gzFile, char *, size_t);
+static int pathnamesection(const char *, const char *);
+static int manpagesection(char *);
+static char *createsectionstring(char *);
+static void addmanpage(manpage **, ino_t, char *, size_t, size_t);
+static void addwhatis(whatis **, char *, char *);
+static char *makesection(int);
+static char *makewhatisline(const char *, const char *, const char *);
+static void catpreprocess(char *);
+static char *parsecatpage(const char *, gzFile *);
+static int manpreprocess(char *);
+static char *nroff(const char *, gzFile *);
+static char *parsemanpage(const char *, gzFile *, int);
+static char *getwhatisdata(char *);
+static void processmanpages(manpage **,whatis **);
+static void dumpwhatis(FILE *, whatis *);
+static void *emalloc(size_t);
+static char *estrdup(const char *);
+static int makewhatis(char * const *manpath);
+
+static char * const default_manpath[] = {
"/usr/share/man",
NULL
};
-const char *sectionext = "0123456789ln";
-const char *whatisdb = _PATH_WHATIS;
-static int dowarn = 0;
+static const char *sectionext = "0123456789ln";
+static const char *whatisdb = _PATH_WHATIS;
+static int dowarn = 0;
+
+#define ISALPHA(c) isalpha((unsigned char)(c))
+#define ISDIGIT(c) isdigit((unsigned char)(c))
+#define ISSPACE(c) isspace((unsigned char)(c))
int
main(int argc, char *const *argv)
{
- char * const *manpath;
- int c, dofork=1;
- const char *conffile = NULL;
- ENTRY *ep;
- TAG *tp;
- int rv, jobs = 0, status;
- glob_t pg;
- char *paths[2], **p, *sl;
- int retval = EXIT_SUCCESS;
+ char * const *manpath;
+ int c, dofork;
+ const char *conffile;
+ ENTRY *ep;
+ TAG *tp;
+ int rv, jobs, status;
+ glob_t pg;
+ char *paths[2], **p, *sl;
+ int retval;
+
+ dofork = 1;
+ conffile = NULL;
+ jobs = 0;
+ retval = EXIT_SUCCESS;
(void)setlocale(LC_ALL, "");
- while((c = getopt(argc, argv, "C:fw")) != -1) {
- switch(c) {
+ while ((c = getopt(argc, argv, "C:fw")) != -1) {
+ switch (c) {
case 'C':
conffile = optarg;
break;
@@ -163,7 +172,7 @@ main(int argc, char *const *argv)
manpath = &argv[0];
mkwhatis:
- return (makewhatis(manpath));
+ return makewhatis(manpath);
}
/*
@@ -187,8 +196,10 @@ main(int argc, char *const *argv)
/* We always have something to work with here */
for (p = pg.gl_pathv; *p; p++) {
sl = strrchr(*p, '/');
- if (!sl)
- err(EXIT_FAILURE, "glob: _whatdb entry '%s' doesn't contain slash", ep->s);
+ if (sl == NULL) {
+ err(EXIT_FAILURE, "glob: _whatdb entry '%s' "
+ "doesn't contain slash", ep->s);
+ }
/*
* Cut the last component of path, leaving just
@@ -225,14 +236,14 @@ main(int argc, char *const *argv)
}
/* Wait for the childern to finish */
- while(jobs > 0) {
- wait(&status);
+ while (jobs > 0) {
+ (void)wait(&status);
if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS)
retval = EXIT_FAILURE;
jobs--;
}
- return (retval);
+ return retval;
}
static int
@@ -258,14 +269,17 @@ makewhatis(char * const * manpath)
* commonly, this is arch-specific subdirectory.
*/
if (fe->fts_level >= 3) {
- int sl = fe->fts_level - 1;
- const char *s, *lsl=NULL;
+ int sl;
+ const char *s, *lsl;
- s = &fe->fts_path[fe->fts_pathlen-1];
- for(; sl > 0; sl--) {
+ lsl = NULL;
+ s = &fe->fts_path[fe->fts_pathlen - 1];
+ for(sl = fe->fts_level - 1; sl > 0;
+ sl--) {
s--;
- while(s[0] != '/') s--;
- if (!lsl)
+ while (s[0] != '/')
+ s--;
+ if (lsl == NULL)
lsl = s;
}
@@ -315,10 +329,10 @@ makewhatis(char * const * manpath)
return EXIT_SUCCESS;
}
-char *
+static char *
findwhitespace(char *str)
{
- while (!isspace((unsigned char)*str))
+ while (!ISSPACE(*str))
if (*str++ == '\0') {
str = NULL;
break;
@@ -327,13 +341,13 @@ findwhitespace(char *str)
return str;
}
-char
+static char
*strmove(char *dest,char *src)
{
return memmove(dest, src, strlen(src) + 1);
}
-char *
+static char *
GetS(gzFile in, char *buffer, size_t length)
{
char *ptr;
@@ -344,7 +358,7 @@ GetS(gzFile in, char *buffer, size_t length)
return ptr;
}
-char *
+static char *
makesection(int s)
{
char sectionbuffer[24];
@@ -355,7 +369,7 @@ makesection(int s)
return estrdup(sectionbuffer);
}
-int
+static int
pathnamesection(const char *pat, const char *name)
{
char *ptr, *ext;
@@ -372,7 +386,7 @@ pathnamesection(const char *pat, const char *name)
}
-int
+static int
manpagesection(char *name)
{
char *ptr;
@@ -396,7 +410,7 @@ manpagesection(char *name)
return -1;
}
-char *
+static char *
createsectionstring(char *section_id)
{
char *section;
@@ -406,7 +420,7 @@ createsectionstring(char *section_id)
return section;
}
-void
+static void
addmanpage(manpage **tree,ino_t inode,char *name, size_t sdoff, size_t sdlen)
{
manpage *mp;
@@ -427,20 +441,20 @@ addmanpage(manpage **tree,ino_t inode,char *name, size_t sdoff, size_t sdlen)
*tree = mp;
}
-void
+static void
addwhatis(whatis **tree, char *data, char *prefix)
{
whatis *wi;
int result;
- while (isspace((unsigned char)*data))
+ while (ISSPACE(*data))
data++;
if (*data == '/') {
char *ptr;
ptr = ++data;
- while ((*ptr != '\0') && !isspace((unsigned char)*ptr))
+ while ((*ptr != '\0') && !ISSPACE(*ptr))
if (*ptr++ == '/')
data = ptr;
}
@@ -463,17 +477,17 @@ addwhatis(whatis **tree, char *data, char *prefix)
*tree = wi;
}
-void
+static void
catpreprocess(char *from)
{
char *to;
to = from;
- while (isspace((unsigned char)*from)) from++;
+ while (ISSPACE(*from)) from++;
while (*from != '\0')
- if (isspace((unsigned char)*from)) {
- while (isspace((unsigned char)*++from));
+ if (ISSPACE(*from)) {
+ while (ISSPACE(*++from));
if (*from != '\0')
*to++ = ' ';
}
@@ -485,7 +499,7 @@ catpreprocess(char *from)
*to = '\0';
}
-char *
+static char *
makewhatisline(const char *file, const char *line, const char *section)
{
static const char *del[] = {
@@ -529,7 +543,7 @@ makewhatisline(const char *file, const char *line, const char *section)
return result;
}
-char *
+static char *
parsecatpage(const char *name, gzFile *in)
{
char buffer[8192];
@@ -583,7 +597,7 @@ parsecatpage(const char *name, gzFile *in)
return ptr;
}
if ((length > 1) && (ptr[length - 1] == '-') &&
- isalpha((unsigned char)ptr[length - 2]))
+ ISALPHA(ptr[length - 2]))
last = &ptr[--length];
else {
last = &ptr[length++];
@@ -599,23 +613,23 @@ parsecatpage(const char *name, gzFile *in)
return NULL;
}
-int
+static int
manpreprocess(char *line)
{
char *from, *to;
to = from = line;
- while (isspace((unsigned char)*from)) from++;
+ while (ISSPACE(*from))
+ from++;
if (strncmp(from, ".\\\"", 3) == 0)
return 1;
while (*from != '\0')
- if (isspace((unsigned char)*from)) {
- while (isspace((unsigned char)*++from));
+ if (ISSPACE(*from)) {
+ while (ISSPACE(*++from));
if ((*from != '\0') && (*from != ','))
*to++ = ' ';
- }
- else if (*from == '\\')
+ } else if (*from == '\\') {
switch (*++from) {
case '\0':
case '-':
@@ -625,17 +639,18 @@ manpreprocess(char *line)
from++;
if ((*from=='+') || (*from=='-'))
from++;
- while (isdigit((unsigned char)*from))
+ while (ISDIGIT(*from))
from++;
break;
default:
from++;
}
- else
+ } else {
if (*from == '"')
from++;
else
*to++ = *from++;
+ }
*to = '\0';
@@ -643,7 +658,7 @@ manpreprocess(char *line)
char *sect;
from = line + 3;
- if (isspace((unsigned char)*from))
+ if (ISSPACE(*from))
from++;
if ((sect = findwhitespace(from)) != NULL) {
@@ -673,7 +688,7 @@ manpreprocess(char *line)
return 0;
}
-char *
+static char *
nroff(const char *inname, gzFile *in)
{
char tempname[MAXPATHLEN], buffer[65536], *data;
@@ -772,7 +787,7 @@ nroff(const char *inname, gzFile *in)
return data;
}
-char *
+static char *
parsemanpage(const char *name, gzFile *in, int defaultsection)
{
char *section, buffer[8192], *ptr;
@@ -789,7 +804,7 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
char *end;
ptr = &buffer[3];
- if (isspace((unsigned char)*ptr))
+ if (ISSPACE(*ptr))
ptr++;
if ((ptr = findwhitespace(ptr)) == NULL)
continue;
@@ -802,12 +817,12 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
}
else if (strncasecmp(buffer, ".TH", 3) == 0) {
ptr = &buffer[3];
- while (isspace((unsigned char)*ptr))
+ while (ISSPACE(*ptr))
ptr++;
if ((ptr = findwhitespace(ptr)) != NULL) {
char *next;
- while (isspace((unsigned char)*ptr))
+ while (ISSPACE(*ptr))
ptr++;
if ((next = findwhitespace(ptr)) != NULL)
*next = '\0';
@@ -832,12 +847,12 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
size_t length, offset;
ptr = &buffer[3];
- while (isspace((unsigned char)*ptr))
+ while (ISSPACE(*ptr))
ptr++;
length = strlen(ptr);
if ((length > 1) && (ptr[length - 1] == ',') &&
- isspace((unsigned char)ptr[length - 2])) {
+ ISSPACE(ptr[length - 2])) {
ptr[--length] = '\0';
ptr[length - 1] = ',';
}
@@ -860,13 +875,13 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
if (strncasecmp(ptr, ".Nm", 3) != 0) break;
ptr += 3;
- if (isspace((unsigned char)*ptr))
+ if (ISSPACE(*ptr))
ptr++;
buffer[length++] = ' ';
more = strlen(ptr);
if ((more > 1) && (ptr[more - 1] == ',') &&
- isspace((unsigned char)ptr[more - 2])) {
+ ISSPACE(ptr[more - 2])) {
ptr[--more] = '\0';
ptr[more - 1] = ',';
}
@@ -888,14 +903,15 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
if (*ptr == '.') {
char *space;
- if (strncasecmp(ptr, ".Nd", 3) != 0) {
+ if (strncasecmp(ptr, ".Nd", 3) != 0 ||
+ strchr(ptr, '[') != NULL) {
free(section);
return NULL;
}
space = findwhitespace(ptr);
- if (space == NULL)
+ if (space == NULL) {
ptr = "";
- else {
+ } else {
space++;
(void) strmove(ptr, space);
}
@@ -964,7 +980,7 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
buffer[offset - 1] = ' ';
more = strlen(ptr);
if ((more > 1) && (ptr[more - 1] == ',') &&
- isspace((unsigned char)ptr[more - 2])) {
+ ISSPACE(ptr[more - 2])) {
ptr[more - 1] = '\0';
ptr[more - 2] = ',';
}
@@ -981,7 +997,7 @@ parsemanpage(const char *name, gzFile *in, int defaultsection)
return ptr;
}
-char *
+static char *
getwhatisdata(char *name)
{
gzFile *in;
@@ -1008,7 +1024,7 @@ getwhatisdata(char *name)
return data;
}
-void
+static void
processmanpages(manpage **source, whatis **dest)
{
manpage *mp;
@@ -1041,7 +1057,7 @@ processmanpages(manpage **source, whatis **dest)
}
}
-void
+static void
dumpwhatis(FILE *out, whatis *tree)
{
while (tree != NULL) {
@@ -1057,7 +1073,7 @@ dumpwhatis(FILE *out, whatis *tree)
}
}
-void *
+static void *
emalloc(size_t len)
{
void *ptr;
@@ -1066,7 +1082,7 @@ emalloc(size_t len)
return ptr;
}
-char *
+static char *
estrdup(const char *str)
{
char *ptr;