summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2015-03-26 22:42:02 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2015-03-26 22:42:02 +0000
commit262a4f4867a8109022643f2080f219762b0c93aa (patch)
treede1aa22255af449a6f01d022b0eb9067cc89535d /usr.bin
parent29a995c47a47a52af799214592f795a34b2e22e8 (diff)
Add a new directive "manpath path"
to replace the legacy "_whatdb path/whatis.db". Keep _whatdb support for backward compat, for now. Discussed with many, jmc@ and ajacoutot@ agree with the general direction.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/mandoc/manpath.c68
1 files changed, 42 insertions, 26 deletions
diff --git a/usr.bin/mandoc/manpath.c b/usr.bin/mandoc/manpath.c
index fd07821708e..3db1cc8f4f3 100644
--- a/usr.bin/mandoc/manpath.c
+++ b/usr.bin/mandoc/manpath.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: manpath.c,v 1.12 2015/03/21 17:18:17 schwarze Exp $ */
+/* $OpenBSD: manpath.c,v 1.13 2015/03/26 22:42:01 schwarze Exp $ */
/*
* Copyright (c) 2011, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -7,9 +7,9 @@
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
@@ -18,7 +18,6 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
@@ -29,7 +28,6 @@
#include "manpath.h"
#define MAN_CONF_FILE "/etc/man.conf"
-#define MAN_CONF_KEY "_whatdb"
#define MANPATH_DEFAULT "/usr/share/man:/usr/X11R6/man:/usr/local/man"
static void manpath_add(struct manpaths *, const char *, int);
@@ -159,33 +157,51 @@ manpath_free(struct manpaths *p)
void
manpath_manconf(struct manpaths *dirs, const char *file)
{
- FILE *stream;
- char *p, *q;
- size_t len, keysz;
+ const char *const toks[] = { "manpath", "_whatdb" };
- keysz = strlen(MAN_CONF_KEY);
- assert(keysz > 0);
+ FILE *stream;
+ char *cp, *ep;
+ size_t len, tok;
- if (NULL == (stream = fopen(file, "r")))
+ if ((stream = fopen(file, "r")) == NULL)
return;
- while (NULL != (p = fgetln(stream, &len))) {
- if (0 == len || '\n' != p[--len])
+ while ((cp = fgetln(stream, &len)) != NULL) {
+ ep = cp + len;
+ if (ep[-1] != '\n')
break;
- p[len] = '\0';
- while (isspace((unsigned char)*p))
- p++;
- if (strncmp(MAN_CONF_KEY, p, keysz))
- continue;
- p += keysz;
- while (isspace((unsigned char)*p))
- p++;
- if ('\0' == *p)
+ *--ep = '\0';
+ while (isspace((unsigned char)*cp))
+ cp++;
+ if (*cp == '#')
continue;
- if (NULL == (q = strrchr(p, '/')))
- continue;
- *q = '\0';
- manpath_add(dirs, p, 0);
+
+ for (tok = 0; tok < sizeof(toks)/sizeof(toks[0]); tok++) {
+ len = strlen(toks[tok]);
+ if (cp + len < ep &&
+ isspace((unsigned char)cp[len]) &&
+ !strncmp(cp, toks[tok], len)) {
+ cp += len;
+ while (isspace((unsigned char)*cp))
+ cp++;
+ break;
+ }
+ }
+
+ switch (tok) {
+ case 1: /* _whatdb */
+ while (ep > cp && ep[-1] != '/')
+ ep--;
+ if (ep == cp)
+ continue;
+ *ep = '\0';
+ /* FALLTHROUGH */
+ case 0: /* manpath */
+ manpath_add(dirs, cp, 0);
+ break;
+ default:
+ break;
+ }
}
fclose(stream);