manctl.sh revision 1370
11366Scsgr#!/bin/sh 
21366Scsgr#
31366Scsgr# Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University
41366Scsgr# All rights reserved.
51366Scsgr#
61366Scsgr# Redistribution and use in source and binary forms, with or without
71366Scsgr# modification, are permitted provided that the following conditions
81366Scsgr# are met:
91366Scsgr# 1. Redistributions of source code must retain the above copyright
101366Scsgr#    notice, this list of conditions and the following disclaimer.
111366Scsgr# 2. Redistributions in binary form must reproduce the above copyright
121366Scsgr#    notice, this list of conditions and the following disclaimer in the
131366Scsgr#    documentation and/or other materials provided with the distribution.
141366Scsgr# 3. All advertising materials mentioning features or use of this software
151366Scsgr#    must display the following acknowledgement:
161366Scsgr#	This product includes software developed by Geoffrey M. Rehmet
171366Scsgr# 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University
181366Scsgr#    may be used to endorse or promote products derived from this software
191366Scsgr#    without specific prior written permission.
201366Scsgr#
211366Scsgr# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
221366Scsgr# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
231366Scsgr# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
241366Scsgr# IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE
251366Scsgr# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
261366Scsgr# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
271366Scsgr# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
281366Scsgr# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
291366Scsgr# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
301366Scsgr# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
311366Scsgr# SUCH DAMAGE.
321366Scsgr#
331366Scsgr# $Id: manctl,v 1.3 1994/04/17 21:01:18 g89r4222 Exp $
341366Scsgr#
351366Scsgr# manctl: 
361366Scsgr#	a utility for manipulating manual pages
371366Scsgr# functions:
381366Scsgr#	compress uncompressed man pages (elliminating .so's)
391366Scsgr#	uncompress compressed man pages
401366Scsgr#	purge old formatted man pages (not implemented yet)
411366Scsgr# Things to watch out for:
421366Scsgr#	Hard links - careful with g(un)zipping!
431366Scsgr#	.so's - throw everything through soelim before gzip!
441366Scsgr#	symlinks - ignore these - eg: expn is its own man page:
451366Scsgr#			don't want to compress this!
461366Scsgr#
471366ScsgrPATH=/bin:/sbin:/usr/bin:/usr/sbin
481366Scsgr
491366Scsgr#
501366Scsgr# purge cat? directories
511366Scsgr#
521366Scsgrdo_purge()
531366Scsgr{
541366Scsgr	echo "purge $@" 2>&1
551366Scsgr	echo "not implemented yet\n" 2>&1
561366Scsgr}
571366Scsgr
581366Scsgr
591366Scsgr#
601366Scsgr# Uncompress one page
611366Scsgr#
621366Scsgruncompress_page()
631366Scsgr{
641366Scsgr	local	pname
651366Scsgr	local	fname
661366Scsgr	local	sect
671366Scsgr	local	ext
681366Scsgr
691366Scsgr	# break up file name
701366Scsgr	pname=$1
711366Scsgr	IFS='.' ; set $pname
721366Scsgr	# less than 3 fields - don't know what to do with this
731366Scsgr	if [ $# -lt 3 ] ; then 
741366Scsgr		IFS=" 	" ; echo ignoring $pname 1>&2 ; return 0 ; 
751366Scsgr	fi
761366Scsgr	# construct name and section
771366Scsgr	fname=$1 ; shift
781366Scsgr	while [ $# -gt 2 ] ; do
791366Scsgr		fname=$fname.$1
801366Scsgr		shift
811366Scsgr	done
821366Scsgr	sect=$1
831366Scsgr	ext=$2
841366Scsgr
851366Scsgr	IFS=" 	"
861366Scsgr	case "$ext" in
871366Scsgr	gz|Z) 	{ 
881366Scsgr		IFS=" 	" ; set `file $pname`
891366Scsgr		if [ $2 != "gzip" ] ; then 
901366Scsgr			echo moving hard link $pname 1>&2
911366Scsgr			mv $pname $fname.$ext	# link
921366Scsgr		else
931366Scsgr			if [ $2 != "symbolic" ] ; then
941366Scsgr				echo gunzipping page $pname 1>&2
951366Scsgr				gunzip -c $pname > /tmp/manager.$$
961366Scsgr				chmod u+w $pname
971366Scsgr				cp /tmp/manager.$$ $pname
981366Scsgr				chmod 444 $pname
991366Scsgr				mv $pname $fname.$sect
1001366Scsgr				rm /tmp/manager.$$
1011366Scsgr			else
1021366Scsgr				# skip symlinks - this can be
1031366Scsgr				# a program like expn, which is
1041366Scsgr				# its own man page !
1051366Scsgr				echo skipping symlink $pname 1>&2
1061366Scsgr			fi
1071366Scsgr		fi };;
1081366Scsgr	*)	{
1091366Scsgr		IFS=" 	"
1101366Scsgr		echo skipping file $pname 1>&2
1111366Scsgr		} ;;
1121366Scsgr	esac
1131366Scsgr	# reset IFS - this is important!
1141366Scsgr	IFS=" 	"
1151366Scsgr}
1161366Scsgr
1171366Scsgr
1181366Scsgr#
1191366Scsgr# Uncompress manpages in paths
1201366Scsgr#
1211366Scsgrdo_uncompress()
1221366Scsgr{
1231366Scsgr	local	i
1241366Scsgr	local	dir
1251369Scsgr	local	workdir
1261366Scsgr
1271369Scsgr	workdir=`pwd`
1281366Scsgr	while [ $# != 0 ] ; do
1291366Scsgr		if [ -d $1 ] ; then
1301366Scsgr			dir=$1
1311369Scsgr			cd $dir
1321370Scsgr			for i in * ; do
1331366Scsgr				case $i in
1341366Scsgr				*cat?)	;; # ignore cat directories
1351366Scsgr				*)	{
1361366Scsgr					if [ -d $i ] ; then 
1371366Scsgr						do_uncompress $i
1381366Scsgr					else
1391366Scsgr						if [ -e $i ] ; then
1401366Scsgr							uncompress_page $i
1411366Scsgr						fi
1421366Scsgr					fi } ;;
1431366Scsgr				esac
1441366Scsgr			done
1451369Scsgr			cd $workdir
1461366Scsgr		else
1471366Scsgr			echo "directory $1 not found" 1>&2
1481366Scsgr		fi
1491366Scsgr		shift
1501366Scsgr	done
1511366Scsgr}
1521366Scsgr
1531366Scsgr#
1541366Scsgr# compress one page
1551366Scsgr#	We need to watch out for hard links here.
1561366Scsgr#
1571366Scsgrcompress_page()
1581366Scsgr{
1591366Scsgr	local	pname
1601366Scsgr	local	fname
1611366Scsgr	local	sect
1621366Scsgr
1631366Scsgr	# break up file name
1641366Scsgr	pname=$1
1651366Scsgr	IFS='.' ; set $pname
1661366Scsgr	if [ $# -lt 2 ] ; then 
1671366Scsgr		IFS=" 	" ; echo ignoring $pname 1>&2 ; return 0 ; 
1681366Scsgr	fi
1691366Scsgr	# construct name and section
1701366Scsgr	fname=$1 ; shift
1711366Scsgr	while [ $# -gt 1 ] ; do
1721366Scsgr		fname=$fname.$1
1731366Scsgr		shift
1741366Scsgr	done
1751366Scsgr	sect=$1
1761366Scsgr
1771366Scsgr	IFS=" 	"
1781366Scsgr	case "$sect" in
1791366Scsgr	gz) 	{ echo file $pname already gzipped 1>&2 ; } ;;
1801366Scsgr	Z)	{ echo file $pname already compressed 1>&2 ; } ;;
1811366Scsgr	[12345678ln]*){
1821366Scsgr		IFS=" 	" ; set `file $pname`
1831366Scsgr		if [ $2 = "gzip" ] ; then 
1841366Scsgr			echo moving hard link $pname 1>&2
1851366Scsgr			mv $pname $pname.gz	# link
1861366Scsgr		else
1871366Scsgr			if [ $2 != "symbolic" ] ; then
1881366Scsgr				echo gzipping page $pname 1>&2
1891370Scsgr				cat $pname | \
1901370Scsgr				(cd .. ; soelim )| gzip -c -- > /tmp/manager.$$
1911366Scsgr				chmod u+w $pname
1921366Scsgr				cp /tmp/manager.$$ $pname
1931366Scsgr				chmod 444 $pname
1941366Scsgr				mv $pname $pname.gz
1951366Scsgr				rm /tmp/manager.$$
1961366Scsgr			else
1971366Scsgr				# skip symlink - this can be
1981366Scsgr				# a program like expn, which is
1991366Scsgr				# its own man page !
2001366Scsgr				echo skipping symlink $pname 1>&2
2011366Scsgr			fi
2021366Scsgr		fi };;
2031366Scsgr	*)	{
2041366Scsgr		IFS=" 	"
2051366Scsgr		echo skipping file $pname 1>&2
2061366Scsgr		} ;;
2071366Scsgr	esac
2081366Scsgr	# reset IFS - this is important!
2091366Scsgr	IFS=" 	"
2101366Scsgr}
2111366Scsgr
2121366Scsgr#
2131366Scsgr# Compress man pages in paths
2141366Scsgr#
2151366Scsgrdo_compress()
2161366Scsgr{
2171366Scsgr	local	i
2181366Scsgr	local	dir
2191369Scsgr	local	workdir
2201366Scsgr
2211369Scsgr	workdir=`pwd`
2221366Scsgr	while [ $# != 0 ] ; do
2231366Scsgr		if [ -d $1 ] ; then
2241366Scsgr			dir=$1
2251369Scsgr			cd $dir
2261369Scsgr			for i in * ; do
2271366Scsgr				case $i in
2281366Scsgr				*cat?)	;; # ignore cat directories
2291366Scsgr				*)	{
2301366Scsgr					if [ -d $i ] ; then 
2311366Scsgr						do_compress $i
2321366Scsgr					else 
2331366Scsgr						if [ -e $i ] ; then
2341366Scsgr							compress_page $i
2351366Scsgr						fi
2361366Scsgr					fi } ;;
2371366Scsgr				esac
2381366Scsgr			done
2391369Scsgr			cd $workdir
2401366Scsgr		else
2411366Scsgr			echo "directory $1 not found" 1>&2
2421366Scsgr		fi
2431366Scsgr		shift
2441366Scsgr	done
2451366Scsgr}
2461366Scsgr
2471366Scsgr#
2481366Scsgr# Display a usage message
2491366Scsgr#
2501366Scsgrctl_usage()
2511366Scsgr{
2521366Scsgr	echo "usage : 	$1 -compress <path> ... " 1>&2
2531366Scsgr	echo "	 	$1 -uncompress <path> ... " 1>&2
2541366Scsgr	echo "	 	$1 -purge <days> <path> ... " 1>&2
2551366Scsgr	echo "	 	$1 -purge expire <path> ... " 1>&2
2561366Scsgr	exit 1
2571366Scsgr}
2581366Scsgr
2591366Scsgr
2601366Scsgr#
2611366Scsgr# dispatch options
2621366Scsgr#
2631366Scsgrif [ $# = 0 ] ; then ; ctl_usage $0 ; fi ;
2641366Scsgr
2651366Scsgrcase "$1" in
2661366Scsgr	-compress)	shift ; do_compress "$@" ;;
2671366Scsgr	-uncompress)	shift ; do_uncompress "$@" ;;
2681366Scsgr	-purge)		shift ; do_purge "$@" ;;
2691366Scsgr	*)		ctl_usage $0 ;;
2701366Scsgresac
271