]> git.cameronkatri.com Git - mandoc.git/blobdiff - manpath.c
Audit strlcpy(3)/strlcat(3) usage.
[mandoc.git] / manpath.c
index 66ddddf6de5874f53a9cf43f32f87d8ea53e0470..01635cd803fa0b3275824e6ac344763679a2fa57 100644 (file)
--- a/manpath.c
+++ b/manpath.c
@@ -1,4 +1,4 @@
-/*     $Id: manpath.c,v 1.6 2011/12/13 20:56:46 kristaps Exp $ */
+/*     $Id: manpath.c,v 1.14 2014/04/20 16:46:05 schwarze Exp $ */
 /*
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -19,8 +19,6 @@
 #include "config.h"
 #endif
 
-#include <sys/param.h>
-
 #include <assert.h>
 #include <ctype.h>
 #include <limits.h>
@@ -28,7 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "mandoc.h"
+#include "mandoc_aux.h"
 #include "manpath.h"
 
 #define MAN_CONF_FILE  "/etc/man.conf"
@@ -42,7 +40,7 @@ manpath_parse(struct manpaths *dirs, const char *file,
                char *defp, char *auxp)
 {
 #ifdef USE_MANPATH
-       char             cmd[(MAXPATHLEN * 3) + 20];
+       char             cmd[(PATH_MAX * 3) + 20];
        FILE            *stream;
        char            *buf;
        size_t           sz, bsz;
@@ -63,7 +61,6 @@ manpath_parse(struct manpaths *dirs, const char *file,
 
        /* Open manpath(1).  Ignore errors. */
 
-       warnx(cmd);
        stream = popen(cmd, "r");
        if (NULL == stream)
                return;
@@ -75,7 +72,7 @@ manpath_parse(struct manpaths *dirs, const char *file,
 
        do {
                buf = mandoc_realloc(buf, bsz + 1024);
-               sz = fread(buf + (int)bsz, 1, 1024, stream);
+               sz = fread(buf + bsz, 1, 1024, stream);
                bsz += sz;
        } while (sz > 0);
 
@@ -88,15 +85,54 @@ manpath_parse(struct manpaths *dirs, const char *file,
        free(buf);
        pclose(stream);
 #else
+       char            *insert;
+
+       /* Always prepend -m. */
        manpath_parseline(dirs, auxp);
 
-       if (NULL == defp)
-               defp = getenv("MANPATH");
+       /* If -M is given, it overrides everything else. */
+       if (NULL != defp) {
+               manpath_parseline(dirs, defp);
+               return;
+       }
+
+       /* MANPATH and man.conf(5) cooperate. */
+       defp = getenv("MANPATH");
+       if (NULL == file)
+               file = MAN_CONF_FILE;
 
-       if (NULL == defp)
-               manpath_manconf(dirs, file ? file : MAN_CONF_FILE);
-       else
+       /* No MANPATH; use man.conf(5) only. */
+       if (NULL == defp || '\0' == defp[0]) {
+               manpath_manconf(dirs, file);
+               return;
+       }
+
+       /* Prepend man.conf(5) to MANPATH. */
+       if (':' == defp[0]) {
+               manpath_manconf(dirs, file);
                manpath_parseline(dirs, defp);
+               return;
+       }
+
+       /* Append man.conf(5) to MANPATH. */
+       if (':' == defp[strlen(defp) - 1]) {
+               manpath_parseline(dirs, defp);
+               manpath_manconf(dirs, file);
+               return;
+       }
+
+       /* Insert man.conf(5) into MANPATH. */
+       insert = strstr(defp, "::");
+       if (NULL != insert) {
+               *insert++ = '\0';
+               manpath_parseline(dirs, defp);
+               manpath_manconf(dirs, file);
+               manpath_parseline(dirs, insert + 1);
+               return;
+       }
+
+       /* MANPATH overrides man.conf(5) completely. */
+       manpath_parseline(dirs, defp);
 #endif
 }
 
@@ -124,7 +160,7 @@ manpath_add(struct manpaths *dirs, const char *dir)
 {
        char             buf[PATH_MAX];
        char            *cp;
-       int              i;
+       size_t           i;
 
        if (NULL == (cp = realpath(dir, buf)))
                return;
@@ -133,9 +169,8 @@ manpath_add(struct manpaths *dirs, const char *dir)
                if (0 == strcmp(dirs->paths[i], dir))
                        return;
 
-       dirs->paths = mandoc_realloc
-               (dirs->paths,
-                ((size_t)dirs->sz + 1) * sizeof(char *));
+       dirs->paths = mandoc_realloc(dirs->paths,
+           (dirs->sz + 1) * sizeof(char *));
 
        dirs->paths[dirs->sz++] = mandoc_strdup(cp);
 }
@@ -143,7 +178,7 @@ manpath_add(struct manpaths *dirs, const char *dir)
 void
 manpath_free(struct manpaths *p)
 {
-       int              i;
+       size_t           i;
 
        for (i = 0; i < p->sz; i++)
                free(p->paths[i]);
@@ -173,7 +208,7 @@ manpath_manconf(struct manpaths *dirs, const char *file)
                if (strncmp(MAN_CONF_KEY, p, keysz))
                        continue;
                p += keysz;
-               while (isspace(*p))
+               while (isspace((unsigned char)*p))
                        p++;
                if ('\0' == *p)
                        continue;