1*8462SApril.Chin@Sun.COM#!/usr/bin/ksh93
2*8462SApril.Chin@Sun.COM
3*8462SApril.Chin@Sun.COM#
4*8462SApril.Chin@Sun.COM# CDDL HEADER START
5*8462SApril.Chin@Sun.COM#
6*8462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the
7*8462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License").
8*8462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License.
9*8462SApril.Chin@Sun.COM#
10*8462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11*8462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing.
12*8462SApril.Chin@Sun.COM# See the License for the specific language governing permissions
13*8462SApril.Chin@Sun.COM# and limitations under the License.
14*8462SApril.Chin@Sun.COM#
15*8462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
16*8462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17*8462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
18*8462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
19*8462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
20*8462SApril.Chin@Sun.COM#
21*8462SApril.Chin@Sun.COM# CDDL HEADER END
22*8462SApril.Chin@Sun.COM#
23*8462SApril.Chin@Sun.COM
24*8462SApril.Chin@Sun.COM#
25*8462SApril.Chin@Sun.COM# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
26*8462SApril.Chin@Sun.COM# Use is subject to license terms.
27*8462SApril.Chin@Sun.COM#
28*8462SApril.Chin@Sun.COM
29*8462SApril.Chin@Sun.COM# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
30*8462SApril.Chin@Sun.COMexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
31*8462SApril.Chin@Sun.COM
32*8462SApril.Chin@Sun.COM# Make sure all math stuff runs in the "C" locale to avoid problems
33*8462SApril.Chin@Sun.COM# with alternative # radix point representations (e.g. ',' instead of
34*8462SApril.Chin@Sun.COM# '.' in de_DE.*-locales). This needs to be set _before_ any
35*8462SApril.Chin@Sun.COM# floating-point constants are defined in this script).
36*8462SApril.Chin@Sun.COMif [[ "${LC_ALL}" != "" ]] ; then
37*8462SApril.Chin@Sun.COM    export \
38*8462SApril.Chin@Sun.COM        LC_MONETARY="${LC_ALL}" \
39*8462SApril.Chin@Sun.COM        LC_MESSAGES="${LC_ALL}" \
40*8462SApril.Chin@Sun.COM        LC_COLLATE="${LC_ALL}" \
41*8462SApril.Chin@Sun.COM        LC_CTYPE="${LC_ALL}"
42*8462SApril.Chin@Sun.COM        unset LC_ALL
43*8462SApril.Chin@Sun.COMfi
44*8462SApril.Chin@Sun.COMexport LC_NUMERIC=C
45*8462SApril.Chin@Sun.COM
46*8462SApril.Chin@Sun.COMfunction fatal_error
47*8462SApril.Chin@Sun.COM{
48*8462SApril.Chin@Sun.COM	print -u2 "${progname}: $*"
49*8462SApril.Chin@Sun.COM	exit 1
50*8462SApril.Chin@Sun.COM}
51*8462SApril.Chin@Sun.COM
52*8462SApril.Chin@Sun.COMfunction debug_print
53*8462SApril.Chin@Sun.COM{
54*8462SApril.Chin@Sun.COM	# don't use "--" here to allow "-f" for formatting
55*8462SApril.Chin@Sun.COM#	print -u2 "$@"
56*8462SApril.Chin@Sun.COM	return 0
57*8462SApril.Chin@Sun.COM}
58*8462SApril.Chin@Sun.COM
59*8462SApril.Chin@Sun.COM# Build a list of compound variables calculated from MANPATH and
60*8462SApril.Chin@Sun.COM# locale which contain...
61*8462SApril.Chin@Sun.COM# "manpath_element" - the MANPATH element this entry belongs to
62*8462SApril.Chin@Sun.COM# "dir"             - physical directory of "manpath_element"
63*8462SApril.Chin@Sun.COM# "sect"            - section (if "manpath_element" is something like /usr/share/man,1b)
64*8462SApril.Chin@Sun.COM# ... and put the result in the array named by argv[1]
65*8462SApril.Chin@Sun.COMfunction enumerate_mandirs
66*8462SApril.Chin@Sun.COM{
67*8462SApril.Chin@Sun.COM	nameref md=$1
68*8462SApril.Chin@Sun.COM	typeset manpath_element dir sect manlang
69*8462SApril.Chin@Sun.COM	integer i=0
70*8462SApril.Chin@Sun.COM
71*8462SApril.Chin@Sun.COM	if [[ "${LC_MESSAGES}" != "" ]] ; then
72*8462SApril.Chin@Sun.COM		manlang="${LC_MESSAGES}"
73*8462SApril.Chin@Sun.COM	else
74*8462SApril.Chin@Sun.COM		manlang="${LANG}"
75*8462SApril.Chin@Sun.COM	fi
76*8462SApril.Chin@Sun.COM
77*8462SApril.Chin@Sun.COM	print -r -- "${MANPATH//:/$'\n'}" | while read manpath_element ; do
78*8462SApril.Chin@Sun.COM		# strip section from manpath elements like "/usr/share/man,1b"
79*8462SApril.Chin@Sun.COM		dir="${manpath_element/~(E)(.*),(.*)/\1}"
80*8462SApril.Chin@Sun.COM		sect="${manpath_element/~(E)(.*),(.*)/\2}"
81*8462SApril.Chin@Sun.COM		[[ "${sect}" == "${dir}" ]] && sect=""
82*8462SApril.Chin@Sun.COM
83*8462SApril.Chin@Sun.COM		if [[ "${manlang}" != "" && -d "${dir}/${manlang}" ]] ; then
84*8462SApril.Chin@Sun.COM			md+=(
85*8462SApril.Chin@Sun.COM				manpath_element="${manpath_element}"
86*8462SApril.Chin@Sun.COM				dir="${dir}/${manlang}"
87*8462SApril.Chin@Sun.COM				sect="${sect}"
88*8462SApril.Chin@Sun.COM			)
89*8462SApril.Chin@Sun.COM		fi
90*8462SApril.Chin@Sun.COM		if [[ -d "${dir}" ]] ; then
91*8462SApril.Chin@Sun.COM			md+=(
92*8462SApril.Chin@Sun.COM				manpath_element="${manpath_element}"
93*8462SApril.Chin@Sun.COM				dir="${dir}"
94*8462SApril.Chin@Sun.COM				sect="${sect}"
95*8462SApril.Chin@Sun.COM			)
96*8462SApril.Chin@Sun.COM		fi
97*8462SApril.Chin@Sun.COM	done
98*8462SApril.Chin@Sun.COM
99*8462SApril.Chin@Sun.COM	return 0
100*8462SApril.Chin@Sun.COM}
101*8462SApril.Chin@Sun.COM
102*8462SApril.Chin@Sun.COMfunction enumerate_mansects
103*8462SApril.Chin@Sun.COM{
104*8462SApril.Chin@Sun.COM	nameref ms=$1
105*8462SApril.Chin@Sun.COM	nameref mandir_node=$2
106*8462SApril.Chin@Sun.COM	typeset mancf="${mandir_node.dir}/man.cf"
107*8462SApril.Chin@Sun.COM	typeset x s l
108*8462SApril.Chin@Sun.COM
109*8462SApril.Chin@Sun.COM	if [[ "${mandir_node.sect}" != "" ]] ; then
110*8462SApril.Chin@Sun.COM		x="${mandir_node.sect}"
111*8462SApril.Chin@Sun.COM	elif [[ "${MANSECTS}" != "" ]] ; then
112*8462SApril.Chin@Sun.COM		x="${MANSECTS//,/$'\n'}"
113*8462SApril.Chin@Sun.COM	elif [[ -f "${mancf}" && -r "${mancf}" ]] ; then
114*8462SApril.Chin@Sun.COM		x="$(egrep -v '^#|^[[:space:]]*$' <"${mancf}" | egrep '^MANSECTS=')"
115*8462SApril.Chin@Sun.COM		x="${x/MANSECTS=}/"
116*8462SApril.Chin@Sun.COM		x="${x//,/$'\n'}"
117*8462SApril.Chin@Sun.COM	else
118*8462SApril.Chin@Sun.COM		x="$(cd "${mandir_node.dir}" ; \
119*8462SApril.Chin@Sun.COM			ls -1d ~(El)(sman|man).*/ | \
120*8462SApril.Chin@Sun.COM			while read s ; do \
121*8462SApril.Chin@Sun.COM				s="${s/~(El)(sman|man)/}" ; \
122*8462SApril.Chin@Sun.COM				s="${s/~(Er)\//}" ; \
123*8462SApril.Chin@Sun.COM				print -r -- "$s" ; \
124*8462SApril.Chin@Sun.COM			done)"
125*8462SApril.Chin@Sun.COM	fi
126*8462SApril.Chin@Sun.COM
127*8462SApril.Chin@Sun.COM	while read l ; do
128*8462SApril.Chin@Sun.COM		[[ "${l}" != ~(Elr)[[:blank:]]* ]] && ms+=( "${l}" )
129*8462SApril.Chin@Sun.COM#		print -- "sect=$l"
130*8462SApril.Chin@Sun.COM	done <<<"${x}"
131*8462SApril.Chin@Sun.COM
132*8462SApril.Chin@Sun.COM#	printf "enumerate_mansects: found %d entries.\n" ${#ms[@]}
133*8462SApril.Chin@Sun.COM
134*8462SApril.Chin@Sun.COM	return 0
135*8462SApril.Chin@Sun.COM}
136*8462SApril.Chin@Sun.COM
137*8462SApril.Chin@Sun.COM# wrapper around more/less
138*8462SApril.Chin@Sun.COMfunction browse_manpage
139*8462SApril.Chin@Sun.COM{
140*8462SApril.Chin@Sun.COM	typeset tmpdirname
141*8462SApril.Chin@Sun.COM	typeset doc_filename="$1"
142*8462SApril.Chin@Sun.COM	typeset doc_title="$2"
143*8462SApril.Chin@Sun.COM
144*8462SApril.Chin@Sun.COM	# squish characters in filename which are not allowed in a filesystem
145*8462SApril.Chin@Sun.COM	# (currently '/')
146*8462SApril.Chin@Sun.COM	doc_title="${doc_title//\//}"
147*8462SApril.Chin@Sun.COM
148*8462SApril.Chin@Sun.COM	# check if we have "less" installed, if not fall back to /usr/xpg4/bin/more
149*8462SApril.Chin@Sun.COM	if which less >/dev/null 2>&1 ; then
150*8462SApril.Chin@Sun.COM		# use "cat" here to avoid that "less" may try funny things
151*8462SApril.Chin@Sun.COM		cat <"${doc_filename}" | less -I -M $"--prompt=MManual\ page\ ${doc_title}\ ?ltline\ %lt?L/%L.:"
152*8462SApril.Chin@Sun.COM	else
153*8462SApril.Chin@Sun.COM		tmpdirname="$(mktemp -d "/tmp/shman_${PPID}_$$_XXXXXX")"
154*8462SApril.Chin@Sun.COM
155*8462SApril.Chin@Sun.COM		mkdir -p "${tmpdirname}" || { print -u2 -f $"Couldn't create tmp. dir %s\n" "${tmpdirname}" ; return 1 ; }
156*8462SApril.Chin@Sun.COM
157*8462SApril.Chin@Sun.COM		(
158*8462SApril.Chin@Sun.COM			cd "${tmpdirname}"
159*8462SApril.Chin@Sun.COM
160*8462SApril.Chin@Sun.COM			# note: we need to support /dev/stdin
161*8462SApril.Chin@Sun.COM			cat <"${doc_filename}" >"./${doc_title}"
162*8462SApril.Chin@Sun.COM
163*8462SApril.Chin@Sun.COM			/usr/xpg4/bin/more "${doc_title}"
164*8462SApril.Chin@Sun.COM
165*8462SApril.Chin@Sun.COM			rm -f "${doc_title}"
166*8462SApril.Chin@Sun.COM		)
167*8462SApril.Chin@Sun.COM
168*8462SApril.Chin@Sun.COM		rmdir "${tmpdirname}"
169*8462SApril.Chin@Sun.COM	fi
170*8462SApril.Chin@Sun.COM
171*8462SApril.Chin@Sun.COM	return 0
172*8462SApril.Chin@Sun.COM}
173*8462SApril.Chin@Sun.COM
174*8462SApril.Chin@Sun.COM# /usr/bin/man <keyword>
175*8462SApril.Chin@Sun.COMfunction show_manpage
176*8462SApril.Chin@Sun.COM{
177*8462SApril.Chin@Sun.COM	typeset -a -C mandirs
178*8462SApril.Chin@Sun.COM	integer i
179*8462SApril.Chin@Sun.COM	integer j
180*8462SApril.Chin@Sun.COM
181*8462SApril.Chin@Sun.COM	enumerate_mandirs mandirs
182*8462SApril.Chin@Sun.COM#	debug_print -- "${mandirs[@]}"
183*8462SApril.Chin@Sun.COM
184*8462SApril.Chin@Sun.COM	integer num_mandirs=${#mandirs[@]}
185*8462SApril.Chin@Sun.COM
186*8462SApril.Chin@Sun.COM	for ((i=0 ; i < num_mandirs ; i++ )) ; do
187*8462SApril.Chin@Sun.COM		typeset mandir="${mandirs[i].dir}"
188*8462SApril.Chin@Sun.COM
189*8462SApril.Chin@Sun.COM		typeset -a mansects
190*8462SApril.Chin@Sun.COM		enumerate_mansects mansects "mandirs[$i]"
191*8462SApril.Chin@Sun.COM
192*8462SApril.Chin@Sun.COM		integer num_mansects="${#mansects[@]}"
193*8462SApril.Chin@Sun.COM#		debug_print -- "mansects=${mansects[@]}"
194*8462SApril.Chin@Sun.COM
195*8462SApril.Chin@Sun.COM		for ((j=0 ; j < num_mansects ; j++ )) ; do
196*8462SApril.Chin@Sun.COM			typeset mansect="${mansects[j]}"
197*8462SApril.Chin@Sun.COM
198*8462SApril.Chin@Sun.COM			# try 1: SGML manpage
199*8462SApril.Chin@Sun.COM			typeset match="${mandir}/sman${mansect}/${manname}.${mansect}"
200*8462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
201*8462SApril.Chin@Sun.COM				typeset note nlink
202*8462SApril.Chin@Sun.COM
203*8462SApril.Chin@Sun.COM				# follow SGML links if needed (needs rework, including protection against link loops)
204*8462SApril.Chin@Sun.COM				while true ; do
205*8462SApril.Chin@Sun.COM					debug_print -f "match: %s\n" "${match}"
206*8462SApril.Chin@Sun.COM
207*8462SApril.Chin@Sun.COM					tmp="$(cd "${mandir}" ; LC_MESSAGES=C /usr/lib/sgml/sgml2roff "${match}")"
208*8462SApril.Chin@Sun.COM					read note nlink <<<"${tmp}"
209*8462SApril.Chin@Sun.COM
210*8462SApril.Chin@Sun.COM					if [[ "${note}" == ".so" ]] ; then
211*8462SApril.Chin@Sun.COM						match="${nlink}"
212*8462SApril.Chin@Sun.COM					else
213*8462SApril.Chin@Sun.COM						break
214*8462SApril.Chin@Sun.COM					fi
215*8462SApril.Chin@Sun.COM				done
216*8462SApril.Chin@Sun.COM
217*8462SApril.Chin@Sun.COM				tbl <<<"${tmp}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})"
218*8462SApril.Chin@Sun.COM				return 0
219*8462SApril.Chin@Sun.COM			fi
220*8462SApril.Chin@Sun.COM
221*8462SApril.Chin@Sun.COM			# try 2: troff manpage
222*8462SApril.Chin@Sun.COM			match="${mandir}/man${mansect}/${manname}.${mansect}"
223*8462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
224*8462SApril.Chin@Sun.COM				debug_print -f "match: %s\n" "${match}"
225*8462SApril.Chin@Sun.COM				tbl <"${match}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})"
226*8462SApril.Chin@Sun.COM				return 0
227*8462SApril.Chin@Sun.COM			fi
228*8462SApril.Chin@Sun.COM		done
229*8462SApril.Chin@Sun.COM		unset mansects num_mansects
230*8462SApril.Chin@Sun.COM	done
231*8462SApril.Chin@Sun.COM
232*8462SApril.Chin@Sun.COM	printf $"No manual entry for %s.\n" "${manname}"
233*8462SApril.Chin@Sun.COM	return 0
234*8462SApril.Chin@Sun.COM}
235*8462SApril.Chin@Sun.COM
236*8462SApril.Chin@Sun.COM# /usr/bin/man -l <keyword>
237*8462SApril.Chin@Sun.COMfunction list_manpages
238*8462SApril.Chin@Sun.COM{
239*8462SApril.Chin@Sun.COM	typeset -a -C mandirs
240*8462SApril.Chin@Sun.COM
241*8462SApril.Chin@Sun.COM	enumerate_mandirs mandirs
242*8462SApril.Chin@Sun.COM	#debug_print -- "${mandirs[@]}"
243*8462SApril.Chin@Sun.COM
244*8462SApril.Chin@Sun.COM	integer num_mandirs=${#mandirs[@]}
245*8462SApril.Chin@Sun.COM
246*8462SApril.Chin@Sun.COM	for ((i=0 ; i < num_mandirs ; i++ )) ; do
247*8462SApril.Chin@Sun.COM		typeset mandir="${mandirs[i].dir}"
248*8462SApril.Chin@Sun.COM
249*8462SApril.Chin@Sun.COM		typeset -a mansects
250*8462SApril.Chin@Sun.COM		enumerate_mansects mansects "mandirs[$i]"
251*8462SApril.Chin@Sun.COM
252*8462SApril.Chin@Sun.COM		integer num_mansects="${#mansects[@]}"
253*8462SApril.Chin@Sun.COM#		debug_print -- "mansects=${mansects[@]}"
254*8462SApril.Chin@Sun.COM
255*8462SApril.Chin@Sun.COM		for ((j=0 ; j < num_mansects ; j++ )) ; do
256*8462SApril.Chin@Sun.COM			mansect="${mansects[j]}"
257*8462SApril.Chin@Sun.COM
258*8462SApril.Chin@Sun.COM			# try 1: SGML manpage
259*8462SApril.Chin@Sun.COM			match="${mandir}/sman${mansect}/${manname}.${mansect}"
260*8462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
261*8462SApril.Chin@Sun.COM				printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}"
262*8462SApril.Chin@Sun.COM				continue
263*8462SApril.Chin@Sun.COM			fi
264*8462SApril.Chin@Sun.COM
265*8462SApril.Chin@Sun.COM			# try 2: troff manpage
266*8462SApril.Chin@Sun.COM			match="${mandir}/man${mansect}/${manname}.${mansect}"
267*8462SApril.Chin@Sun.COM			if [[ -r "${match}" ]] ; then
268*8462SApril.Chin@Sun.COM				printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}"
269*8462SApril.Chin@Sun.COM				continue
270*8462SApril.Chin@Sun.COM			fi
271*8462SApril.Chin@Sun.COM		done
272*8462SApril.Chin@Sun.COM		unset mansects num_mansects
273*8462SApril.Chin@Sun.COM	done
274*8462SApril.Chin@Sun.COM
275*8462SApril.Chin@Sun.COM	return 0
276*8462SApril.Chin@Sun.COM}
277*8462SApril.Chin@Sun.COM
278*8462SApril.Chin@Sun.COM# /usr/bin/appropos
279*8462SApril.Chin@Sun.COMfunction list_keywords
280*8462SApril.Chin@Sun.COM{
281*8462SApril.Chin@Sun.COM	typeset -a mandirs
282*8462SApril.Chin@Sun.COM	typeset name namesec title
283*8462SApril.Chin@Sun.COM
284*8462SApril.Chin@Sun.COM	enumerate_mandirs mandirs
285*8462SApril.Chin@Sun.COM	#debug_print -- "${mandirs[@]}"
286*8462SApril.Chin@Sun.COM
287*8462SApril.Chin@Sun.COM	integer num_mandirs=${#mandirs[@]}
288*8462SApril.Chin@Sun.COM
289*8462SApril.Chin@Sun.COM	for ((i=0 ; i < num_mandirs ; i++ )) ; do
290*8462SApril.Chin@Sun.COM		typeset mandir="${mandirs[i].dir}"
291*8462SApril.Chin@Sun.COM		typeset windexfile="${mandir}/windex"
292*8462SApril.Chin@Sun.COM
293*8462SApril.Chin@Sun.COM		if [[ ! -r "${windexfile}" ]] ; then
294*8462SApril.Chin@Sun.COM			print -u2 -f $"%s: Can't open %s.\n" "${progname}" "${windexfile}"
295*8462SApril.Chin@Sun.COM			continue
296*8462SApril.Chin@Sun.COM		fi
297*8462SApril.Chin@Sun.COM
298*8462SApril.Chin@Sun.COM		while IFS=$'\t' read name namesec title ; do
299*8462SApril.Chin@Sun.COM			if [[ "${name}${namesec}${title}" == ~(Fi)${manname} ]] ; then
300*8462SApril.Chin@Sun.COM				printf "%s\t%s\t%s\n" "${name}" "${namesec}" "${title}"
301*8462SApril.Chin@Sun.COM			fi
302*8462SApril.Chin@Sun.COM		done <"${windexfile}"
303*8462SApril.Chin@Sun.COM	done
304*8462SApril.Chin@Sun.COM
305*8462SApril.Chin@Sun.COM	return 0
306*8462SApril.Chin@Sun.COM}
307*8462SApril.Chin@Sun.COM
308*8462SApril.Chin@Sun.COMfunction usage
309*8462SApril.Chin@Sun.COM{
310*8462SApril.Chin@Sun.COM	OPTIND=0
311*8462SApril.Chin@Sun.COM	getopts -a "${progname}" "${man_usage}" OPT '-?'
312*8462SApril.Chin@Sun.COM	exit 2
313*8462SApril.Chin@Sun.COM}
314*8462SApril.Chin@Sun.COM
315*8462SApril.Chin@Sun.COM# program start
316*8462SApril.Chin@Sun.COMbuiltin basename
317*8462SApril.Chin@Sun.COMbuiltin cat
318*8462SApril.Chin@Sun.COMbuiltin date
319*8462SApril.Chin@Sun.COM
320*8462SApril.Chin@Sun.COMtypeset progname="$(basename "${0}")"
321*8462SApril.Chin@Sun.COM
322*8462SApril.Chin@Sun.COMtypeset -r man_usage=$'+
323*8462SApril.Chin@Sun.COM[-?\n@(#)\$Id: shman (Roland Mainz) 2008-10-14 \$\n]
324*8462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@nrubsig.org>]
325*8462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@sun.com>]
326*8462SApril.Chin@Sun.COM[+NAME?man - find and display reference manual pages]
327*8462SApril.Chin@Sun.COM[+DESCRIPTION?The man command displays information from the reference
328*8462SApril.Chin@Sun.COM	manuals. It displays complete manual pages that you select
329*8462SApril.Chin@Sun.COM	by name, or one-line summaries selected  either  by  keyword
330*8462SApril.Chin@Sun.COM	(-k), or by the name of an associated file (-f). If no
331*8462SApril.Chin@Sun.COM	manual page is located, man prints an error message.]
332*8462SApril.Chin@Sun.COM[+?write me.]
333*8462SApril.Chin@Sun.COM[k:keyword?Prints out one-line summaries from the windex database (table of contents) that
334*8462SApril.Chin@Sun.COM	contain any of the given  keywords. The windex database is created using
335*8462SApril.Chin@Sun.COM	catman(1M).]
336*8462SApril.Chin@Sun.COM[l:list?Lists all manual  pages  found  matching name within the search path.]
337*8462SApril.Chin@Sun.COM[M:mpath?Specifies an alternate search  path  for manual  pages. path is a colon-separated
338*8462SApril.Chin@Sun.COM	list of directories that contain  manual page directory subtrees. For example, if
339*8462SApril.Chin@Sun.COM	path  is  /usr/share/man:/usr/local/man, man  searches  for  name in the standard
340*8462SApril.Chin@Sun.COM	location, and then /usr/local/man.  When used  with  the -k or -f options, the -M
341*8462SApril.Chin@Sun.COM	option must appear first. Each directory in  the  path is assumed to contain subdirectories of the form man* or sman*  ,
342*8462SApril.Chin@Sun.COM	one  for each section. This option overrides the MANPATH environment variable.]:[path]
343*8462SApril.Chin@Sun.COM[s:section?Specifies sections of the manual for man to search. The directories searched for
344*8462SApril.Chin@Sun.COM	name are limited to those specified by section. section can be a numerical
345*8462SApril.Chin@Sun.COM	digit, perhaps followed by one or more letters to match the desired section of
346*8462SApril.Chin@Sun.COM	the manual, for example,  "3libucb". Also, section can be a word, for example,
347*8462SApril.Chin@Sun.COM	local, new, old, public. section can also be a letter.
348*8462SApril.Chin@Sun.COM	To specify multiple sections, separate each section with
349*8462SApril.Chin@Sun.COM	a comma. This option overrides the MANPATH environment variable and the man.cf
350*8462SApril.Chin@Sun.COM	file.
351*8462SApril.Chin@Sun.COM	See Search Path below for an explanation of how man conducts its search.]:[section]
352*8462SApril.Chin@Sun.COM
353*8462SApril.Chin@Sun.COMname
354*8462SApril.Chin@Sun.COM
355*8462SApril.Chin@Sun.COM[+SEE ALSO?\bksh93\b(1), \bman\b(1)]
356*8462SApril.Chin@Sun.COM'
357*8462SApril.Chin@Sun.COM
358*8462SApril.Chin@Sun.COMtypeset do_list=false
359*8462SApril.Chin@Sun.COMtypeset do_keyword=false
360*8462SApril.Chin@Sun.COM
361*8462SApril.Chin@Sun.COMwhile getopts -a "${progname}" "${man_usage}" OPT ; do
362*8462SApril.Chin@Sun.COM#    printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
363*8462SApril.Chin@Sun.COM	case ${OPT} in
364*8462SApril.Chin@Sun.COM		M)	MANPATH="${OPTARG}"	;;
365*8462SApril.Chin@Sun.COM		l)	do_list=true		;;
366*8462SApril.Chin@Sun.COM		k)	do_keyword=true		;;
367*8462SApril.Chin@Sun.COM		s)	MANSECTS="${OPTARG}" 	;;
368*8462SApril.Chin@Sun.COM		*)	usage			;;
369*8462SApril.Chin@Sun.COM	esac
370*8462SApril.Chin@Sun.COMdone
371*8462SApril.Chin@Sun.COMshift $((OPTIND-1))
372*8462SApril.Chin@Sun.COM
373*8462SApril.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
374*8462SApril.Chin@Sun.COM
375*8462SApril.Chin@Sun.COMtypeset manname="$1"
376*8462SApril.Chin@Sun.COMdebug_print -f "# searching for %s ...\n" "${manname}"
377*8462SApril.Chin@Sun.COM
378*8462SApril.Chin@Sun.COMif ${do_keyword} ; then
379*8462SApril.Chin@Sun.COM	list_keywords
380*8462SApril.Chin@Sun.COMelif ${do_list} ; then
381*8462SApril.Chin@Sun.COM	list_manpages
382*8462SApril.Chin@Sun.COMelse
383*8462SApril.Chin@Sun.COM	show_manpage
384*8462SApril.Chin@Sun.COMfi
385*8462SApril.Chin@Sun.COM
386*8462SApril.Chin@Sun.COM# todo: better exit codes
387*8462SApril.Chin@Sun.COMexit 0
388*8462SApril.Chin@Sun.COM# EOF.
389