xref: /freebsd/usr.sbin/manctl/manctl.sh (revision cfbe890a94e0139922e11c3b49de9eb15dda53b9)
1fd785755SGeoff Rehmet#!/bin/sh
2fd785755SGeoff Rehmet#
3fd785755SGeoff Rehmet# Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University
4fd785755SGeoff Rehmet# All rights reserved.
5fd785755SGeoff Rehmet#
6fd785755SGeoff Rehmet# Redistribution and use in source and binary forms, with or without
7fd785755SGeoff Rehmet# modification, are permitted provided that the following conditions
8fd785755SGeoff Rehmet# are met:
9fd785755SGeoff Rehmet# 1. Redistributions of source code must retain the above copyright
10fd785755SGeoff Rehmet#    notice, this list of conditions and the following disclaimer.
11fd785755SGeoff Rehmet# 2. Redistributions in binary form must reproduce the above copyright
12fd785755SGeoff Rehmet#    notice, this list of conditions and the following disclaimer in the
13fd785755SGeoff Rehmet#    documentation and/or other materials provided with the distribution.
14fd785755SGeoff Rehmet# 3. All advertising materials mentioning features or use of this software
15fd785755SGeoff Rehmet#    must display the following acknowledgement:
16fd785755SGeoff Rehmet#	This product includes software developed by Geoffrey M. Rehmet
17fd785755SGeoff Rehmet# 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University
18fd785755SGeoff Rehmet#    may be used to endorse or promote products derived from this software
19fd785755SGeoff Rehmet#    without specific prior written permission.
20fd785755SGeoff Rehmet#
21fd785755SGeoff Rehmet# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22fd785755SGeoff Rehmet# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23fd785755SGeoff Rehmet# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24fd785755SGeoff Rehmet# IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE
25fd785755SGeoff Rehmet# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26fd785755SGeoff Rehmet# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27fd785755SGeoff Rehmet# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28fd785755SGeoff Rehmet# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29fd785755SGeoff Rehmet# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30fd785755SGeoff Rehmet# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31fd785755SGeoff Rehmet# SUCH DAMAGE.
32fd785755SGeoff Rehmet#
3397d92980SPeter Wemm# $FreeBSD$
34fd785755SGeoff Rehmet#
35fd785755SGeoff Rehmet# manctl:
36fd785755SGeoff Rehmet#	a utility for manipulating manual pages
37fd785755SGeoff Rehmet# functions:
38fd785755SGeoff Rehmet#	compress uncompressed man pages (elliminating .so's)
39321bd776SGeoff Rehmet#		this is now two-pass.  If possible, .so's
40321bd776SGeoff Rehmet#		are replaced with hard links
41fd785755SGeoff Rehmet#	uncompress compressed man pages
42fd785755SGeoff Rehmet#	purge old formatted man pages (not implemented yet)
43fd785755SGeoff Rehmet# Things to watch out for:
44fd785755SGeoff Rehmet#	Hard links - careful with g(un)zipping!
45fd785755SGeoff Rehmet#	.so's - throw everything through soelim before gzip!
46fd785755SGeoff Rehmet#	symlinks - ignore these - eg: expn is its own man page:
47fd785755SGeoff Rehmet#			don't want to compress this!
48fd785755SGeoff Rehmet#
49ea4da3a8SWolfram SchneiderPATH=/bin:/sbin:/usr/bin:/usr/sbin; export PATH
50fd785755SGeoff Rehmet
51fd785755SGeoff Rehmet#
52fd785755SGeoff Rehmet# purge cat? directories
53fd785755SGeoff Rehmet#
54fd785755SGeoff Rehmetdo_purge()
55fd785755SGeoff Rehmet{
56fd785755SGeoff Rehmet	echo "purge $@" 2>&1
57fd785755SGeoff Rehmet	echo "not implemented yet\n" 2>&1
58fd785755SGeoff Rehmet}
59fd785755SGeoff Rehmet
60fd785755SGeoff Rehmet
61fd785755SGeoff Rehmet#
62fd785755SGeoff Rehmet# Uncompress one page
63fd785755SGeoff Rehmet#
64fd785755SGeoff Rehmetuncompress_page()
65fd785755SGeoff Rehmet{
66fd785755SGeoff Rehmet	local	pname
67fd785755SGeoff Rehmet	local	fname
68fd785755SGeoff Rehmet	local	sect
69fd785755SGeoff Rehmet	local	ext
70fd785755SGeoff Rehmet
71fd785755SGeoff Rehmet	# break up file name
72fd785755SGeoff Rehmet	pname=$1
73fd785755SGeoff Rehmet	IFS='.' ; set $pname
74fd785755SGeoff Rehmet	# less than 3 fields - don't know what to do with this
75fd785755SGeoff Rehmet	if [ $# -lt 3 ] ; then
76fd785755SGeoff Rehmet		IFS=" 	" ; echo ignoring $pname 1>&2 ; return 0 ;
77fd785755SGeoff Rehmet	fi
78fd785755SGeoff Rehmet	# construct name and section
79fd785755SGeoff Rehmet	fname=$1 ; shift
80fd785755SGeoff Rehmet	while [ $# -gt 2 ] ; do
81fd785755SGeoff Rehmet		fname=$fname.$1
82fd785755SGeoff Rehmet		shift
83fd785755SGeoff Rehmet	done
84fd785755SGeoff Rehmet	sect=$1
85fd785755SGeoff Rehmet	ext=$2
86fd785755SGeoff Rehmet
87fd785755SGeoff Rehmet	IFS=" 	"
88fd785755SGeoff Rehmet	case "$ext" in
89fd785755SGeoff Rehmet	gz|Z) 	{
90fd785755SGeoff Rehmet		IFS=" 	" ; set `file $pname`
91fd785755SGeoff Rehmet		if [ $2 != "gzip" ] ; then
92fd785755SGeoff Rehmet			echo moving hard link $pname 1>&2
93fd785755SGeoff Rehmet			mv $pname $fname.$ext	# link
94fd785755SGeoff Rehmet		else
95fd785755SGeoff Rehmet			if [ $2 != "symbolic" ] ; then
96fd785755SGeoff Rehmet				echo gunzipping page $pname 1>&2
97cfbe890aSChris D. Faulhaber				temp=`mktemp -t manager` || exit 1
98cfbe890aSChris D. Faulhaber				gunzip -c $pname > $temp
99fd785755SGeoff Rehmet				chmod u+w $pname
100cfbe890aSChris D. Faulhaber				cp $temp $pname
101fd785755SGeoff Rehmet				chmod 444 $pname
102fd785755SGeoff Rehmet				mv $pname $fname.$sect
103cfbe890aSChris D. Faulhaber				rm -f $temp
104fd785755SGeoff Rehmet			else
105fd785755SGeoff Rehmet				# skip symlinks - this can be
106fd785755SGeoff Rehmet				# a program like expn, which is
107fd785755SGeoff Rehmet				# its own man page !
108fd785755SGeoff Rehmet				echo skipping symlink $pname 1>&2
109fd785755SGeoff Rehmet			fi
110fd785755SGeoff Rehmet		fi };;
111fd785755SGeoff Rehmet	*)	{
112fd785755SGeoff Rehmet		IFS=" 	"
113fd785755SGeoff Rehmet		echo skipping file $pname 1>&2
114fd785755SGeoff Rehmet		} ;;
115fd785755SGeoff Rehmet	esac
116fd785755SGeoff Rehmet	# reset IFS - this is important!
117fd785755SGeoff Rehmet	IFS=" 	"
118fd785755SGeoff Rehmet}
119fd785755SGeoff Rehmet
120fd785755SGeoff Rehmet
121fd785755SGeoff Rehmet#
122fd785755SGeoff Rehmet# Uncompress manpages in paths
123fd785755SGeoff Rehmet#
124fd785755SGeoff Rehmetdo_uncompress()
125fd785755SGeoff Rehmet{
126fd785755SGeoff Rehmet	local	i
127fd785755SGeoff Rehmet	local	dir
128f503299aSGeoff Rehmet	local	workdir
129fd785755SGeoff Rehmet
130f503299aSGeoff Rehmet	workdir=`pwd`
131fd785755SGeoff Rehmet	while [ $# != 0 ] ; do
132fd785755SGeoff Rehmet		if [ -d $1 ] ; then
133fd785755SGeoff Rehmet			dir=$1
134f503299aSGeoff Rehmet			cd $dir
13503863e2aSGeoff Rehmet			for i in * ; do
136fd785755SGeoff Rehmet				case $i in
137fd785755SGeoff Rehmet				*cat?)	;; # ignore cat directories
138fd785755SGeoff Rehmet				*)	{
139fd785755SGeoff Rehmet					if [ -d $i ] ; then
140fd785755SGeoff Rehmet						do_uncompress $i
141fd785755SGeoff Rehmet					else
142fd785755SGeoff Rehmet						if [ -e $i ] ; then
143fd785755SGeoff Rehmet							uncompress_page $i
144fd785755SGeoff Rehmet						fi
145fd785755SGeoff Rehmet					fi } ;;
146fd785755SGeoff Rehmet				esac
147fd785755SGeoff Rehmet			done
148f503299aSGeoff Rehmet			cd $workdir
149fd785755SGeoff Rehmet		else
150fd785755SGeoff Rehmet			echo "directory $1 not found" 1>&2
151fd785755SGeoff Rehmet		fi
152fd785755SGeoff Rehmet		shift
153fd785755SGeoff Rehmet	done
154fd785755SGeoff Rehmet}
155fd785755SGeoff Rehmet
156fd785755SGeoff Rehmet#
157321bd776SGeoff Rehmet# Remove .so's from one file
158321bd776SGeoff Rehmet#
159321bd776SGeoff Rehmetso_purge_page()
160321bd776SGeoff Rehmet{
161321bd776SGeoff Rehmet 	local	so_entries
162321bd776SGeoff Rehmet	local	lines
163321bd776SGeoff Rehmet	local	fname
164321bd776SGeoff Rehmet
165321bd776SGeoff Rehmet	so_entries=`grep "^\.so" $1 | wc -l`
166bfbd29a1SJordan K. Hubbard	if [ $so_entries -eq 0 ] ; then return 0 ; fi
167321bd776SGeoff Rehmet
168321bd776SGeoff Rehmet	# we have a page with a .so in it
169321bd776SGeoff Rehmet	echo $1 contains a .so entry 2>&1
170321bd776SGeoff Rehmet
171321bd776SGeoff Rehmet	# now check how many lines in the file
172321bd776SGeoff Rehmet	lines=`wc -l < $1`
173321bd776SGeoff Rehmet
174321bd776SGeoff Rehmet	# if the file is only one line long, we can replace it
175321bd776SGeoff Rehmet	# with a hard link!
176321bd776SGeoff Rehmet	if [ $lines -eq 1 ] ; then
177321bd776SGeoff Rehmet		fname=$1;
178321bd776SGeoff Rehmet		echo replacing $fname with a hard link
179321bd776SGeoff Rehmet		set `cat $fname`;
180321bd776SGeoff Rehmet		rm -f $fname
181321bd776SGeoff Rehmet		ln ../$2 $fname
182321bd776SGeoff Rehmet	else
183321bd776SGeoff Rehmet		echo inlining page $fname 1>&2
184cfbe890aSChris D. Faulhaber		temp=`mktemp -t manager` || exit 1
185321bd776SGeoff Rehmet		cat $fname | \
186cfbe890aSChris D. Faulhaber		(cd .. ; soelim ) > $temp
187321bd776SGeoff Rehmet		chmod u+w $fname
188cfbe890aSChris D. Faulhaber		cp $temp $fname
189321bd776SGeoff Rehmet		chmod 444 $fname
190cfbe890aSChris D. Faulhaber		rm -f $temp
191321bd776SGeoff Rehmet	fi
192321bd776SGeoff Rehmet}
193321bd776SGeoff Rehmet
194321bd776SGeoff Rehmet#
195321bd776SGeoff Rehmet# Remove .so entries from man pages
196321bd776SGeoff Rehmet#	If a page consists of just one line with a .so,
197321bd776SGeoff Rehmet#	replace it with a hard link
198321bd776SGeoff Rehmet#
199321bd776SGeoff Rehmetremove_so()
200321bd776SGeoff Rehmet{
201321bd776SGeoff Rehmet	local	pname
202321bd776SGeoff Rehmet	local	fname
203321bd776SGeoff Rehmet	local	sect
204321bd776SGeoff Rehmet
205321bd776SGeoff Rehmet	# break up file name
206321bd776SGeoff Rehmet	pname=$1
207321bd776SGeoff Rehmet	IFS='.' ; set $pname
208321bd776SGeoff Rehmet	if [ $# -lt 2 ] ; then
209321bd776SGeoff Rehmet		IFS=" 	" ; echo ignoring $pname 1>&2 ; return 0 ;
210321bd776SGeoff Rehmet	fi
211321bd776SGeoff Rehmet	# construct name and section
212321bd776SGeoff Rehmet	fname=$1 ; shift
213321bd776SGeoff Rehmet	while [ $# -gt 1 ] ; do
214321bd776SGeoff Rehmet		fname=$fname.$1
215321bd776SGeoff Rehmet		shift
216321bd776SGeoff Rehmet	done
217321bd776SGeoff Rehmet	sect=$1
218321bd776SGeoff Rehmet
219321bd776SGeoff Rehmet	IFS=" 	"
220321bd776SGeoff Rehmet	case "$sect" in
221321bd776SGeoff Rehmet	gz) 	{ echo file $pname already gzipped 1>&2 ; } ;;
222321bd776SGeoff Rehmet	Z)	{ echo file $pname already compressed 1>&2 ; } ;;
223321bd776SGeoff Rehmet	[12345678ln]*){
224321bd776SGeoff Rehmet		IFS=" 	" ; set `file $pname`
225321bd776SGeoff Rehmet		if [ $2 = "gzip" ] ; then
226321bd776SGeoff Rehmet			echo moving hard link $pname 1>&2
227321bd776SGeoff Rehmet			mv $pname $pname.gz	# link
228321bd776SGeoff Rehmet		else
229321bd776SGeoff Rehmet			if [ $2 != "symbolic" ] ; then
230321bd776SGeoff Rehmet				echo "removing .so's in  page $pname" 1>&2
231321bd776SGeoff Rehmet				so_purge_page $pname
232321bd776SGeoff Rehmet			else
233321bd776SGeoff Rehmet				# skip symlink - this can be
234321bd776SGeoff Rehmet				# a program like expn, which is
235321bd776SGeoff Rehmet				# its own man page !
236321bd776SGeoff Rehmet				echo skipping symlink $pname 1>&2
237321bd776SGeoff Rehmet			fi
238321bd776SGeoff Rehmet		fi };;
239321bd776SGeoff Rehmet	*)	{
240321bd776SGeoff Rehmet		IFS=" 	"
241321bd776SGeoff Rehmet		echo skipping file $pname 1>&2
242321bd776SGeoff Rehmet		} ;;
243321bd776SGeoff Rehmet	esac
244321bd776SGeoff Rehmet	# reset IFS - this is important!
245321bd776SGeoff Rehmet	IFS=" 	"
246321bd776SGeoff Rehmet}
247321bd776SGeoff Rehmet
248321bd776SGeoff Rehmet
249321bd776SGeoff Rehmet#
250fd785755SGeoff Rehmet# compress one page
251fd785755SGeoff Rehmet#	We need to watch out for hard links here.
252fd785755SGeoff Rehmet#
253fd785755SGeoff Rehmetcompress_page()
254fd785755SGeoff Rehmet{
255fd785755SGeoff Rehmet	local	pname
256fd785755SGeoff Rehmet	local	fname
257fd785755SGeoff Rehmet	local	sect
258fd785755SGeoff Rehmet
259fd785755SGeoff Rehmet	# break up file name
260fd785755SGeoff Rehmet	pname=$1
261fd785755SGeoff Rehmet	IFS='.' ; set $pname
262fd785755SGeoff Rehmet	if [ $# -lt 2 ] ; then
263fd785755SGeoff Rehmet		IFS=" 	" ; echo ignoring $pname 1>&2 ; return 0 ;
264fd785755SGeoff Rehmet	fi
265fd785755SGeoff Rehmet	# construct name and section
266fd785755SGeoff Rehmet	fname=$1 ; shift
267fd785755SGeoff Rehmet	while [ $# -gt 1 ] ; do
268fd785755SGeoff Rehmet		fname=$fname.$1
269fd785755SGeoff Rehmet		shift
270fd785755SGeoff Rehmet	done
271fd785755SGeoff Rehmet	sect=$1
272fd785755SGeoff Rehmet
273fd785755SGeoff Rehmet	IFS=" 	"
274fd785755SGeoff Rehmet	case "$sect" in
275fd785755SGeoff Rehmet	gz) 	{ echo file $pname already gzipped 1>&2 ; } ;;
276fd785755SGeoff Rehmet	Z)	{ echo file $pname already compressed 1>&2 ; } ;;
277fd785755SGeoff Rehmet	[12345678ln]*){
278fd785755SGeoff Rehmet		IFS=" 	" ; set `file $pname`
279fd785755SGeoff Rehmet		if [ $2 = "gzip" ] ; then
280fd785755SGeoff Rehmet			echo moving hard link $pname 1>&2
281fd785755SGeoff Rehmet			mv $pname $pname.gz	# link
282fd785755SGeoff Rehmet		else
283fd785755SGeoff Rehmet			if [ $2 != "symbolic" ] ; then
284fd785755SGeoff Rehmet				echo gzipping page $pname 1>&2
285cfbe890aSChris D. Faulhaber				temp=`mktemp -t manager` || exit 1
28603863e2aSGeoff Rehmet				cat $pname | \
287cfbe890aSChris D. Faulhaber				(cd .. ; soelim )| gzip -c -- > $temp
288fd785755SGeoff Rehmet				chmod u+w $pname
289cfbe890aSChris D. Faulhaber				cp $temp $pname
290fd785755SGeoff Rehmet				chmod 444 $pname
291fd785755SGeoff Rehmet				mv $pname $pname.gz
292cfbe890aSChris D. Faulhaber				rm -f $temp
293fd785755SGeoff Rehmet			else
294fd785755SGeoff Rehmet				# skip symlink - this can be
295fd785755SGeoff Rehmet				# a program like expn, which is
296fd785755SGeoff Rehmet				# its own man page !
297fd785755SGeoff Rehmet				echo skipping symlink $pname 1>&2
298fd785755SGeoff Rehmet			fi
299fd785755SGeoff Rehmet		fi };;
300fd785755SGeoff Rehmet	*)	{
301fd785755SGeoff Rehmet		IFS=" 	"
302fd785755SGeoff Rehmet		echo skipping file $pname 1>&2
303fd785755SGeoff Rehmet		} ;;
304fd785755SGeoff Rehmet	esac
305fd785755SGeoff Rehmet	# reset IFS - this is important!
306fd785755SGeoff Rehmet	IFS=" 	"
307fd785755SGeoff Rehmet}
308fd785755SGeoff Rehmet
309fd785755SGeoff Rehmet#
310fd785755SGeoff Rehmet# Compress man pages in paths
311fd785755SGeoff Rehmet#
312321bd776SGeoff Rehmetdo_compress_so()
313fd785755SGeoff Rehmet{
314fd785755SGeoff Rehmet	local	i
315fd785755SGeoff Rehmet	local	dir
316f503299aSGeoff Rehmet	local	workdir
317321bd776SGeoff Rehmet	local	what
318fd785755SGeoff Rehmet
319321bd776SGeoff Rehmet	what=$1
320321bd776SGeoff Rehmet	shift
321f503299aSGeoff Rehmet	workdir=`pwd`
322fd785755SGeoff Rehmet	while [ $# != 0 ] ; do
323fd785755SGeoff Rehmet		if [ -d $1 ] ; then
324fd785755SGeoff Rehmet			dir=$1
325f503299aSGeoff Rehmet			cd $dir
326f503299aSGeoff Rehmet			for i in * ; do
327fd785755SGeoff Rehmet				case $i in
328fd785755SGeoff Rehmet				*cat?)	;; # ignore cat directories
329fd785755SGeoff Rehmet				*)	{
330fd785755SGeoff Rehmet					if [ -d $i ] ; then
331321bd776SGeoff Rehmet						do_compress_so $what $i
332fd785755SGeoff Rehmet					else
333fd785755SGeoff Rehmet						if [ -e $i ] ; then
334321bd776SGeoff Rehmet							$what $i
335fd785755SGeoff Rehmet						fi
336fd785755SGeoff Rehmet					fi } ;;
337fd785755SGeoff Rehmet				esac
338fd785755SGeoff Rehmet			done
339f503299aSGeoff Rehmet			cd $workdir
340fd785755SGeoff Rehmet		else
341fd785755SGeoff Rehmet			echo "directory $1 not found" 1>&2
342fd785755SGeoff Rehmet		fi
343fd785755SGeoff Rehmet		shift
344fd785755SGeoff Rehmet	done
345fd785755SGeoff Rehmet}
346fd785755SGeoff Rehmet
347fd785755SGeoff Rehmet#
348fd785755SGeoff Rehmet# Display a usage message
349fd785755SGeoff Rehmet#
350fd785755SGeoff Rehmetctl_usage()
351fd785755SGeoff Rehmet{
352fd785755SGeoff Rehmet	echo "usage: $1 -compress <path> ... " 1>&2
353fd785755SGeoff Rehmet	echo "       $1 -uncompress <path> ... " 1>&2
354fd785755SGeoff Rehmet	echo "       $1 -purge <days> <path> ... " 1>&2
355fd785755SGeoff Rehmet	echo "       $1 -purge expire <path> ... " 1>&2
356fd785755SGeoff Rehmet	exit 1
357fd785755SGeoff Rehmet}
358fd785755SGeoff Rehmet
359321bd776SGeoff Rehmet#
360321bd776SGeoff Rehmet# remove .so's and do compress
361321bd776SGeoff Rehmet#
362321bd776SGeoff Rehmetdo_compress()
363321bd776SGeoff Rehmet{
364321bd776SGeoff Rehmet	# First remove all so's from the pages to be compressed
365321bd776SGeoff Rehmet	do_compress_so remove_so "$@"
366321bd776SGeoff Rehmet	# now do ahead and compress the pages
367321bd776SGeoff Rehmet	do_compress_so compress_page "$@"
368321bd776SGeoff Rehmet}
369fd785755SGeoff Rehmet
370fd785755SGeoff Rehmet#
371fd785755SGeoff Rehmet# dispatch options
372fd785755SGeoff Rehmet#
3732ae90f75SWolfram Schneiderif [ $# -lt 2 ] ; then ctl_usage $0 ; fi ;
374fd785755SGeoff Rehmet
375fd785755SGeoff Rehmetcase "$1" in
376fd785755SGeoff Rehmet	-compress)	shift ; do_compress "$@" ;;
377fd785755SGeoff Rehmet	-uncompress)	shift ; do_uncompress "$@" ;;
378fd785755SGeoff Rehmet	-purge)		shift ; do_purge "$@" ;;
379fd785755SGeoff Rehmet	*)		ctl_usage $0 ;;
380fd785755SGeoff Rehmetesac
381