]> git.cameronkatri.com Git - mandoc.git/blobdiff - manpath.c
Fix a nasty typo that prevented .so links to gziped manuals
[mandoc.git] / manpath.c
index 2bb83684b6e8d878508dff80c08c9991415feac4..83c329ec9bbb6b2b2473f4046fcc6d8a08c08422 100644 (file)
--- a/manpath.c
+++ b/manpath.c
@@ -1,4 +1,4 @@
-/*     $Id: manpath.c,v 1.24 2015/04/28 16:13:45 schwarze Exp $        */
+/*     $Id: manpath.c,v 1.30 2016/05/28 13:44:13 schwarze Exp $        */
 /*
  * Copyright (c) 2011, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -21,6 +21,9 @@
 #include <sys/stat.h>
 
 #include <ctype.h>
+#if HAVE_ERR
+#include <err.h>
+#endif
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -29,7 +32,9 @@
 #include "mandoc_aux.h"
 #include "manconf.h"
 
+#if !HAVE_MANPATH
 static void     manconf_file(struct manconf *, const char *);
+#endif
 static void     manpath_add(struct manpaths *, const char *, int);
 static void     manpath_parseline(struct manpaths *, char *, int);
 
@@ -84,7 +89,6 @@ manconf_parse(struct manconf *conf, const char *file,
        free(buf);
        pclose(stream);
 #else
-       char             manpath_default[] = MANPATH_DEFAULT;
        char            *insert;
 
        /* Always prepend -m. */
@@ -104,8 +108,6 @@ manconf_parse(struct manconf *conf, const char *file,
        /* No MANPATH; use man.conf(5) only. */
        if (NULL == defp || '\0' == defp[0]) {
                manconf_file(conf, file);
-               if (conf->manpath.sz == 0)
-                       manpath_parseline(&conf->manpath, manpath_default, 0);
                return;
        }
 
@@ -166,10 +168,8 @@ manpath_add(struct manpaths *dirs, const char *dir, int complain)
        size_t           i;
 
        if (NULL == (cp = realpath(dir, buf))) {
-               if (complain) {
-                       fputs("manpath: ", stderr);
-                       perror(dir);
-               }
+               if (complain)
+                       warn("manpath: %s", dir);
                return;
        }
 
@@ -178,10 +178,8 @@ manpath_add(struct manpaths *dirs, const char *dir, int complain)
                        return;
 
        if (stat(cp, &sb) == -1) {
-               if (complain) {
-                       fputs("manpath: ", stderr);
-                       perror(dir);
-               }
+               if (complain)
+                       warn("manpath: %s", dir);
                return;
        }
 
@@ -206,34 +204,40 @@ manconf_free(struct manconf *conf)
        free(conf->output.style);
 }
 
+#if !HAVE_MANPATH
 static void
 manconf_file(struct manconf *conf, const char *file)
 {
        const char *const toks[] = { "manpath", "output", "_whatdb" };
+       char manpath_default[] = MANPATH_DEFAULT;
 
        FILE            *stream;
-       char            *cp, *ep;
-       size_t           len, tok;
+       char            *line, *cp, *ep;
+       size_t           linesz, tok, toklen;
+       ssize_t          linelen;
 
        if ((stream = fopen(file, "r")) == NULL)
-               return;
+               goto out;
 
-       while ((cp = fgetln(stream, &len)) != NULL) {
-               ep = cp + len;
-               if (ep[-1] != '\n')
-                       break;
-               *--ep = '\0';
+       line = NULL;
+       linesz = 0;
+
+       while ((linelen = getline(&line, &linesz, stream)) != -1) {
+               cp = line;
+               ep = cp + linelen - 1;
+               while (ep > cp && isspace((unsigned char)*ep))
+                       *ep-- = '\0';
                while (isspace((unsigned char)*cp))
                        cp++;
-               if (*cp == '#')
+               if (cp == ep || *cp == '#')
                        continue;
 
                for (tok = 0; tok < sizeof(toks)/sizeof(toks[0]); tok++) {
-                       len = strlen(toks[tok]);
-                       if (cp + len < ep &&
-                           isspace((unsigned char)cp[len]) &&
-                           !strncmp(cp, toks[tok], len)) {
-                               cp += len;
+                       toklen = strlen(toks[tok]);
+                       if (cp + toklen < ep &&
+                           isspace((unsigned char)cp[toklen]) &&
+                           strncmp(cp, toks[tok], toklen) == 0) {
+                               cp += toklen;
                                while (isspace((unsigned char)*cp))
                                        cp++;
                                break;
@@ -250,6 +254,7 @@ manconf_file(struct manconf *conf, const char *file)
                        /* FALLTHROUGH */
                case 0:  /* manpath */
                        manpath_add(&conf->manpath, cp, 0);
+                       *manpath_default = '\0';
                        break;
                case 1:  /* output */
                        manconf_output(&conf->output, cp);
@@ -258,9 +263,14 @@ manconf_file(struct manconf *conf, const char *file)
                        break;
                }
        }
-
+       free(line);
        fclose(stream);
+
+out:
+       if (*manpath_default != '\0')
+               manpath_parseline(&conf->manpath, manpath_default, 0);
 }
+#endif
 
 void
 manconf_output(struct manoutput *conf, const char *cp)