]> git.cameronkatri.com Git - mandoc.git/blobdiff - manpath.c
While I'm rooting around, note that we depend on sqlite3 now, not berkeley.
[mandoc.git] / manpath.c
index 66ddddf6de5874f53a9cf43f32f87d8ea53e0470..e22aa9268a8c218ca32beac99e81a4186d49eb92 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.9 2012/06/08 10:32:40 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -63,7 +63,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 +74,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 +87,54 @@ manpath_parse(struct manpaths *dirs, const char *file,
        free(buf);
        pclose(stream);
 #else
-       manpath_parseline(dirs, auxp);
+       char            *insert;
 
-       if (NULL == defp)
-               defp = getenv("MANPATH");
+       /* Always prepend -m. */
+       manpath_parseline(dirs, auxp);
+       /* 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;
+
+       /* 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;
+       }
 
-       if (NULL == defp)
-               manpath_manconf(dirs, file ? file : MAN_CONF_FILE);
-       else
+       /* 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 +162,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;
@@ -135,7 +173,7 @@ manpath_add(struct manpaths *dirs, const char *dir)
 
        dirs->paths = mandoc_realloc
                (dirs->paths,
-                ((size_t)dirs->sz + 1) * sizeof(char *));
+                (dirs->sz + 1) * sizeof(char *));
 
        dirs->paths[dirs->sz++] = mandoc_strdup(cp);
 }
@@ -143,7 +181,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]);