=================================================================== RCS file: /cvs/mandoc/manpath.c,v retrieving revision 1.6 retrieving revision 1.8 diff -u -p -r1.6 -r1.8 --- mandoc/manpath.c 2011/12/13 20:56:46 1.6 +++ mandoc/manpath.c 2011/12/24 22:37:16 1.8 @@ -1,4 +1,4 @@ -/* $Id: manpath.c,v 1.6 2011/12/13 20:56:46 kristaps Exp $ */ +/* $Id: manpath.c,v 1.8 2011/12/24 22:37:16 kristaps Exp $ */ /* * Copyright (c) 2011 Ingo Schwarze * Copyright (c) 2011 Kristaps Dzonsons @@ -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; @@ -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; + } - if (NULL == defp) - manpath_manconf(dirs, file ? file : MAN_CONF_FILE); - else + /* 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; + } + + /* Append man.conf(5) to MANPATH. */ + if (':' == defp[(int)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 }