xref: /onnv-gate/usr/src/lib/libshell/common/scripts/shman.sh (revision 12068:08a39a083754)
18462SApril.Chin@Sun.COM#!/usr/bin/ksh93
28462SApril.Chin@Sun.COM
38462SApril.Chin@Sun.COM#
48462SApril.Chin@Sun.COM# CDDL HEADER START
58462SApril.Chin@Sun.COM#
68462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the
78462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License").
88462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License.
98462SApril.Chin@Sun.COM#
108462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
118462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing.
128462SApril.Chin@Sun.COM# See the License for the specific language governing permissions
138462SApril.Chin@Sun.COM# and limitations under the License.
148462SApril.Chin@Sun.COM#
158462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
168462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
178462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
188462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
198462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
208462SApril.Chin@Sun.COM#
218462SApril.Chin@Sun.COM# CDDL HEADER END
228462SApril.Chin@Sun.COM#
238462SApril.Chin@Sun.COM
248462SApril.Chin@Sun.COM#
25*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
268462SApril.Chin@Sun.COM#
278462SApril.Chin@Sun.COM
288462SApril.Chin@Sun.COM# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
298462SApril.Chin@Sun.COMexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
308462SApril.Chin@Sun.COM
318462SApril.Chin@Sun.COM# Make sure all math stuff runs in the "C" locale to avoid problems
328462SApril.Chin@Sun.COM# with alternative # radix point representations (e.g. ',' instead of
338462SApril.Chin@Sun.COM# '.' in de_DE.*-locales). This needs to be set _before_ any
348462SApril.Chin@Sun.COM# floating-point constants are defined in this script).
358462SApril.Chin@Sun.COMif [[ "${LC_ALL}" != "" ]] ; then
368462SApril.Chin@Sun.COM    export \
378462SApril.Chin@Sun.COM        LC_MONETARY="${LC_ALL}" \
388462SApril.Chin@Sun.COM        LC_MESSAGES="${LC_ALL}" \
398462SApril.Chin@Sun.COM        LC_COLLATE="${LC_ALL}" \
408462SApril.Chin@Sun.COM        LC_CTYPE="${LC_ALL}"
418462SApril.Chin@Sun.COM        unset LC_ALL
428462SApril.Chin@Sun.COMfi
438462SApril.Chin@Sun.COMexport LC_NUMERIC=C
448462SApril.Chin@Sun.COM
458462SApril.Chin@Sun.COMfunction fatal_error
468462SApril.Chin@Sun.COM{
478462SApril.Chin@Sun.COM	print -u2 "${progname}: $*"
488462SApril.Chin@Sun.COM	exit 1
498462SApril.Chin@Sun.COM}
508462SApril.Chin@Sun.COM
518462SApril.Chin@Sun.COMfunction debug_print
528462SApril.Chin@Sun.COM{
538462SApril.Chin@Sun.COM	# don't use "--" here to allow "-f" for formatting
548462SApril.Chin@Sun.COM#	print -u2 "$@"
558462SApril.Chin@Sun.COM	return 0
568462SApril.Chin@Sun.COM}
578462SApril.Chin@Sun.COM
588462SApril.Chin@Sun.COM# Build a list of compound variables calculated from MANPATH and
598462SApril.Chin@Sun.COM# locale which contain...
608462SApril.Chin@Sun.COM# "manpath_element" - the MANPATH element this entry belongs to
618462SApril.Chin@Sun.COM# "dir"             - physical directory of "manpath_element"
628462SApril.Chin@Sun.COM# "sect"            - section (if "manpath_element" is something like /usr/share/man,1b)
638462SApril.Chin@Sun.COM# ... and put the result in the array named by argv[1]
648462SApril.Chin@Sun.COMfunction enumerate_mandirs
658462SApril.Chin@Sun.COM{
668462SApril.Chin@Sun.COM	nameref md=$1
678462SApril.Chin@Sun.COM	typeset manpath_element dir sect manlang
688462SApril.Chin@Sun.COM	integer i=0
698462SApril.Chin@Sun.COM
708462SApril.Chin@Sun.COM	if [[ "${LC_MESSAGES}" != "" ]] ; then
718462SApril.Chin@Sun.COM		manlang="${LC_MESSAGES}"
728462SApril.Chin@Sun.COM	else
738462SApril.Chin@Sun.COM		manlang="${LANG}"
748462SApril.Chin@Sun.COM	fi
758462SApril.Chin@Sun.COM
768462SApril.Chin@Sun.COM	print -r -- "${MANPATH//:/$'\n'}" | while read manpath_element ; do
778462SApril.Chin@Sun.COM		# strip section from manpath elements like "/usr/share/man,1b"
788462SApril.Chin@Sun.COM		dir="${manpath_element/~(E)(.*),(.*)/\1}"
798462SApril.Chin@Sun.COM		sect="${manpath_element/~(E)(.*),(.*)/\2}"
808462SApril.Chin@Sun.COM		[[ "${sect}" == "${dir}" ]] && sect=""
818462SApril.Chin@Sun.COM
828462SApril.Chin@Sun.COM		if [[ "${manlang}" != "" && -d "${dir}/${manlang}" ]] ; then
838462SApril.Chin@Sun.COM			md+=(
848462SApril.Chin@Sun.COM				manpath_element="${manpath_element}"
858462SApril.Chin@Sun.COM				dir="${dir}/${manlang}"
868462SApril.Chin@Sun.COM				sect="${sect}"
878462SApril.Chin@Sun.COM			)
888462SApril.Chin@Sun.COM		fi
898462SApril.Chin@Sun.COM		if [[ -d "${dir}" ]] ; then
908462SApril.Chin@Sun.COM			md+=(
918462SApril.Chin@Sun.COM				manpath_element="${manpath_element}"
928462SApril.Chin@Sun.COM				dir="${dir}"
938462SApril.Chin@Sun.COM				sect="${sect}"
948462SApril.Chin@Sun.COM			)
958462SApril.Chin@Sun.COM		fi
968462SApril.Chin@Sun.COM	done
978462SApril.Chin@Sun.COM
988462SApril.Chin@Sun.COM	return 0
998462SApril.Chin@Sun.COM}
1008462SApril.Chin@Sun.COM
1018462SApril.Chin@Sun.COMfunction enumerate_mansects
1028462SApril.Chin@Sun.COM{
1038462SApril.Chin@Sun.COM	nameref ms=$1
1048462SApril.Chin@Sun.COM	nameref mandir_node=$2
1058462SApril.Chin@Sun.COM	typeset mancf="${mandir_node.dir}/man.cf"
1068462SApril.Chin@Sun.COM	typeset x s l
1078462SApril.Chin@Sun.COM
1088462SApril.Chin@Sun.COM	if [[ "${mandir_node.sect}" != "" ]] ; then
1098462SApril.Chin@Sun.COM		x="${mandir_node.sect}"
1108462SApril.Chin@Sun.COM	elif [[ "${MANSECTS}" != "" ]] ; then
1118462SApril.Chin@Sun.COM		x="${MANSECTS//,/$'\n'}"
1128462SApril.Chin@Sun.COM	elif [[ -f "${mancf}" && -r "${mancf}" ]] ; then
1138462SApril.Chin@Sun.COM		x="$(egrep -v '^#|^[[:space:]]*$' <"${mancf}" | egrep '^MANSECTS=')"
1148462SApril.Chin@Sun.COM		x="${x/MANSECTS=}/"
1158462SApril.Chin@Sun.COM		x="${x//,/$'\n'}"
1168462SApril.Chin@Sun.COM	else
1178462SApril.Chin@Sun.COM		x="$(cd "${mandir_node.dir}" ; \
1188462SApril.Chin@Sun.COM			ls -1d ~(El)(sman|man).*/ | \
1198462SApril.Chin@Sun.COM			while read s ; do \
1208462SApril.Chin@Sun.COM				s="${s/~(El)(sman|man)/}" ; \
1218462SApril.Chin@Sun.COM				s="${s/~(Er)\//}" ; \
1228462SApril.Chin@Sun.COM				print -r -- "$s" ; \
1238462SApril.Chin@Sun.COM			done)"
1248462SApril.Chin@Sun.COM	fi
1258462SApril.Chin@Sun.COM
1268462SApril.Chin@Sun.COM	while read l ; do
1278462SApril.Chin@Sun.COM		[[ "${l}" != ~(Elr)[[:blank:]]* ]] && ms+=( "${l}" )
1288462SApril.Chin@Sun.COM#		print -- "sect=$l"
1298462SApril.Chin@Sun.COM	done <<<"${x}"
1308462SApril.Chin@Sun.COM
1318462SApril.Chin@Sun.COM#	printf "enumerate_mansects: found %d entries.\n" ${#ms[@]}
1328462SApril.Chin@Sun.COM
1338462SApril.Chin@Sun.COM	return 0
1348462SApril.Chin@Sun.COM}
1358462SApril.Chin@Sun.COM
1368462SApril.Chin@Sun.COM# wrapper around more/less
1378462SApril.Chin@Sun.COMfunction browse_manpage
1388462SApril.Chin@Sun.COM{
1398462SApril.Chin@Sun.COM	typeset tmpdirname
1408462SApril.Chin@Sun.COM	typeset doc_filename="$1"
1418462SApril.Chin@Sun.COM	typeset doc_title="$2"
1428462SApril.Chin@Sun.COM
1438462SApril.Chin@Sun.COM	# squish characters in filename which are not allowed in a filesystem
1448462SApril.Chin@Sun.COM	# (currently '/')
1458462SApril.Chin@Sun.COM	doc_title="${doc_title//\//}"
1468462SApril.Chin@Sun.COM
1478462SApril.Chin@Sun.COM	# check if we have "less" installed, if not fall back to /usr/xpg4/bin/more
1488462SApril.Chin@Sun.COM	if which less >/dev/null 2>&1 ; then
1498462SApril.Chin@Sun.COM		# use "cat" here to avoid that "less" may try funny things
1508462SApril.Chin@Sun.COM		cat <"${doc_filename}" | less -I -M $"--prompt=MManual\ page\ ${doc_title}\ ?ltline\ %lt?L/%L.:"
1518462SApril.Chin@Sun.COM	else
152*12068SRoger.Faulkner@Oracle.COM		tmpdirname="$(mktemp -t -d "shman_${PPID}_$$_XXXXXX")"
1538462SApril.Chin@Sun.COM
1548462SApril.Chin@Sun.COM		mkdir -p "${tmpdirname}" || { print -u2 -f $"Couldn't create tmp. dir %s\n" "${tmpdirname}" ; return 1 ; }
1558462SApril.Chin@Sun.COM
1568462SApril.Chin@Sun.COM		(
1578462SApril.Chin@Sun.COM			cd "${tmpdirname}"
1588462SApril.Chin@Sun.COM
1598462SApril.Chin@Sun.COM			# note: we need to support /dev/stdin
1608462SApril.Chin@Sun.COM			cat <"${doc_filename}" >"./${doc_title}"
1618462SApril.Chin@Sun.COM
1628462SApril.Chin@Sun.COM			/usr/xpg4/bin/more "${doc_title}"
1638462SApril.Chin@Sun.COM
1648462SApril.Chin@Sun.COM			rm -f "${doc_title}"
1658462SApril.Chin@Sun.COM		)
1668462SApril.Chin@Sun.COM
1678462SApril.Chin@Sun.COM		rmdir "${tmpdirname}"
1688462SApril.Chin@Sun.COM	fi
1698462SApril.Chin@Sun.COM
1708462SApril.Chin@Sun.COM	return 0
1718462SApril.Chin@Sun.COM}
1728462SApril.Chin@Sun.COM
1738462SApril.Chin@Sun.COM# /usr/bin/man <keyword>
1748462SApril.Chin@Sun.COMfunction show_manpage
1758462SApril.Chin@Sun.COM{
17610898Sroland.mainz@nrubsig.org	compound -a mandirs
1778462SApril.Chin@Sun.COM	integer i
1788462SApril.Chin@Sun.COM	integer j
1798462SApril.Chin@Sun.COM
1808462SApril.Chin@Sun.COM	enumerate_mandirs mandirs
1818462SApril.Chin@Sun.COM#	debug_print -- "${mandirs[@]}"
1828462SApril.Chin@Sun.COM
1838462SApril.Chin@Sun.COM	integer num_mandirs=${#mandirs[@]}
1848462SApril.Chin@Sun.COM
1858462SApril.Chin@Sun.COM	for ((i=0 ; i < num_mandirs ; i++ )) ; do
1868462SApril.Chin@Sun.COM		typeset mandir="${mandirs[i].dir}"
1878462SApril.Chin@Sun.COM
1888462SApril.Chin@Sun.COM		typeset -a mansects
1898462SApril.Chin@Sun.COM		enumerate_mansects mansects "mandirs[$i]"
1908462SApril.Chin@Sun.COM
1918462SApril.Chin@Sun.COM		integer num_mansects="${#mansects[@]}"
1928462SApril.Chin@Sun.COM#		debug_print -- "mansects=${mansects[@]}"
1938462SApril.Chin@Sun.COM
1948462SApril.Chin@Sun.COM		for ((j=0 ; j < num_mansects ; j++ )) ; do
1958462SApril.Chin@Sun.COM			typeset mansect="${mansects[j]}"
1968462SApril.Chin@Sun.COM
1978462SApril.Chin@Sun.COM			# try 1: SGML manpage
1988462SApril.Chin@Sun.COM			typeset match="${mandir}/sman${mansect}/${manname}.${mansect}"
1998462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
2008462SApril.Chin@Sun.COM				typeset note nlink
2018462SApril.Chin@Sun.COM
2028462SApril.Chin@Sun.COM				# follow SGML links if needed (needs rework, including protection against link loops)
2038462SApril.Chin@Sun.COM				while true ; do
2048462SApril.Chin@Sun.COM					debug_print -f "match: %s\n" "${match}"
2058462SApril.Chin@Sun.COM
2068462SApril.Chin@Sun.COM					tmp="$(cd "${mandir}" ; LC_MESSAGES=C /usr/lib/sgml/sgml2roff "${match}")"
2078462SApril.Chin@Sun.COM					read note nlink <<<"${tmp}"
2088462SApril.Chin@Sun.COM
2098462SApril.Chin@Sun.COM					if [[ "${note}" == ".so" ]] ; then
2108462SApril.Chin@Sun.COM						match="${nlink}"
2118462SApril.Chin@Sun.COM					else
2128462SApril.Chin@Sun.COM						break
2138462SApril.Chin@Sun.COM					fi
2148462SApril.Chin@Sun.COM				done
2158462SApril.Chin@Sun.COM
2168462SApril.Chin@Sun.COM				tbl <<<"${tmp}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})"
2178462SApril.Chin@Sun.COM				return 0
2188462SApril.Chin@Sun.COM			fi
2198462SApril.Chin@Sun.COM
2208462SApril.Chin@Sun.COM			# try 2: troff manpage
2218462SApril.Chin@Sun.COM			match="${mandir}/man${mansect}/${manname}.${mansect}"
2228462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
2238462SApril.Chin@Sun.COM				debug_print -f "match: %s\n" "${match}"
2248462SApril.Chin@Sun.COM				tbl <"${match}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})"
2258462SApril.Chin@Sun.COM				return 0
2268462SApril.Chin@Sun.COM			fi
2278462SApril.Chin@Sun.COM		done
2288462SApril.Chin@Sun.COM		unset mansects num_mansects
2298462SApril.Chin@Sun.COM	done
2308462SApril.Chin@Sun.COM
2318462SApril.Chin@Sun.COM	printf $"No manual entry for %s.\n" "${manname}"
2328462SApril.Chin@Sun.COM	return 0
2338462SApril.Chin@Sun.COM}
2348462SApril.Chin@Sun.COM
2358462SApril.Chin@Sun.COM# /usr/bin/man -l <keyword>
2368462SApril.Chin@Sun.COMfunction list_manpages
2378462SApril.Chin@Sun.COM{
23810898Sroland.mainz@nrubsig.org	compound -a mandirs
2398462SApril.Chin@Sun.COM
2408462SApril.Chin@Sun.COM	enumerate_mandirs mandirs
2418462SApril.Chin@Sun.COM	#debug_print -- "${mandirs[@]}"
2428462SApril.Chin@Sun.COM
2438462SApril.Chin@Sun.COM	integer num_mandirs=${#mandirs[@]}
2448462SApril.Chin@Sun.COM
2458462SApril.Chin@Sun.COM	for ((i=0 ; i < num_mandirs ; i++ )) ; do
2468462SApril.Chin@Sun.COM		typeset mandir="${mandirs[i].dir}"
2478462SApril.Chin@Sun.COM
2488462SApril.Chin@Sun.COM		typeset -a mansects
2498462SApril.Chin@Sun.COM		enumerate_mansects mansects "mandirs[$i]"
2508462SApril.Chin@Sun.COM
2518462SApril.Chin@Sun.COM		integer num_mansects="${#mansects[@]}"
2528462SApril.Chin@Sun.COM#		debug_print -- "mansects=${mansects[@]}"
2538462SApril.Chin@Sun.COM
2548462SApril.Chin@Sun.COM		for ((j=0 ; j < num_mansects ; j++ )) ; do
2558462SApril.Chin@Sun.COM			mansect="${mansects[j]}"
2568462SApril.Chin@Sun.COM
2578462SApril.Chin@Sun.COM			# try 1: SGML manpage
2588462SApril.Chin@Sun.COM			match="${mandir}/sman${mansect}/${manname}.${mansect}"
2598462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
2608462SApril.Chin@Sun.COM				printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}"
2618462SApril.Chin@Sun.COM				continue
2628462SApril.Chin@Sun.COM			fi
2638462SApril.Chin@Sun.COM
2648462SApril.Chin@Sun.COM			# try 2: troff manpage
2658462SApril.Chin@Sun.COM			match="${mandir}/man${mansect}/${manname}.${mansect}"
2668462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
2678462SApril.Chin@Sun.COM				printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}"
2688462SApril.Chin@Sun.COM				continue
2698462SApril.Chin@Sun.COM			fi
2708462SApril.Chin@Sun.COM		done
2718462SApril.Chin@Sun.COM		unset mansects num_mansects
2728462SApril.Chin@Sun.COM	done
2738462SApril.Chin@Sun.COM
2748462SApril.Chin@Sun.COM	return 0
2758462SApril.Chin@Sun.COM}
2768462SApril.Chin@Sun.COM
2778462SApril.Chin@Sun.COM# /usr/bin/appropos
2788462SApril.Chin@Sun.COMfunction list_keywords
2798462SApril.Chin@Sun.COM{
2808462SApril.Chin@Sun.COM	typeset -a mandirs
2818462SApril.Chin@Sun.COM	typeset name namesec title
2828462SApril.Chin@Sun.COM
2838462SApril.Chin@Sun.COM	enumerate_mandirs mandirs
2848462SApril.Chin@Sun.COM	#debug_print -- "${mandirs[@]}"
2858462SApril.Chin@Sun.COM
2868462SApril.Chin@Sun.COM	integer num_mandirs=${#mandirs[@]}
2878462SApril.Chin@Sun.COM
2888462SApril.Chin@Sun.COM	for ((i=0 ; i < num_mandirs ; i++ )) ; do
2898462SApril.Chin@Sun.COM		typeset mandir="${mandirs[i].dir}"
2908462SApril.Chin@Sun.COM		typeset windexfile="${mandir}/windex"
2918462SApril.Chin@Sun.COM
2928462SApril.Chin@Sun.COM		if [[ ! -r "${windexfile}" ]] ; then
2938462SApril.Chin@Sun.COM			print -u2 -f $"%s: Can't open %s.\n" "${progname}" "${windexfile}"
2948462SApril.Chin@Sun.COM			continue
2958462SApril.Chin@Sun.COM		fi
2968462SApril.Chin@Sun.COM
2978462SApril.Chin@Sun.COM		while IFS=$'\t' read name namesec title ; do
2988462SApril.Chin@Sun.COM			if [[ "${name}${namesec}${title}" == ~(Fi)${manname} ]] ; then
2998462SApril.Chin@Sun.COM				printf "%s\t%s\t%s\n" "${name}" "${namesec}" "${title}"
3008462SApril.Chin@Sun.COM			fi
3018462SApril.Chin@Sun.COM		done <"${windexfile}"
3028462SApril.Chin@Sun.COM	done
3038462SApril.Chin@Sun.COM
3048462SApril.Chin@Sun.COM	return 0
3058462SApril.Chin@Sun.COM}
3068462SApril.Chin@Sun.COM
3078462SApril.Chin@Sun.COMfunction usage
3088462SApril.Chin@Sun.COM{
3098462SApril.Chin@Sun.COM	OPTIND=0
3108462SApril.Chin@Sun.COM	getopts -a "${progname}" "${man_usage}" OPT '-?'
3118462SApril.Chin@Sun.COM	exit 2
3128462SApril.Chin@Sun.COM}
3138462SApril.Chin@Sun.COM
3148462SApril.Chin@Sun.COM# program start
3158462SApril.Chin@Sun.COMbuiltin basename
3168462SApril.Chin@Sun.COMbuiltin cat
3178462SApril.Chin@Sun.COMbuiltin date
3188462SApril.Chin@Sun.COM
3198462SApril.Chin@Sun.COMtypeset progname="$(basename "${0}")"
3208462SApril.Chin@Sun.COM
3218462SApril.Chin@Sun.COMtypeset -r man_usage=$'+
322*12068SRoger.Faulkner@Oracle.COM[-?\n@(#)\$Id: shman (Roland Mainz) 2009-12-02 \$\n]
3238462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@nrubsig.org>]
3248462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@sun.com>]
3258462SApril.Chin@Sun.COM[+NAME?man - find and display reference manual pages]
3268462SApril.Chin@Sun.COM[+DESCRIPTION?The man command displays information from the reference
3278462SApril.Chin@Sun.COM	manuals. It displays complete manual pages that you select
3288462SApril.Chin@Sun.COM	by name, or one-line summaries selected  either  by  keyword
3298462SApril.Chin@Sun.COM	(-k), or by the name of an associated file (-f). If no
3308462SApril.Chin@Sun.COM	manual page is located, man prints an error message.]
3318462SApril.Chin@Sun.COM[+?write me.]
3328462SApril.Chin@Sun.COM[k:keyword?Prints out one-line summaries from the windex database (table of contents) that
3338462SApril.Chin@Sun.COM	contain any of the given  keywords. The windex database is created using
3348462SApril.Chin@Sun.COM	catman(1M).]
3358462SApril.Chin@Sun.COM[l:list?Lists all manual  pages  found  matching name within the search path.]
3368462SApril.Chin@Sun.COM[M:mpath?Specifies an alternate search  path  for manual  pages. path is a colon-separated
3378462SApril.Chin@Sun.COM	list of directories that contain  manual page directory subtrees. For example, if
3388462SApril.Chin@Sun.COM	path  is  /usr/share/man:/usr/local/man, man  searches  for  name in the standard
3398462SApril.Chin@Sun.COM	location, and then /usr/local/man.  When used  with  the -k or -f options, the -M
3408462SApril.Chin@Sun.COM	option must appear first. Each directory in  the  path is assumed to contain subdirectories of the form man* or sman*  ,
3418462SApril.Chin@Sun.COM	one  for each section. This option overrides the MANPATH environment variable.]:[path]
3428462SApril.Chin@Sun.COM[s:section?Specifies sections of the manual for man to search. The directories searched for
3438462SApril.Chin@Sun.COM	name are limited to those specified by section. section can be a numerical
3448462SApril.Chin@Sun.COM	digit, perhaps followed by one or more letters to match the desired section of
3458462SApril.Chin@Sun.COM	the manual, for example,  "3libucb". Also, section can be a word, for example,
3468462SApril.Chin@Sun.COM	local, new, old, public. section can also be a letter.
3478462SApril.Chin@Sun.COM	To specify multiple sections, separate each section with
3488462SApril.Chin@Sun.COM	a comma. This option overrides the MANPATH environment variable and the man.cf
3498462SApril.Chin@Sun.COM	file.
3508462SApril.Chin@Sun.COM	See Search Path below for an explanation of how man conducts its search.]:[section]
3518462SApril.Chin@Sun.COM
3528462SApril.Chin@Sun.COMname
3538462SApril.Chin@Sun.COM
3548462SApril.Chin@Sun.COM[+SEE ALSO?\bksh93\b(1), \bman\b(1)]
3558462SApril.Chin@Sun.COM'
3568462SApril.Chin@Sun.COM
3578462SApril.Chin@Sun.COMtypeset do_list=false
3588462SApril.Chin@Sun.COMtypeset do_keyword=false
3598462SApril.Chin@Sun.COM
3608462SApril.Chin@Sun.COMwhile getopts -a "${progname}" "${man_usage}" OPT ; do
3618462SApril.Chin@Sun.COM#    printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
3628462SApril.Chin@Sun.COM	case ${OPT} in
3638462SApril.Chin@Sun.COM		M)	MANPATH="${OPTARG}"	;;
3648462SApril.Chin@Sun.COM		l)	do_list=true		;;
3658462SApril.Chin@Sun.COM		k)	do_keyword=true		;;
3668462SApril.Chin@Sun.COM		s)	MANSECTS="${OPTARG}" 	;;
3678462SApril.Chin@Sun.COM		*)	usage			;;
3688462SApril.Chin@Sun.COM	esac
3698462SApril.Chin@Sun.COMdone
3708462SApril.Chin@Sun.COMshift $((OPTIND-1))
3718462SApril.Chin@Sun.COM
3728462SApril.Chin@Sun.COM# cd /usr/man; LC_MESSAGES=C /usr/lib/sgml/sgml2roff /usr/man/sman1as/asadmin-list-timers.1as  | tbl | eqn | nroff -u0 -Tlp -man -  | col -x > /tmp/mpLQaqac
3738462SApril.Chin@Sun.COM
37410898Sroland.mainz@nrubsig.org# prechecks
37510898Sroland.mainz@nrubsig.org(( $# > 0 )) || usage
37610898Sroland.mainz@nrubsig.org
37710898Sroland.mainz@nrubsig.org# process arguments
37810898Sroland.mainz@nrubsig.orgwhile (( $# > 0 )) ; do
37910898Sroland.mainz@nrubsig.org	typeset manname="$1"
38010898Sroland.mainz@nrubsig.org	shift
3818462SApril.Chin@Sun.COM
38210898Sroland.mainz@nrubsig.org	debug_print -f "# searching for %s ...\n" "${manname}"
38310898Sroland.mainz@nrubsig.org
38410898Sroland.mainz@nrubsig.org	if ${do_keyword} ; then
38510898Sroland.mainz@nrubsig.org		list_keywords
38610898Sroland.mainz@nrubsig.org	elif ${do_list} ; then
38710898Sroland.mainz@nrubsig.org		list_manpages
38810898Sroland.mainz@nrubsig.org	else
38910898Sroland.mainz@nrubsig.org		show_manpage
39010898Sroland.mainz@nrubsig.org	fi
39110898Sroland.mainz@nrubsig.orgdone
3928462SApril.Chin@Sun.COM
3938462SApril.Chin@Sun.COM# todo: better exit codes
3948462SApril.Chin@Sun.COMexit 0
3958462SApril.Chin@Sun.COM# EOF.
396