From 07f257370bac1ef8ce36077bc846eafb59e88902 Mon Sep 17 00:00:00 2001 From: Cameron Katri Date: Tue, 20 Jul 2021 13:46:52 -0400 Subject: Add man(1) patch --- man-1-Use-mandoc-1-man.patch | 1852 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1852 insertions(+) create mode 100644 man-1-Use-mandoc-1-man.patch diff --git a/man-1-Use-mandoc-1-man.patch b/man-1-Use-mandoc-1-man.patch new file mode 100644 index 0000000..d4c0a79 --- /dev/null +++ b/man-1-Use-mandoc-1-man.patch @@ -0,0 +1,1852 @@ +From a867d7705c78cce909bb05496339cd84b08fbaf3 Mon Sep 17 00:00:00 2001 +From: Cameron Katri +Date: Tue, 20 Jul 2021 13:25:03 -0400 +Subject: [PATCH] man(1): Remove FreeBSD's man(1) and use the man util from + mandoc + +This still includes manpath(1), because mandoc doesn't read +configuration files from /usr/local/etc/man.d/* +--- + usr.bin/Makefile | 2 +- + usr.bin/man/Makefile | 8 - + usr.bin/man/man.1 | 411 --------- + usr.bin/man/man.sh | 1032 ---------------------- + usr.bin/mandoc/Makefile | 4 +- + usr.bin/manpath/Makefile | 7 + + usr.bin/{man => manpath}/Makefile.depend | 0 + usr.bin/{man => manpath}/man.conf.5 | 0 + usr.bin/{man => manpath}/manpath.1 | 0 + usr.bin/manpath/manpath.sh | 289 ++++++ + 10 files changed, 300 insertions(+), 1453 deletions(-) + delete mode 100644 usr.bin/man/Makefile + delete mode 100644 usr.bin/man/man.1 + delete mode 100755 usr.bin/man/man.sh + create mode 100644 usr.bin/manpath/Makefile + rename usr.bin/{man => manpath}/Makefile.depend (100%) + rename usr.bin/{man => manpath}/man.conf.5 (100%) + rename usr.bin/{man => manpath}/manpath.1 (100%) + create mode 100755 usr.bin/manpath/manpath.sh + +diff --git a/usr.bin/Makefile b/usr.bin/Makefile +index 206da7154ac..072cf1122b8 100644 +--- a/usr.bin/Makefile ++++ b/usr.bin/Makefile +@@ -235,7 +235,7 @@ SUBDIR.${MK_MAIL}+= from + SUBDIR.${MK_MAIL}+= mail + SUBDIR.${MK_MAIL}+= msgs + SUBDIR.${MK_MAKE}+= bmake +-SUBDIR.${MK_MAN_UTILS}+= man ++SUBDIR.${MK_MAN_UTILS}+= manpath + SUBDIR.${MK_NETCAT}+= nc + SUBDIR.${MK_NIS}+= ypcat + SUBDIR.${MK_NIS}+= ypmatch +diff --git a/usr.bin/man/Makefile b/usr.bin/man/Makefile +deleted file mode 100644 +index dc3748e2627..00000000000 +--- a/usr.bin/man/Makefile ++++ /dev/null +@@ -1,8 +0,0 @@ +-# $FreeBSD$ +- +-SCRIPTS= man.sh +-LINKS= ${BINDIR}/man ${BINDIR}/manpath +- +-MAN= man.1 manpath.1 man.conf.5 +- +-.include +diff --git a/usr.bin/man/man.1 b/usr.bin/man/man.1 +deleted file mode 100644 +index 42fd60a8616..00000000000 +--- a/usr.bin/man/man.1 ++++ /dev/null +@@ -1,411 +0,0 @@ +-.\"- +-.\" Copyright (c) 2010 Gordon Tetlow +-.\" All rights reserved. +-.\" +-.\" Redistribution and use in source and binary forms, with or without +-.\" modification, are permitted provided that the following conditions +-.\" are met: +-.\" 1. Redistributions of source code must retain the above copyright +-.\" notice, this list of conditions and the following disclaimer. +-.\" 2. Redistributions in binary form must reproduce the above copyright +-.\" notice, this list of conditions and the following disclaimer in the +-.\" documentation and/or other materials provided with the distribution. +-.\" +-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +-.\" SUCH DAMAGE. +-.\" +-.\" $FreeBSD$ +-.\" +-.Dd January 9, 2021 +-.Dt MAN 1 +-.Os +-.Sh NAME +-.Nm man +-.Nd display online manual documentation pages +-.Sh SYNOPSIS +-.Nm +-.Op Fl adho +-.Op Fl t | w +-.Op Fl M Ar manpath +-.Op Fl P Ar pager +-.Op Fl S Ar mansect +-.Op Fl m Ar arch Ns Op : Ns Ar machine +-.Op Fl p Op Ar eprtv +-.Op Ar mansect +-.Ar page ... +-.Nm +-.Fl f +-.Ar keyword ... +-.Nm +-.Fl k +-.Ar keyword ... +-.Sh DESCRIPTION +-The +-.Nm +-utility finds and displays online manual documentation pages. +-If +-.Ar mansect +-is provided, +-.Nm +-restricts the search to the specific section of the manual. +-.Pp +-The sections of the manual are: +-.Bl -enum -offset indent -compact +-.It +-.Fx +-General Commands Manual +-.It +-.Fx +-System Calls Manual +-.It +-.Fx +-Library Functions Manual +-.It +-.Fx +-Kernel Interfaces Manual +-.It +-.Fx +-File Formats Manual +-.It +-.Fx +-Games Manual +-.It +-.Fx +-Miscellaneous Information Manual +-.It +-.Fx +-System Manager's Manual +-.It +-.Fx +-Kernel Developer's Manual +-.El +-.Pp +-Options that +-.Nm +-understands: +-.Bl -tag -width indent +-.It Fl M Ar manpath +-Forces a specific colon separated manual path instead of the default +-search path. +-See +-.Xr manpath 1 . +-Overrides the +-.Ev MANPATH +-environment variable. +-.It Fl P Ar pager +-Use specified pager. +-Defaults to +-.Dq Li "less -sR" +-if color support is enabled, or +-.Dq Li "less -s" . +-Overrides the +-.Ev MANPAGER +-environment variable, which in turn overrides the +-.Ev PAGER +-environment variable. +-.It Fl S Ar mansect +-Restricts manual sections searched to the specified colon delimited list. +-Defaults to +-.Dq Li 1:8:2:3:3lua:n:4:5:6:7:9:l . +-Overrides the +-.Ev MANSECT +-environment variable. +-.It Fl a +-Display all manual pages instead of just the first found for each +-.Ar page +-argument. +-.It Fl d +-Print extra debugging information. +-Repeat for increased verbosity. +-Does not display the manual page. +-.It Fl f +-Emulate +-.Xr whatis 1 . +-.It Fl h +-Display short help message and exit. +-.It Fl k +-Emulate +-.Xr apropos 1 . +-.It Fl m Ar arch Ns Op : Ns Ar machine +-Override the default architecture and machine settings allowing lookup of +-other platform specific manual pages. +-See +-.Sx IMPLEMENTATION NOTES +-for how this option changes the default behavior. +-Overrides the +-.Ev MACHINE_ARCH +-and +-.Ev MACHINE +-environment variables. +-.It Fl o +-Force use of non-localized manual pages. +-See +-.Sx IMPLEMENTATION NOTES +-for how locale specific searches work. +-Overrides the +-.Ev LC_ALL , LC_CTYPE , +-and +-.Ev LANG +-environment variables. +-.It Fl p Op Cm eprtv +-Use the list of given preprocessors before running +-.Xr nroff 1 +-or +-.Xr troff 1 . +-Valid preprocessors arguments: +-.Pp +-.Bl -tag -width indent -compact +-.It Cm e +-.Xr eqn 1 +-.It Cm p +-.Xr pic 1 +-.It Cm r +-.Xr refer 1 +-.It Cm t +-.Xr tbl 1 +-.It Cm v +-.Xr vgrind 1 +-.El +-.Pp +-Overrides the +-.Ev MANROFFSEQ +-environment variable. +-.It Fl t +-Send manual page source through +-.Xr troff 1 +-allowing transformation of the manual pages to other formats. +-.It Fl w +-Display the location of the manual page instead of the contents of +-the manual page. +-.El +-.Sh IMPLEMENTATION NOTES +-.Ss Locale Specific Searches +-The +-.Nm +-utility supports manual pages in different locales. +-The search behavior is dictated by the first of three +-environment variables with a nonempty string: +-.Ev LC_ALL , LC_CTYPE , +-or +-.Ev LANG . +-If set, +-.Nm +-will search for locale specific manual pages using the following logic: +-.Pp +-.Bl -item -offset indent -compact +-.It +-.Va lang Ns _ Ns Va country Ns . Ns Va charset +-.It +-.Va lang Ns . Ns Va charset +-.It +-.Li en Ns . Ns Va charset +-.El +-.Pp +-For example, if +-.Ev LC_ALL +-is set to +-.Dq Li ja_JP.eucJP , +-.Nm +-will search the following paths when considering section 1 manual pages in +-.Pa /usr/share/man : +-.Pp +-.Bl -item -offset indent -compact +-.It +-.Pa /usr/share/man/ja_JP.eucJP/man1 +-.It +-.Pa /usr/share/man/ja.eucJP/man1 +-.It +-.Pa /usr/share/man/en.eucJP/man1 +-.It +-.Pa /usr/share/man/man1 +-.El +-.Ss Platform Specific Searches +-The +-.Nm +-utility supports platform specific manual pages. +-The search behavior is dictated by the +-.Fl m +-option or the +-.Ev MACHINE_ARCH +-and +-.Ev MACHINE +-environment variables. +-For example, if +-.Ev MACHINE_ARCH +-is set to +-.Dq Li aarch64 +-and +-.Ev MACHINE +-is set to +-.Dq Li arm64 , +-.Nm +-will search the following paths when considering section 4 manual pages in +-.Pa /usr/share/man : +-.Pp +-.Bl -item -offset indent -compact +-.It +-.Pa /usr/share/man/man4/aarch64 +-.It +-.Pa /usr/share/man/man4/arm64 +-.It +-.Pa /usr/share/man/man4 +-.El +-.Ss Displaying Specific Manual Files +-The +-.Nm +-utility also supports displaying a specific manual page if passed a path +-to the file as long as it contains a +-.Ql / +-character. +-.Sh ENVIRONMENT +-The following environment variables affect the execution of +-.Nm : +-.Bl -tag -width ".Ev MANROFFSEQ" +-.It Ev LC_ALL , LC_CTYPE , LANG +-Used to find locale specific manual pages. +-Valid values can be found by running the +-.Xr locale 1 +-command. +-See +-.Sx IMPLEMENTATION NOTES +-for details. +-Influenced by the +-.Fl o +-option. +-.It Ev MACHINE_ARCH , MACHINE +-Used to find platform specific manual pages. +-If unset, the output of +-.Dq Li "sysctl hw.machine_arch" +-and +-.Dq Li "sysctl hw.machine" +-is used respectively. +-See +-.Sx IMPLEMENTATION NOTES +-for details. +-Corresponds to the +-.Fl m +-option. +-.It Ev MANPATH +-The standard search path used by +-.Xr man 1 +-may be changed by specifying a path in the +-.Ev MANPATH +-environment variable. +-Invalid paths, or paths without manual databases, are ignored. +-Overridden by +-.Fl M . +-If +-.Ev MANPATH +-begins with a colon, it is appended to the default list; +-if it ends with a colon, it is prepended to the default list; +-or if it contains two adjacent colons, +-the standard search path is inserted between the colons. +-If none of these conditions are met, it overrides the +-standard search path. +-.It Ev MANROFFSEQ +-Used to determine the preprocessors for the manual source before running +-.Xr nroff 1 +-or +-.Xr troff 1 . +-If unset, defaults to +-.Xr tbl 1 . +-Corresponds to the +-.Fl p +-option. +-.It Ev MANSECT +-Restricts manual sections searched to the specified colon delimited list. +-Corresponds to the +-.Fl S +-option. +-.It Ev MANWIDTH +-If set to a numeric value, used as the width manpages should be displayed. +-Otherwise, if set to a special value +-.Dq Li tty , +-and output is to a terminal, +-the pages may be displayed over the whole width of the screen. +-.It Ev MANCOLOR +-If set, enables color support. +-.It Ev MANPAGER +-Program used to display files. +-.Pp +-If unset, and color support is enabled, +-.Dq Li "less -sR" +-is used. +-.Pp +-If unset, and color support is disabled, then +-.Ev PAGER +-is used. +-If that has no value either, +-.Dq Li "less -s" +-is used. +-.El +-.Sh FILES +-.Bl -tag -width indent -compact +-.It Pa /etc/man.conf +-System configuration file. +-.It Pa /usr/local/etc/man.d/*.conf +-Local configuration files. +-.El +-.Sh EXIT STATUS +-.Ex -std +-.Sh EXAMPLES +-Show the manual page for +-.Xr stat 2 : +-.Bd -literal -offset indent +-$ man 2 stat +-.Ed +-.Pp +-Show all manual pages for +-.Ql stat . +-.Bd -literal -offset indent +-$ man -a stat +-.Ed +-.Pp +-List manual pages which match the regular expression either in the title or in +-the body: +-.Bd -literal -offset indent +-$ man -k '\e.*archive' +-.Ed +-.Pp +-Show the manual page for +-.Xr ls 1 +-and use +-.Xr cat 1 +-as pager: +-.Bd -literal -offset indent +-$ man -P cat ls +-.Ed +-.Pp +-Show the location of the +-.Xr ls 1 +-manual page: +-.Bd -literal -offset indent +-$ man -w ls +-.Ed +-.Pp +-.Sh SEE ALSO +-.Xr apropos 1 , +-.Xr intro 1 , +-.Xr mandoc 1 , +-.Xr manpath 1 , +-.Xr whatis 1 , +-.Xr intro 2 , +-.Xr intro 3 , +-.Xr intro 3lua , +-.Xr intro 4 , +-.Xr intro 5 , +-.Xr man.conf 5 , +-.Xr intro 6 , +-.Xr intro 7 , +-.Xr mdoc 7 , +-.Xr intro 8 , +-.Xr intro 9 +diff --git a/usr.bin/man/man.sh b/usr.bin/man/man.sh +deleted file mode 100755 +index f31c464fcc8..00000000000 +--- a/usr.bin/man/man.sh ++++ /dev/null +@@ -1,1032 +0,0 @@ +-#! /bin/sh +-# +-# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +-# +-# Copyright (c) 2010 Gordon Tetlow +-# All rights reserved. +-# +-# Redistribution and use in source and binary forms, with or without +-# modification, are permitted provided that the following conditions +-# are met: +-# 1. Redistributions of source code must retain the above copyright +-# notice, this list of conditions and the following disclaimer. +-# 2. Redistributions in binary form must reproduce the above copyright +-# notice, this list of conditions and the following disclaimer in the +-# documentation and/or other materials provided with the distribution. +-# +-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +-# SUCH DAMAGE. +-# +-# $FreeBSD$ +- +-# Usage: add_to_manpath path +-# Adds a variable to manpath while ensuring we don't have duplicates. +-# Returns true if we were able to add something. False otherwise. +-add_to_manpath() { +- case "$manpath" in +- *:$1) decho " Skipping duplicate manpath entry $1" 2 ;; +- $1:*) decho " Skipping duplicate manpath entry $1" 2 ;; +- *:$1:*) decho " Skipping duplicate manpath entry $1" 2 ;; +- *) if [ -d "$1" ]; then +- decho " Adding $1 to manpath" +- manpath="$manpath:$1" +- return 0 +- fi +- ;; +- esac +- +- return 1 +-} +- +-# Usage: build_manlocales +-# Builds a correct MANLOCALES variable. +-build_manlocales() { +- # If the user has set manlocales, who are we to argue. +- if [ -n "$MANLOCALES" ]; then +- return +- fi +- +- parse_configs +- +- # Trim leading colon +- MANLOCALES=${manlocales#:} +- +- decho "Available manual locales: $MANLOCALES" +-} +- +-# Usage: build_manpath +-# Builds a correct MANPATH variable. +-build_manpath() { +- local IFS +- +- # If the user has set a manpath, who are we to argue. +- if [ -n "$MANPATH" ]; then +- case "$MANPATH" in +- *:) PREPEND_MANPATH=${MANPATH} ;; +- :*) APPEND_MANPATH=${MANPATH} ;; +- *::*) +- PREPEND_MANPATH=${MANPATH%%::*} +- APPEND_MANPATH=${MANPATH#*::} +- ;; +- *) return ;; +- esac +- fi +- +- if [ -n "$PREPEND_MANPATH" ]; then +- IFS=: +- for path in $PREPEND_MANPATH; do +- add_to_manpath "$path" +- done +- unset IFS +- fi +- +- search_path +- +- decho "Adding default manpath entries" +- IFS=: +- for path in $man_default_path; do +- add_to_manpath "$path" +- done +- unset IFS +- +- parse_configs +- +- if [ -n "$APPEND_MANPATH" ]; then +- IFS=: +- for path in $APPEND_MANPATH; do +- add_to_manpath "$path" +- done +- unset IFS +- fi +- # Trim leading colon +- MANPATH=${manpath#:} +- +- decho "Using manual path: $MANPATH" +-} +- +-# Usage: check_cat catglob +-# Checks to see if a cat glob is available. +-check_cat() { +- if exists "$1"; then +- use_cat=yes +- catpage=$found +- setup_cattool $catpage +- decho " Found catpage $catpage" +- return 0 +- else +- return 1 +- fi +-} +- +-# Usage: check_man manglob catglob +-# Given 2 globs, figures out if the manglob is available, if so, check to +-# see if the catglob is also available and up to date. +-check_man() { +- if exists "$1"; then +- # We have a match, check for a cat page +- manpage=$found +- setup_cattool $manpage +- decho " Found manpage $manpage" +- +- if [ -n "${use_width}" ]; then +- # non-standard width +- unset use_cat +- decho " Skipping catpage: non-standard page width" +- elif exists "$2" && is_newer $found $manpage; then +- # cat page found and is newer, use that +- use_cat=yes +- catpage=$found +- setup_cattool $catpage +- decho " Using catpage $catpage" +- else +- # no cat page or is older +- unset use_cat +- decho " Skipping catpage: not found or old" +- fi +- return 0 +- fi +- +- return 1 +-} +- +-# Usage: decho "string" [debuglevel] +-# Echoes to stderr string prefaced with -- if high enough debuglevel. +-decho() { +- if [ $debug -ge ${2:-1} ]; then +- echo "-- $1" >&2 +- fi +-} +- +-# Usage: exists glob +-# Returns true if glob resolves to a real file. +-exists() { +- local IFS +- +- # Don't accidentally inherit callers IFS (breaks perl manpages) +- unset IFS +- +- # Use some globbing tricks in the shell to determine if a file +- # exists or not. +- set +f +- set -- "$1" $1 +- set -f +- +- if [ "$1" != "$2" -a -r "$2" ]; then +- found="$2" +- return 0 +- fi +- +- return 1 +-} +- +-# Usage: find_file path section subdir pagename +-# Returns: true if something is matched and found. +-# Search the given path/section combo for a given page. +-find_file() { +- local manroot catroot mann man0 catn cat0 +- +- manroot="$1/man$2" +- catroot="$1/cat$2" +- if [ -n "$3" ]; then +- manroot="$manroot/$3" +- catroot="$catroot/$3" +- fi +- +- if [ ! -d "$manroot" -a ! -d "$catroot" ]; then +- return 1 +- fi +- decho " Searching directory $manroot" 2 +- +- mann="$manroot/$4.$2*" +- man0="$manroot/$4.0*" +- catn="$catroot/$4.$2*" +- cat0="$catroot/$4.0*" +- +- # This is the behavior as seen by the original man utility. +- # Let's not change that which doesn't seem broken. +- if check_man "$mann" "$catn"; then +- return 0 +- elif check_man "$man0" "$cat0"; then +- return 0 +- elif check_cat "$catn"; then +- return 0 +- elif check_cat "$cat0"; then +- return 0 +- fi +- +- return 1 +-} +- +-# Usage: is_newer file1 file2 +-# Returns true if file1 is newer than file2 as calculated by mtime. +-is_newer() { +- if ! [ "$1" -ot "$2" ]; then +- decho " mtime: $1 not older than $2" 3 +- return 0 +- else +- decho " mtime: $1 older than $2" 3 +- return 1 +- fi +-} +- +-# Usage: manpath_parse_args "$@" +-# Parses commandline options for manpath. +-manpath_parse_args() { +- local cmd_arg +- +- while getopts 'Ldq' cmd_arg; do +- case "${cmd_arg}" in +- L) Lflag=Lflag ;; +- d) debug=$(( $debug + 1 )) ;; +- q) qflag=qflag ;; +- *) manpath_usage ;; +- esac +- done >&2 +-} +- +-# Usage: manpath_usage +-# Display usage for the manpath(1) utility. +-manpath_usage() { +- echo 'usage: manpath [-Ldq]' >&2 +- exit 1 +-} +- +-# Usage: manpath_warnings +-# Display some warnings to stderr. +-manpath_warnings() { +- if [ -n "$Lflag" -a -n "$MANLOCALES" ]; then +- echo "(Warning: MANLOCALES environment variable set)" >&2 +- fi +-} +- +-# Usage: man_check_for_so page path +-# Returns: True if able to resolve the file, false if it ended in tears. +-# Detects the presence of the .so directive and causes the file to be +-# redirected to another source file. +-man_check_for_so() { +- local IFS line tstr +- +- unset IFS +- if [ -n "$catpage" ]; then +- return 0 +- fi +- +- # We need to loop to accommodate multiple .so directives. +- while true +- do +- line=$($cattool $manpage | head -1) +- case "$line" in +- .so*) trim "${line#.so}" +- decho "$manpage includes $tstr" +- # Glob and check for the file. +- if ! check_man "$path/$tstr*" ""; then +- decho " Unable to find $tstr" +- return 1 +- fi +- ;; +- *) break ;; +- esac +- done +- +- return 0 +-} +- +-# Usage: man_display_page +-# Display either the manpage or catpage depending on the use_cat variable +-man_display_page() { +- local IFS pipeline testline +- +- # We are called with IFS set to colon. This causes really weird +- # things to happen for the variables that have spaces in them. +- unset IFS +- +- # If we are supposed to use a catpage and we aren't using troff(1) +- # just zcat the catpage and we are done. +- if [ -z "$tflag" -a -n "$use_cat" ]; then +- if [ -n "$wflag" ]; then +- echo "$catpage (source: $manpage)" +- ret=0 +- else +- if [ $debug -gt 0 ]; then +- decho "Command: $cattool $catpage | $MANPAGER" +- ret=0 +- else +- eval "$cattool $catpage | $MANPAGER" +- ret=$? +- fi +- fi +- return +- fi +- +- # Okay, we are using the manpage, do we just need to output the +- # name of the manpage? +- if [ -n "$wflag" ]; then +- echo "$manpage" +- ret=0 +- return +- fi +- +- if [ -n "$use_width" ]; then +- mandoc_args="-O width=${use_width}" +- fi +- testline="mandoc -Tlint -Wunsupp >/dev/null 2>&1" +- if [ -n "$tflag" ]; then +- pipeline="mandoc -Tps $mandoc_args" +- else +- pipeline="mandoc $mandoc_args | $MANPAGER" +- fi +- +- if ! eval "$cattool $manpage | $testline" ;then +- if which -s groff; then +- man_display_page_groff +- else +- echo "This manpage needs groff(1) to be rendered" >&2 +- echo "First install groff(1): " >&2 +- echo "pkg install groff " >&2 +- ret=1 +- fi +- return +- fi +- +- if [ $debug -gt 0 ]; then +- decho "Command: $cattool $manpage | $pipeline" +- ret=0 +- else +- eval "$cattool $manpage | $pipeline" +- ret=$? +- fi +-} +- +-# Usage: man_display_page_groff +-# Display the manpage using groff +-man_display_page_groff() { +- local EQN NROFF PIC TBL TROFF REFER VGRIND +- local IFS l nroff_dev pipeline preproc_arg tool +- +- # So, we really do need to parse the manpage. First, figure out the +- # device flag (-T) we have to pass to eqn(1) and groff(1). Then, +- # setup the pipeline of commands based on the user's request. +- +- # If the manpage is from a particular charset, we need to setup nroff +- # to properly output for the correct device. +- case "${manpage}" in +- *.${man_charset}/*) +- # I don't pretend to know this; I'm just copying from the +- # previous version of man(1). +- case "$man_charset" in +- KOI8-R) nroff_dev="koi8-r" ;; +- ISO8859-1) nroff_dev="latin1" ;; +- ISO8859-15) nroff_dev="latin1" ;; +- UTF-8) nroff_dev="utf8" ;; +- *) nroff_dev="ascii" ;; +- esac +- +- NROFF="$NROFF -T$nroff_dev" +- EQN="$EQN -T$nroff_dev" +- +- # Iff the manpage is from the locale and not just the charset, +- # then we need to define the locale string. +- case "${manpage}" in +- */${man_lang}_${man_country}.${man_charset}/*) +- NROFF="$NROFF -dlocale=$man_lang.$man_charset" +- ;; +- */${man_lang}.${man_charset}/*) +- NROFF="$NROFF -dlocale=$man_lang.$man_charset" +- ;; +- esac +- +- # Allow language specific calls to override the default +- # set of utilities. +- l=$(echo $man_lang | tr [:lower:] [:upper:]) +- for tool in EQN NROFF PIC TBL TROFF REFER VGRIND; do +- eval "$tool=\${${tool}_$l:-\$$tool}" +- done +- ;; +- *) NROFF="$NROFF -Tascii" +- EQN="$EQN -Tascii" +- ;; +- esac +- +- if [ -z "$MANCOLOR" ]; then +- NROFF="$NROFF -P-c" +- fi +- +- if [ -n "${use_width}" ]; then +- NROFF="$NROFF -rLL=${use_width}n -rLT=${use_width}n" +- fi +- +- if [ -n "$MANROFFSEQ" ]; then +- set -- -$MANROFFSEQ +- while getopts 'egprtv' preproc_arg; do +- case "${preproc_arg}" in +- e) pipeline="$pipeline | $EQN" ;; +- g) ;; # Ignore for compatibility. +- p) pipeline="$pipeline | $PIC" ;; +- r) pipeline="$pipeline | $REFER" ;; +- t) pipeline="$pipeline | $TBL" ;; +- v) pipeline="$pipeline | $VGRIND" ;; +- *) usage ;; +- esac +- done +- # Strip the leading " | " from the resulting pipeline. +- pipeline="${pipeline#" | "}" +- else +- pipeline="$TBL" +- fi +- +- if [ -n "$tflag" ]; then +- pipeline="$pipeline | $TROFF" +- else +- pipeline="$pipeline | $NROFF | $MANPAGER" +- fi +- +- if [ $debug -gt 0 ]; then +- decho "Command: $cattool $manpage | $pipeline" +- ret=0 +- else +- eval "$cattool $manpage | $pipeline" +- ret=$? +- fi +-} +- +-# Usage: man_find_and_display page +-# Search through the manpaths looking for the given page. +-man_find_and_display() { +- local found_page locpath p path sect +- +- # Check to see if it's a file. But only if it has a '/' in +- # the filename. +- case "$1" in +- */*) if [ -f "$1" -a -r "$1" ]; then +- decho "Found a usable page, displaying that" +- unset use_cat +- manpage="$1" +- setup_cattool $manpage +- if man_check_for_so $manpage $(dirname $manpage); then +- found_page=yes +- man_display_page +- fi +- return +- fi +- ;; +- esac +- +- IFS=: +- for sect in $MANSECT; do +- decho "Searching section $sect" 2 +- for path in $MANPATH; do +- for locpath in $locpaths; do +- p=$path/$locpath +- p=${p%/.} # Rid ourselves of the trailing /. +- +- # Check if there is a MACHINE specific manpath. +- if find_file $p $sect $MACHINE "$1"; then +- if man_check_for_so $manpage $p; then +- found_page=yes +- man_display_page +- if [ -n "$aflag" ]; then +- continue 2 +- else +- return +- fi +- fi +- fi +- +- # Check if there is a MACHINE_ARCH +- # specific manpath. +- if find_file $p $sect $MACHINE_ARCH "$1"; then +- if man_check_for_so $manpage $p; then +- found_page=yes +- man_display_page +- if [ -n "$aflag" ]; then +- continue 2 +- else +- return +- fi +- fi +- fi +- +- # Check plain old manpath. +- if find_file $p $sect '' "$1"; then +- if man_check_for_so $manpage $p; then +- found_page=yes +- man_display_page +- if [ -n "$aflag" ]; then +- continue 2 +- else +- return +- fi +- fi +- fi +- done +- done +- done +- unset IFS +- +- # Nothing? Well, we are done then. +- if [ -z "$found_page" ]; then +- echo "No manual entry for $1" >&2 +- ret=1 +- return +- fi +-} +- +-# Usage: man_parse_args "$@" +-# Parses commandline options for man. +-man_parse_args() { +- local IFS cmd_arg +- +- while getopts 'M:P:S:adfhkm:op:tw' cmd_arg; do +- case "${cmd_arg}" in +- M) MANPATH=$OPTARG ;; +- P) MANPAGER=$OPTARG ;; +- S) MANSECT=$OPTARG ;; +- a) aflag=aflag ;; +- d) debug=$(( $debug + 1 )) ;; +- f) fflag=fflag ;; +- h) man_usage 0 ;; +- k) kflag=kflag ;; +- m) mflag=$OPTARG ;; +- o) oflag=oflag ;; +- p) MANROFFSEQ=$OPTARG ;; +- t) tflag=tflag ;; +- w) wflag=wflag ;; +- *) man_usage ;; +- esac +- done >&2 +- +- shift $(( $OPTIND - 1 )) +- +- # Check the args for incompatible options. +- case "${fflag}${kflag}${tflag}${wflag}" in +- fflagkflag*) echo "Incompatible options: -f and -k"; man_usage ;; +- fflag*tflag*) echo "Incompatible options: -f and -t"; man_usage ;; +- fflag*wflag) echo "Incompatible options: -f and -w"; man_usage ;; +- *kflagtflag*) echo "Incompatible options: -k and -t"; man_usage ;; +- *kflag*wflag) echo "Incompatible options: -k and -w"; man_usage ;; +- *tflagwflag) echo "Incompatible options: -t and -w"; man_usage ;; +- esac +- +- # Short circuit for whatis(1) and apropos(1) +- if [ -n "$fflag" ]; then +- do_whatis "$@" +- exit +- fi +- +- if [ -n "$kflag" ]; then +- do_apropos "$@" +- exit +- fi +- +- IFS=: +- for sect in $man_default_sections; do +- if [ "$sect" = "$1" ]; then +- decho "Detected manual section as first arg: $1" +- MANSECT="$1" +- shift +- break +- fi +- done +- unset IFS +- +- pages="$*" +-} +- +-# Usage: man_setup +-# Setup various trivial but essential variables. +-man_setup() { +- # Setup machine and architecture variables. +- if [ -n "$mflag" ]; then +- MACHINE_ARCH=${mflag%%:*} +- MACHINE=${mflag##*:} +- fi +- if [ -z "$MACHINE_ARCH" ]; then +- MACHINE_ARCH=$($SYSCTL -n hw.machine_arch) +- fi +- if [ -z "$MACHINE" ]; then +- MACHINE=$($SYSCTL -n hw.machine) +- fi +- decho "Using architecture: $MACHINE_ARCH:$MACHINE" +- +- setup_pager +- +- # Setup manual sections to search. +- if [ -z "$MANSECT" ]; then +- MANSECT=$man_default_sections +- fi +- decho "Using manual sections: $MANSECT" +- +- build_manpath +- man_setup_locale +- man_setup_width +-} +- +-# Usage: man_setup_width +-# Set up page width. +-man_setup_width() { +- local sizes +- +- unset use_width +- case "$MANWIDTH" in +- [0-9]*) +- if [ "$MANWIDTH" -gt 0 2>/dev/null ]; then +- use_width=$MANWIDTH +- fi +- ;; +- [Tt][Tt][Yy]) +- if { sizes=$($STTY size 0>&3 2>/dev/null); } 3>&1; then +- set -- $sizes +- if [ $2 -gt 80 ]; then +- use_width=$(($2-2)) +- fi +- fi +- ;; +- esac +- if [ -n "$use_width" ]; then +- decho "Using non-standard page width: ${use_width}" +- else +- decho 'Using standard page width' +- fi +-} +- +-# Usage: man_setup_locale +-# Setup necessary locale variables. +-man_setup_locale() { +- local lang_cc +- local locstr +- +- locpaths='.' +- man_charset='US-ASCII' +- +- # Setup locale information. +- if [ -n "$oflag" ]; then +- decho 'Using non-localized manpages' +- else +- # Use the locale tool to give us proper locale information +- eval $( $LOCALE ) +- +- if [ -n "$LANG" ]; then +- locstr=$LANG +- else +- locstr=$LC_CTYPE +- fi +- +- case "$locstr" in +- C) ;; +- C.UTF-8) ;; +- POSIX) ;; +- [a-z][a-z]_[A-Z][A-Z]\.*) +- lang_cc="${locstr%.*}" +- man_lang="${locstr%_*}" +- man_country="${lang_cc#*_}" +- man_charset="${locstr#*.}" +- locpaths="$locstr" +- locpaths="$locpaths:$man_lang.$man_charset" +- if [ "$man_lang" != "en" ]; then +- locpaths="$locpaths:en.$man_charset" +- fi +- locpaths="$locpaths:." +- ;; +- *) echo 'Unknown locale, assuming C' >&2 +- ;; +- esac +- fi +- +- decho "Using locale paths: $locpaths" +-} +- +-# Usage: man_usage [exitcode] +-# Display usage for the man utility. +-man_usage() { +- echo 'Usage:' +- echo ' man [-adho] [-t | -w] [-M manpath] [-P pager] [-S mansect]' +- echo ' [-m arch[:machine]] [-p [eprtv]] [mansect] page [...]' +- echo ' man -f page [...] -- Emulates whatis(1)' +- echo ' man -k page [...] -- Emulates apropos(1)' +- +- # When exit'ing with -h, it's not an error. +- exit ${1:-1} +-} +- +-# Usage: parse_configs +-# Reads the end-user adjustable config files. +-parse_configs() { +- local IFS file files +- +- if [ -n "$parsed_configs" ]; then +- return +- fi +- +- unset IFS +- +- # Read the global config first in case the user wants +- # to override config_local. +- if [ -r "$config_global" ]; then +- parse_file "$config_global" +- fi +- +- # Glob the list of files to parse. +- set +f +- files=$(echo $config_local) +- set -f +- +- for file in $files; do +- if [ -r "$file" ]; then +- parse_file "$file" +- fi +- done +- +- parsed_configs='yes' +-} +- +-# Usage: parse_file file +-# Reads the specified config files. +-parse_file() { +- local file line tstr var +- +- file="$1" +- decho "Parsing config file: $file" +- while read line; do +- decho " $line" 2 +- case "$line" in +- \#*) decho " Comment" 3 +- ;; +- MANPATH*) decho " MANPATH" 3 +- trim "${line#MANPATH}" +- add_to_manpath "$tstr" +- ;; +- MANLOCALE*) decho " MANLOCALE" 3 +- trim "${line#MANLOCALE}" +- manlocales="$manlocales:$tstr" +- ;; +- MANCONFIG*) decho " MANCONFIG" 3 +- trim "${line#MANCONFIG}" +- config_local="$tstr" +- ;; +- # Set variables in the form of FOO_BAR +- *_*[\ \ ]*) var="${line%%[\ \ ]*}" +- trim "${line#$var}" +- eval "$var=\"$tstr\"" +- decho " Parsed $var" 3 +- ;; +- esac +- done < "$file" +-} +- +-# Usage: search_path +-# Traverse $PATH looking for manpaths. +-search_path() { +- local IFS p path +- +- decho "Searching PATH for man directories" +- +- IFS=: +- for path in $PATH; do +- if add_to_manpath "$path/man"; then +- : +- elif add_to_manpath "$path/MAN"; then +- : +- else +- case "$path" in +- */bin) p="${path%/bin}/share/man" +- add_to_manpath "$p" +- p="${path%/bin}/man" +- add_to_manpath "$p" +- ;; +- esac +- fi +- done +- unset IFS +- +- if [ -z "$manpath" ]; then +- decho ' Unable to find any manpaths, using default' +- manpath=$man_default_path +- fi +-} +- +-# Usage: search_whatis cmd [arglist] +-# Do the heavy lifting for apropos/whatis +-search_whatis() { +- local IFS bad cmd f good key keywords loc opt out path rval wlist +- +- cmd="$1" +- shift +- +- whatis_parse_args "$@" +- +- build_manpath +- build_manlocales +- setup_pager +- +- if [ "$cmd" = "whatis" ]; then +- opt="-w" +- fi +- +- f='whatis' +- +- IFS=: +- for path in $MANPATH; do +- if [ \! -d "$path" ]; then +- decho "Skipping non-existent path: $path" 2 +- continue +- fi +- +- if [ -f "$path/$f" -a -r "$path/$f" ]; then +- decho "Found whatis: $path/$f" +- wlist="$wlist $path/$f" +- fi +- +- for loc in $MANLOCALES; do +- if [ -f "$path/$loc/$f" -a -r "$path/$loc/$f" ]; then +- decho "Found whatis: $path/$loc/$f" +- wlist="$wlist $path/$loc/$f" +- fi +- done +- done +- unset IFS +- +- if [ -z "$wlist" ]; then +- echo "$cmd: no whatis databases in $MANPATH" >&2 +- exit 1 +- fi +- +- rval=0 +- for key in $keywords; do +- out=$(grep -Ehi $opt -- "$key" $wlist) +- if [ -n "$out" ]; then +- good="$good\\n$out" +- else +- bad="$bad\\n$key: nothing appropriate" +- rval=1 +- fi +- done +- +- # Strip leading carriage return. +- good=${good#\\n} +- bad=${bad#\\n} +- +- if [ -n "$good" ]; then +- echo -e "$good" | $MANPAGER +- fi +- +- if [ -n "$bad" ]; then +- echo -e "$bad" >&2 +- fi +- +- exit $rval +-} +- +-# Usage: setup_cattool page +-# Finds an appropriate decompressor based on extension +-setup_cattool() { +- case "$1" in +- *.bz) cattool='/usr/bin/bzcat' ;; +- *.bz2) cattool='/usr/bin/bzcat' ;; +- *.gz) cattool='/usr/bin/zcat' ;; +- *.lzma) cattool='/usr/bin/lzcat' ;; +- *.xz) cattool='/usr/bin/xzcat' ;; +- *) cattool='/usr/bin/zcat -f' ;; +- esac +-} +- +-# Usage: setup_pager +-# Correctly sets $MANPAGER +-setup_pager() { +- # Setup pager. +- if [ -z "$MANPAGER" ]; then +- if [ -n "$MANCOLOR" ]; then +- MANPAGER="less -sR" +- else +- if [ -n "$PAGER" ]; then +- MANPAGER="$PAGER" +- else +- MANPAGER="less -s" +- fi +- fi +- fi +- decho "Using pager: $MANPAGER" +-} +- +-# Usage: trim string +-# Trims whitespace from beginning and end of a variable +-trim() { +- tstr=$1 +- while true; do +- case "$tstr" in +- [\ \ ]*) tstr="${tstr##[\ \ ]}" ;; +- *[\ \ ]) tstr="${tstr%%[\ \ ]}" ;; +- *) break ;; +- esac +- done +-} +- +-# Usage: whatis_parse_args "$@" +-# Parse commandline args for whatis and apropos. +-whatis_parse_args() { +- local cmd_arg +- while getopts 'd' cmd_arg; do +- case "${cmd_arg}" in +- d) debug=$(( $debug + 1 )) ;; +- *) whatis_usage ;; +- esac +- done >&2 +- +- shift $(( $OPTIND - 1 )) +- +- keywords="$*" +-} +- +-# Usage: whatis_usage +-# Display usage for the whatis/apropos utility. +-whatis_usage() { +- echo "usage: $cmd [-d] keyword [...]" +- exit 1 +-} +- +- +- +-# Supported commands +-do_apropos() { +- [ $(stat -f %i /usr/bin/man) -ne $(stat -f %i /usr/bin/apropos) ] && \ +- exec apropos "$@" +- search_whatis apropos "$@" +-} +- +-do_man() { +- man_parse_args "$@" +- if [ -z "$pages" ]; then +- echo 'What manual page do you want?' >&2 +- exit 1 +- fi +- man_setup +- +- for page in $pages; do +- decho "Searching for $page" +- man_find_and_display "$page" +- done +- +- exit ${ret:-0} +-} +- +-do_manpath() { +- manpath_parse_args "$@" +- if [ -z "$qflag" ]; then +- manpath_warnings +- fi +- if [ -n "$Lflag" ]; then +- build_manlocales +- echo $MANLOCALES +- else +- build_manpath +- echo $MANPATH +- fi +- exit 0 +-} +- +-do_whatis() { +- [ $(stat -f %i /usr/bin/man) -ne $(stat -f %i /usr/bin/whatis) ] && \ +- exec whatis "$@" +- search_whatis whatis "$@" +-} +- +-# User's PATH setting decides on the groff-suite to pick up. +-EQN=eqn +-NROFF='groff -S -P-h -Wall -mtty-char -man' +-PIC=pic +-REFER=refer +-TBL=tbl +-TROFF='groff -S -man' +-VGRIND=vgrind +- +-LOCALE=/usr/bin/locale +-STTY=/bin/stty +-SYSCTL=/sbin/sysctl +- +-debug=0 +-man_default_sections='1:8:2:3:3lua:n:4:5:6:7:9:l' +-man_default_path='/usr/share/man:/usr/share/openssl/man:/usr/local/share/man:/usr/local/man' +-cattool='/usr/bin/zcat -f' +- +-config_global='/etc/man.conf' +- +-# This can be overridden via a setting in /etc/man.conf. +-config_local='/usr/local/etc/man.d/*.conf' +- +-# Set noglobbing for now. I don't want spurious globbing. +-set -f +- +-case "$0" in +-*apropos) do_apropos "$@" ;; +-*manpath) do_manpath "$@" ;; +-*whatis) do_whatis "$@" ;; +-*) do_man "$@" ;; +-esac +diff --git a/usr.bin/mandoc/Makefile b/usr.bin/mandoc/Makefile +index 55e13fa6485..7b323e4ee55 100644 +--- a/usr.bin/mandoc/Makefile ++++ b/usr.bin/mandoc/Makefile +@@ -10,10 +10,12 @@ MAN= mandoc.1 eqn.7 mandoc_char.7 tbl.7 man.7 mdoc.7 roff.7 + MLINKS= mandoc.1 mdocml.1 + .if ${MK_MAN_UTILS} != no + MAN+= apropos.1 makewhatis.8 ++MAN+= man.1 + MLINKS+= apropos.1 whatis.1 + LINKS= ${BINDIR}/mandoc ${BINDIR}/whatis \ + ${BINDIR}/mandoc ${BINDIR}/makewhatis \ +- ${BINDIR}/mandoc ${BINDIR}/apropos ++ ${BINDIR}/mandoc ${BINDIR}/apropos \ ++ ${BINDIR}/mandoc ${BINDIR}/man + .elif defined(BOOTSTRAPPING) + .error "MK_MAN_UTILS should be set to yes when bootstrapping" + .endif +diff --git a/usr.bin/manpath/Makefile b/usr.bin/manpath/Makefile +new file mode 100644 +index 00000000000..20a05f68a62 +--- /dev/null ++++ b/usr.bin/manpath/Makefile +@@ -0,0 +1,7 @@ ++# $FreeBSD$ ++ ++SCRIPTS= manpath.sh ++ ++MAN= manpath.1 man.conf.5 ++ ++.include +diff --git a/usr.bin/man/Makefile.depend b/usr.bin/manpath/Makefile.depend +similarity index 100% +rename from usr.bin/man/Makefile.depend +rename to usr.bin/manpath/Makefile.depend +diff --git a/usr.bin/man/man.conf.5 b/usr.bin/manpath/man.conf.5 +similarity index 100% +rename from usr.bin/man/man.conf.5 +rename to usr.bin/manpath/man.conf.5 +diff --git a/usr.bin/man/manpath.1 b/usr.bin/manpath/manpath.1 +similarity index 100% +rename from usr.bin/man/manpath.1 +rename to usr.bin/manpath/manpath.1 +diff --git a/usr.bin/manpath/manpath.sh b/usr.bin/manpath/manpath.sh +new file mode 100755 +index 00000000000..1bec8ef4882 +--- /dev/null ++++ b/usr.bin/manpath/manpath.sh +@@ -0,0 +1,289 @@ ++#! /bin/sh ++# ++# SPDX-License-Identifier: BSD-2-Clause-FreeBSD ++# ++# Copyright (c) 2010 Gordon Tetlow ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions ++# are met: ++# 1. Redistributions of source code must retain the above copyright ++# notice, this list of conditions and the following disclaimer. ++# 2. Redistributions in binary form must reproduce the above copyright ++# notice, this list of conditions and the following disclaimer in the ++# documentation and/or other materials provided with the distribution. ++# ++# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ++# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE ++# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++# SUCH DAMAGE. ++# ++# $FreeBSD$ ++ ++# Usage: add_to_manpath path ++# Adds a variable to manpath while ensuring we don't have duplicates. ++# Returns true if we were able to add something. False otherwise. ++add_to_manpath() { ++ case "$manpath" in ++ *:$1) decho " Skipping duplicate manpath entry $1" 2 ;; ++ $1:*) decho " Skipping duplicate manpath entry $1" 2 ;; ++ *:$1:*) decho " Skipping duplicate manpath entry $1" 2 ;; ++ *) if [ -d "$1" ]; then ++ decho " Adding $1 to manpath" ++ manpath="$manpath:$1" ++ return 0 ++ fi ++ ;; ++ esac ++ ++ return 1 ++} ++ ++# Usage: build_manlocales ++# Builds a correct MANLOCALES variable. ++build_manlocales() { ++ # If the user has set manlocales, who are we to argue. ++ if [ -n "$MANLOCALES" ]; then ++ return ++ fi ++ ++ parse_configs ++ ++ # Trim leading colon ++ MANLOCALES=${manlocales#:} ++ ++ decho "Available manual locales: $MANLOCALES" ++} ++ ++# Usage: build_manpath ++# Builds a correct MANPATH variable. ++build_manpath() { ++ local IFS ++ ++ # If the user has set a manpath, who are we to argue. ++ if [ -n "$MANPATH" ]; then ++ case "$MANPATH" in ++ *:) PREPEND_MANPATH=${MANPATH} ;; ++ :*) APPEND_MANPATH=${MANPATH} ;; ++ *::*) ++ PREPEND_MANPATH=${MANPATH%%::*} ++ APPEND_MANPATH=${MANPATH#*::} ++ ;; ++ *) return ;; ++ esac ++ fi ++ ++ if [ -n "$PREPEND_MANPATH" ]; then ++ IFS=: ++ for path in $PREPEND_MANPATH; do ++ add_to_manpath "$path" ++ done ++ unset IFS ++ fi ++ ++ search_path ++ ++ decho "Adding default manpath entries" ++ IFS=: ++ for path in $man_default_path; do ++ add_to_manpath "$path" ++ done ++ unset IFS ++ ++ parse_configs ++ ++ if [ -n "$APPEND_MANPATH" ]; then ++ IFS=: ++ for path in $APPEND_MANPATH; do ++ add_to_manpath "$path" ++ done ++ unset IFS ++ fi ++ # Trim leading colon ++ MANPATH=${manpath#:} ++ ++ decho "Using manual path: $MANPATH" ++} ++ ++# Usage: decho "string" [debuglevel] ++# Echoes to stderr string prefaced with -- if high enough debuglevel. ++decho() { ++ if [ $debug -ge ${2:-1} ]; then ++ echo "-- $1" >&2 ++ fi ++} ++ ++# Usage: manpath_parse_args "$@" ++# Parses commandline options for manpath. ++manpath_parse_args() { ++ local cmd_arg ++ ++ while getopts 'Ldq' cmd_arg; do ++ case "${cmd_arg}" in ++ L) Lflag=Lflag ;; ++ d) debug=$(( $debug + 1 )) ;; ++ q) qflag=qflag ;; ++ *) manpath_usage ;; ++ esac ++ done >&2 ++} ++ ++# Usage: manpath_usage ++# Display usage for the manpath(1) utility. ++manpath_usage() { ++ echo 'usage: manpath [-Ldq]' >&2 ++ exit 1 ++} ++ ++# Usage: manpath_warnings ++# Display some warnings to stderr. ++manpath_warnings() { ++ if [ -n "$Lflag" -a -n "$MANLOCALES" ]; then ++ echo "(Warning: MANLOCALES environment variable set)" >&2 ++ fi ++} ++ ++# Usage: parse_configs ++# Reads the end-user adjustable config files. ++parse_configs() { ++ local IFS file files ++ ++ if [ -n "$parsed_configs" ]; then ++ return ++ fi ++ ++ unset IFS ++ ++ # Read the global config first in case the user wants ++ # to override config_local. ++ if [ -r "$config_global" ]; then ++ parse_file "$config_global" ++ fi ++ ++ # Glob the list of files to parse. ++ set +f ++ files=$(echo $config_local) ++ set -f ++ ++ for file in $files; do ++ if [ -r "$file" ]; then ++ parse_file "$file" ++ fi ++ done ++ ++ parsed_configs='yes' ++} ++ ++# Usage: parse_file file ++# Reads the specified config files. ++parse_file() { ++ local file line tstr var ++ ++ file="$1" ++ decho "Parsing config file: $file" ++ while read line; do ++ decho " $line" 2 ++ case "$line" in ++ \#*) decho " Comment" 3 ++ ;; ++ MANPATH*) decho " MANPATH" 3 ++ trim "${line#MANPATH}" ++ add_to_manpath "$tstr" ++ ;; ++ MANLOCALE*) decho " MANLOCALE" 3 ++ trim "${line#MANLOCALE}" ++ manlocales="$manlocales:$tstr" ++ ;; ++ MANCONFIG*) decho " MANCONFIG" 3 ++ trim "${line#MANCONFIG}" ++ config_local="$tstr" ++ ;; ++ # Set variables in the form of FOO_BAR ++ *_*[\ \ ]*) var="${line%%[\ \ ]*}" ++ trim "${line#$var}" ++ eval "$var=\"$tstr\"" ++ decho " Parsed $var" 3 ++ ;; ++ esac ++ done < "$file" ++} ++ ++# Usage: search_path ++# Traverse $PATH looking for manpaths. ++search_path() { ++ local IFS p path ++ ++ decho "Searching PATH for man directories" ++ ++ IFS=: ++ for path in $PATH; do ++ if add_to_manpath "$path/man"; then ++ : ++ elif add_to_manpath "$path/MAN"; then ++ : ++ else ++ case "$path" in ++ */bin) p="${path%/bin}/share/man" ++ add_to_manpath "$p" ++ p="${path%/bin}/man" ++ add_to_manpath "$p" ++ ;; ++ esac ++ fi ++ done ++ unset IFS ++ ++ if [ -z "$manpath" ]; then ++ decho ' Unable to find any manpaths, using default' ++ manpath=$man_default_path ++ fi ++} ++ ++# Usage: trim string ++# Trims whitespace from beginning and end of a variable ++trim() { ++ tstr=$1 ++ while true; do ++ case "$tstr" in ++ [\ \ ]*) tstr="${tstr##[\ \ ]}" ;; ++ *[\ \ ]) tstr="${tstr%%[\ \ ]}" ;; ++ *) break ;; ++ esac ++ done ++} ++ ++do_manpath() { ++ manpath_parse_args "$@" ++ if [ -z "$qflag" ]; then ++ manpath_warnings ++ fi ++ if [ -n "$Lflag" ]; then ++ build_manlocales ++ echo $MANLOCALES ++ else ++ build_manpath ++ echo $MANPATH ++ fi ++ exit 0 ++} ++ ++debug=0 ++man_default_path='/usr/share/man:/usr/share/openssl/man:/usr/local/share/man:/usr/local/man' ++ ++config_global='/etc/man.conf' ++ ++# This can be overridden via a setting in /etc/man.conf. ++config_local='/usr/local/etc/man.d/*.conf' ++ ++# Set noglobbing for now. I don't want spurious globbing. ++set -f ++ ++do_manpath "$@" +-- +2.32.0 + -- cgit v1.2.3-56-ge451