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