aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xconfigure7
-rw-r--r--configure.local.example28
-rw-r--r--mandocdb.c32
3 files changed, 52 insertions, 15 deletions
diff --git a/configure b/configure
index 377d49c5..94561c3a 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $Id: configure,v 1.77 2020/07/20 16:57:30 schwarze Exp $
+# $Id: configure,v 1.78 2021/08/07 13:02:10 schwarze Exp $
#
# Copyright (c) 2014-2020 Ingo Schwarze <schwarze@openbsd.org>
#
@@ -107,7 +107,7 @@ BIN_FROM_SBIN=
INCLUDEDIR=
LIBDIR=
MANDIR=
-HOMEBREWDIR=
+READ_ALLOWED_PATH=
WWWPREFIX="/var/www"
HTDOCDIR=
@@ -461,7 +461,8 @@ echo "#define MANPATH_DEFAULT \"${MANPATH_DEFAULT}\""
echo "#define OSENUM ${OSENUM}"
[ -n "${OSNAME}" ] && echo "#define OSNAME \"${OSNAME}\""
[ -n "${UTF8_LOCALE}" ] && echo "#define UTF8_LOCALE \"${UTF8_LOCALE}\""
-[ -n "${HOMEBREWDIR}" ] && echo "#define HOMEBREWDIR \"${HOMEBREWDIR}\""
+[ -n "${READ_ALLOWED_PATH}" ] \
+ && echo "#define READ_ALLOWED_PATH \"${READ_ALLOWED_PATH}\""
[ ${HAVE_ATTRIBUTE} -eq 0 ] && echo "#define __attribute__(x)"
[ ${HAVE_EFTYPE} -eq 0 ] && echo "#define EFTYPE EINVAL"
[ ${HAVE_O_DIRECTORY} -eq 0 ] && echo "#define O_DIRECTORY 0"
diff --git a/configure.local.example b/configure.local.example
index b717e477..7bd5bb5e 100644
--- a/configure.local.example
+++ b/configure.local.example
@@ -1,4 +1,4 @@
-# $Id: configure.local.example,v 1.39 2020/07/20 16:57:30 schwarze Exp $
+# $Id: configure.local.example,v 1.40 2021/08/07 13:02:10 schwarze Exp $
#
# Copyright (c) 2014-2019 Ingo Schwarze <schwarze@openbsd.org>
#
@@ -209,14 +209,28 @@ INSTALL_LIB="${INSTALL} -m 0444"
INSTALL_MAN="${INSTALL} -m 0444"
INSTALL_DATA="${INSTALL} -m 0444"
-# When using the "homebrew" package manager on Mac OS X, the actual
-# manuals are located in a so-called "cellar" and only symlinked
-# into the manual trees. To allow mandoc to follow such symlinks,
-# you have to specify the physical location of the cellar as returned
-# by realpath(3), for example:
+# By default, makewhatis(8) can only read from the paths passed on the
+# command line or configured in man.conf(5).
+# But some package managers on some operating systems store manual pages
+# in separate "cellar" or "store" directories and only symlink them
+# into the manual trees.
+# To support one or more such package managers, give makewhatis(8)
+# read access to the cellars and stores on your system, in the form
+# of a colon-separated path:
+# Homebrow package manager on Mac OS X:
PREFIX="/usr/local"
-HOMEBREWDIR="${PREFIX}/Cellar"
+READ_ALLOWED_PATH="${PREFIX}/Cellar"
+
+# Nix package manager and/or NixOS Linux distribution:
+READ_ALLOWED_PATH="/nix/store"
+
+# GNU Guix package manager and/or GNU Guix Linux distribution:
+READ_ALLOWED_PATH="/gnu/store"
+
+# If multiple package managers are used concurrently:
+PREFIX="/usr/local"
+READ_ALLOWED_PATH="/nix/store:${PREFIX}/Cellar"
# --- user settings for the mandoc(3) library --------------------------
diff --git a/mandocdb.c b/mandocdb.c
index 6a4e72c9..0ef661b2 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.c,v 1.267 2020/04/03 11:35:01 schwarze Exp $ */
+/* $Id: mandocdb.c,v 1.268 2021/08/07 13:02:10 schwarze Exp $ */
/*
* Copyright (c) 2011-2020 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -165,6 +165,9 @@ static void putkey(const struct mpage *, char *, uint64_t);
static void putkeys(const struct mpage *, char *, size_t, uint64_t);
static void putmdockey(const struct mpage *,
const struct roff_node *, uint64_t, int);
+#ifdef READ_ALLOWED_PATH
+static int read_allowed(const char *);
+#endif
static int render_string(char **, size_t *);
static void say(const char *, const char *, ...)
__attribute__((__format__ (__printf__, 2, 3)));
@@ -612,8 +615,8 @@ treescan(void)
continue;
}
if (strncmp(buf, basedir, basedir_len) != 0
-#ifdef HOMEBREWDIR
- && strncmp(buf, HOMEBREWDIR, strlen(HOMEBREWDIR))
+#ifdef READ_ALLOWED_PATH
+ && !read_allowed(buf)
#endif
) {
if (warnings) say("",
@@ -823,8 +826,8 @@ filescan(const char *infile)
start = usefile;
else if (strncmp(usefile, basedir, basedir_len) == 0)
start = usefile + basedir_len;
-#ifdef HOMEBREWDIR
- else if (strncmp(usefile, HOMEBREWDIR, strlen(HOMEBREWDIR)) == 0)
+#ifdef READ_ALLOWED_PATH
+ else if (read_allowed(usefile))
start = usefile;
#endif
else {
@@ -2381,6 +2384,25 @@ set_basedir(const char *targetdir, int report_baddir)
return 1;
}
+#ifdef READ_ALLOWED_PATH
+static int
+read_allowed(const char *candidate)
+{
+ const char *cp;
+ size_t len;
+
+ for (cp = READ_ALLOWED_PATH;; cp += len) {
+ while (*cp == ':')
+ cp++;
+ if (*cp == '\0')
+ return 0;
+ len = strcspn(cp, ":");
+ if (strncmp(candidate, cp, len) == 0)
+ return 1;
+ }
+}
+#endif
+
static void
say(const char *file, const char *format, ...)
{