From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (schwarze@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id sAIJfmkJ031243 for ; Tue, 18 Nov 2014 14:41:48 -0500 (EST) Received: (from schwarze@localhost) by krisdoz.my.domain (8.14.5/8.14.3/Submit) id sAIJflnJ002739; Tue, 18 Nov 2014 14:41:47 -0500 (EST) Date: Tue, 18 Nov 2014 14:41:47 -0500 (EST) Message-Id: <201411181941.sAIJflnJ002739@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Ignore invalid directories in man.conf(5) and MANPATH, even if X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- 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@. Modified Files: -------------- mdocml: manpath.c Revision Data ------------- Index: manpath.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/manpath.c,v retrieving revision 1.17 retrieving revision 1.18 diff -Lmanpath.c -Lmanpath.c -u -p -r1.17 -r1.18 --- manpath.c +++ manpath.c @@ -1,6 +1,6 @@ /* $Id$ */ /* - * Copyright (c) 2011 Ingo Schwarze + * Copyright (c) 2011, 2014 Ingo Schwarze * Copyright (c) 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -18,6 +18,7 @@ #include "config.h" #include +#include #include #include @@ -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, con 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, con /* 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, con 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, con * 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, 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, * 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, c if (NULL == (q = strrchr(p, '/'))) continue; *q = '\0'; - manpath_add(dirs, p); + manpath_add(dirs, p, 0); } fclose(stream); -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv