aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man-1-Use-mandoc-1-man.patch1852
1 files changed, 1852 insertions, 0 deletions
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 <me@cameronkatri.com>
+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 <bsd.prog.mk>
+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<copy\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 <bsd.prog.mk>
+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
+