From 586d9c5122c9adb8da1eac27d93045e4851ccf60 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Sat, 24 Dec 2011 22:37:16 +0000 Subject: Support leading, trailing and double colons in MANPATH to prepend, append or insert the man.conf(5) default path; compatible with GNU manpath(1), implementation by kristaps@, heavily tweaked by schwarze@. Updates to MANPATH documentation applied to whatis.1, apropos.1, and catman.8 also. --- apropos.1 | 17 ++++++++++++++--- catman.8 | 17 ++++++++++++++--- manpath.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++------- whatis.1 | 17 ++++++++++++++--- 4 files changed, 88 insertions(+), 16 deletions(-) diff --git a/apropos.1 b/apropos.1 index f958f4f2..bff583df 100644 --- a/apropos.1 +++ b/apropos.1 @@ -1,4 +1,4 @@ -.\" $Id: apropos.1,v 1.13 2011/12/12 02:00:49 schwarze Exp $ +.\" $Id: apropos.1,v 1.14 2011/12/24 22:37:16 kristaps Exp $ .\" .\" Copyright (c) 2011 Kristaps Dzonsons .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 12 2011 $ +.Dd $Mdocdate: December 24 2011 $ .Dt APROPOS 1 .Os .Sh NAME @@ -239,11 +239,22 @@ Text production: .Sh ENVIRONMENT .Bl -tag -width Ds .It Ev MANPATH -Colon-separated paths overriding the default list of paths searched for +Colon-separated paths modifying the default list of paths searched for manual databases. Invalid paths, or paths without manual databases, are ignored. Overridden by .Fl M . +If +.Ev MANPATH +begins with a +.Sq \&: , +it is appended to the default list; +else if it ends with +.Sq \&: , +it is prepended to the default list; else if it contains +.Sq \&:: , +the default list is inserted between the colons. +If none of these conditions are met, it overrides the default list. .El .Sh FILES .Bl -tag -width "/etc/man.conf" -compact diff --git a/catman.8 b/catman.8 index af7353ac..fdd4cc9d 100644 --- a/catman.8 +++ b/catman.8 @@ -1,4 +1,4 @@ -.\" $Id: catman.8,v 1.3 2011/12/18 18:51:01 kristaps Exp $ +.\" $Id: catman.8,v 1.4 2011/12/24 22:37:16 kristaps Exp $ .\" .\" Copyright (c) 2011 Kristaps Dzonsons .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 18 2011 $ +.Dd $Mdocdate: December 24 2011 $ .Dt CATMAN 8 .Os .Sh NAME @@ -80,11 +80,22 @@ is specified, all files are updated. .Sh ENVIRONMENT .Bl -tag -width Ds .It Ev MANPATH -Colon-separated paths overriding the default list of paths searched for +Colon-separated paths modifying the default list of paths searched for manual databases. Invalid paths, or paths without manual databases, are ignored. Overridden by .Fl M . +If +.Ev MANPATH +begins with a +.Sq \&: , +it is appended to the default list; +else if it ends with +.Sq \&: , +it is prepended to the default list; else if it contains +.Sq \&:: , +the default list is inserted between the colons. +If none of these conditions are met, it overrides the default list. .El .Sh EXIT STATUS .Ex -std diff --git a/manpath.c b/manpath.c index 3a12496d..b6d9574e 100644 --- a/manpath.c +++ b/manpath.c @@ -1,4 +1,4 @@ -/* $Id: manpath.c,v 1.7 2011/12/13 21:09:01 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 @@ -87,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[(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 } diff --git a/whatis.1 b/whatis.1 index 8ade7f45..5afba2a6 100644 --- a/whatis.1 +++ b/whatis.1 @@ -1,4 +1,4 @@ -.\" $Id: whatis.1,v 1.4 2011/12/12 02:00:49 schwarze Exp $ +.\" $Id: whatis.1,v 1.5 2011/12/24 22:37:16 kristaps Exp $ .\" .\" Copyright (c) 2011 Kristaps Dzonsons .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 12 2011 $ +.Dd $Mdocdate: December 24 2011 $ .Dt WHATIS 1 .Os .Sh NAME @@ -111,11 +111,22 @@ as follows: .Sh ENVIRONMENT .Bl -tag -width Ds .It Ev MANPATH -Colon-separated paths overriding the default list of paths searched for +Colon-separated paths modifying the default list of paths searched for manual databases. Invalid paths, or paths without manual databases, are ignored. Overridden by .Fl M . +If +.Ev MANPATH +begins with a +.Sq \&: , +it is appended to the default list; +else if it ends with +.Sq \&: , +it is prepended to the default list; else if it contains +.Sq \&:: , +the default list is inserted between the colons. +If none of these conditions are met, it overrides the default list. .El .Sh FILES .Bl -tag -width "/etc/man.conf" -compact -- cgit v1.2.3-56-ge451