aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/manpath.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-11-18 19:41:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-11-18 19:41:47 +0000
commitd0136da1bd32e7d85b9f64ac1a0cf2d00441d766 (patch)
tree8a7230c5091ff536b1942ccb5c4a06854f7c0284 /manpath.c
parent2e59849b062f9d26071ad13b35b29fe6dcd30250 (diff)
downloadmandoc-d0136da1bd32e7d85b9f64ac1a0cf2d00441d766.tar.gz
mandoc-d0136da1bd32e7d85b9f64ac1a0cf2d00441d766.tar.zst
mandoc-d0136da1bd32e7d85b9f64ac1a0cf2d00441d766.zip
Ignore invalid directories in man.conf(5) and MANPATH, even if their
parent directories exist, but complain about invalid directories given on the command line. Intended to fix an oddity reported by sthen@.
Diffstat (limited to 'manpath.c')
-rw-r--r--manpath.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/manpath.c b/manpath.c
index 0e0a6017..9be143cc 100644
--- a/manpath.c
+++ b/manpath.c
@@ -1,6 +1,6 @@
-/* $Id: manpath.c,v 1.17 2014/08/16 19:00:01 schwarze Exp $ */
+/* $Id: manpath.c,v 1.18 2014/11/18 19:41:47 schwarze Exp $ */
/*
- * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -18,6 +18,7 @@
#include "config.h"
#include <sys/types.h>
+#include <sys/stat.h>
#include <assert.h>
#include <ctype.h>
@@ -32,8 +33,8 @@
#define MAN_CONF_FILE "/etc/man.conf"
#define MAN_CONF_KEY "_whatdb"
-static void manpath_add(struct manpaths *, const char *);
-static void manpath_parseline(struct manpaths *, char *);
+static void manpath_add(struct manpaths *, const char *, int);
+static void manpath_parseline(struct manpaths *, char *, int);
void
manpath_parse(struct manpaths *dirs, const char *file,
@@ -88,11 +89,11 @@ manpath_parse(struct manpaths *dirs, const char *file,
char *insert;
/* Always prepend -m. */
- manpath_parseline(dirs, auxp);
+ manpath_parseline(dirs, auxp, 1);
/* If -M is given, it overrides everything else. */
if (NULL != defp) {
- manpath_parseline(dirs, defp);
+ manpath_parseline(dirs, defp, 1);
return;
}
@@ -110,13 +111,13 @@ manpath_parse(struct manpaths *dirs, const char *file,
/* Prepend man.conf(5) to MANPATH. */
if (':' == defp[0]) {
manpath_manconf(dirs, file);
- manpath_parseline(dirs, defp);
+ manpath_parseline(dirs, defp, 0);
return;
}
/* Append man.conf(5) to MANPATH. */
if (':' == defp[strlen(defp) - 1]) {
- manpath_parseline(dirs, defp);
+ manpath_parseline(dirs, defp, 0);
manpath_manconf(dirs, file);
return;
}
@@ -125,14 +126,14 @@ manpath_parse(struct manpaths *dirs, const char *file,
insert = strstr(defp, "::");
if (NULL != insert) {
*insert++ = '\0';
- manpath_parseline(dirs, defp);
+ manpath_parseline(dirs, defp, 0);
manpath_manconf(dirs, file);
- manpath_parseline(dirs, insert + 1);
+ manpath_parseline(dirs, insert + 1, 0);
return;
}
/* MANPATH overrides man.conf(5) completely. */
- manpath_parseline(dirs, defp);
+ manpath_parseline(dirs, defp, 0);
#endif
}
@@ -140,7 +141,7 @@ manpath_parse(struct manpaths *dirs, const char *file,
* Parse a FULL pathname from a colon-separated list of arrays.
*/
static void
-manpath_parseline(struct manpaths *dirs, char *path)
+manpath_parseline(struct manpaths *dirs, char *path, int complain)
{
char *dir;
@@ -148,7 +149,7 @@ manpath_parseline(struct manpaths *dirs, char *path)
return;
for (dir = strtok(path, ":"); dir; dir = strtok(NULL, ":"))
- manpath_add(dirs, dir);
+ manpath_add(dirs, dir, complain);
}
/*
@@ -156,19 +157,33 @@ manpath_parseline(struct manpaths *dirs, char *path)
* Grow the array one-by-one for simplicity's sake.
*/
static void
-manpath_add(struct manpaths *dirs, const char *dir)
+manpath_add(struct manpaths *dirs, const char *dir, int complain)
{
char buf[PATH_MAX];
+ struct stat sb;
char *cp;
size_t i;
- if (NULL == (cp = realpath(dir, buf)))
+ if (NULL == (cp = realpath(dir, buf))) {
+ if (complain) {
+ fputs("manpath: ", stderr);
+ perror(dir);
+ }
return;
+ }
for (i = 0; i < dirs->sz; i++)
if (0 == strcmp(dirs->paths[i], dir))
return;
+ if (stat(cp, &sb) == -1) {
+ if (complain) {
+ fputs("manpath: ", stderr);
+ perror(dir);
+ }
+ return;
+ }
+
dirs->paths = mandoc_reallocarray(dirs->paths,
dirs->sz + 1, sizeof(char *));
@@ -215,7 +230,7 @@ manpath_manconf(struct manpaths *dirs, const char *file)
if (NULL == (q = strrchr(p, '/')))
continue;
*q = '\0';
- manpath_add(dirs, p);
+ manpath_add(dirs, p, 0);
}
fclose(stream);