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