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# 33fd785755SGeoff Rehmet# $Id: manctl,v 1.3 1994/04/17 21:01:18 g89r4222 Exp $ 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) 39fd785755SGeoff Rehmet# uncompress compressed man pages 40fd785755SGeoff Rehmet# purge old formatted man pages (not implemented yet) 41fd785755SGeoff Rehmet# Things to watch out for: 42fd785755SGeoff Rehmet# Hard links - careful with g(un)zipping! 43fd785755SGeoff Rehmet# .so's - throw everything through soelim before gzip! 44fd785755SGeoff Rehmet# symlinks - ignore these - eg: expn is its own man page: 45fd785755SGeoff Rehmet# don't want to compress this! 46fd785755SGeoff Rehmet# 47fd785755SGeoff RehmetPATH=/bin:/sbin:/usr/bin:/usr/sbin 48fd785755SGeoff Rehmet 49fd785755SGeoff Rehmet# 50fd785755SGeoff Rehmet# purge cat? directories 51fd785755SGeoff Rehmet# 52fd785755SGeoff Rehmetdo_purge() 53fd785755SGeoff Rehmet{ 54fd785755SGeoff Rehmet echo "purge $@" 2>&1 55fd785755SGeoff Rehmet echo "not implemented yet\n" 2>&1 56fd785755SGeoff Rehmet} 57fd785755SGeoff Rehmet 58fd785755SGeoff Rehmet 59fd785755SGeoff Rehmet# 60fd785755SGeoff Rehmet# Uncompress one page 61fd785755SGeoff Rehmet# 62fd785755SGeoff Rehmetuncompress_page() 63fd785755SGeoff Rehmet{ 64fd785755SGeoff Rehmet local pname 65fd785755SGeoff Rehmet local fname 66fd785755SGeoff Rehmet local sect 67fd785755SGeoff Rehmet local ext 68fd785755SGeoff Rehmet 69fd785755SGeoff Rehmet # break up file name 70fd785755SGeoff Rehmet pname=$1 71fd785755SGeoff Rehmet IFS='.' ; set $pname 72fd785755SGeoff Rehmet # less than 3 fields - don't know what to do with this 73fd785755SGeoff Rehmet if [ $# -lt 3 ] ; then 74fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 75fd785755SGeoff Rehmet fi 76fd785755SGeoff Rehmet # construct name and section 77fd785755SGeoff Rehmet fname=$1 ; shift 78fd785755SGeoff Rehmet while [ $# -gt 2 ] ; do 79fd785755SGeoff Rehmet fname=$fname.$1 80fd785755SGeoff Rehmet shift 81fd785755SGeoff Rehmet done 82fd785755SGeoff Rehmet sect=$1 83fd785755SGeoff Rehmet ext=$2 84fd785755SGeoff Rehmet 85fd785755SGeoff Rehmet IFS=" " 86fd785755SGeoff Rehmet case "$ext" in 87fd785755SGeoff Rehmet gz|Z) { 88fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 89fd785755SGeoff Rehmet if [ $2 != "gzip" ] ; then 90fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 91fd785755SGeoff Rehmet mv $pname $fname.$ext # link 92fd785755SGeoff Rehmet else 93fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 94fd785755SGeoff Rehmet echo gunzipping page $pname 1>&2 95fd785755SGeoff Rehmet gunzip -c $pname > /tmp/manager.$$ 96fd785755SGeoff Rehmet chmod u+w $pname 97fd785755SGeoff Rehmet cp /tmp/manager.$$ $pname 98fd785755SGeoff Rehmet chmod 444 $pname 99fd785755SGeoff Rehmet mv $pname $fname.$sect 100fd785755SGeoff Rehmet rm /tmp/manager.$$ 101fd785755SGeoff Rehmet else 102fd785755SGeoff Rehmet # skip symlinks - this can be 103fd785755SGeoff Rehmet # a program like expn, which is 104fd785755SGeoff Rehmet # its own man page ! 105fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 106fd785755SGeoff Rehmet fi 107fd785755SGeoff Rehmet fi };; 108fd785755SGeoff Rehmet *) { 109fd785755SGeoff Rehmet IFS=" " 110fd785755SGeoff Rehmet echo skipping file $pname 1>&2 111fd785755SGeoff Rehmet } ;; 112fd785755SGeoff Rehmet esac 113fd785755SGeoff Rehmet # reset IFS - this is important! 114fd785755SGeoff Rehmet IFS=" " 115fd785755SGeoff Rehmet} 116fd785755SGeoff Rehmet 117fd785755SGeoff Rehmet 118fd785755SGeoff Rehmet# 119fd785755SGeoff Rehmet# Uncompress manpages in paths 120fd785755SGeoff Rehmet# 121fd785755SGeoff Rehmetdo_uncompress() 122fd785755SGeoff Rehmet{ 123fd785755SGeoff Rehmet local i 124fd785755SGeoff Rehmet local dir 125f503299aSGeoff Rehmet local workdir 126fd785755SGeoff Rehmet 127f503299aSGeoff Rehmet workdir=`pwd` 128fd785755SGeoff Rehmet while [ $# != 0 ] ; do 129fd785755SGeoff Rehmet if [ -d $1 ] ; then 130fd785755SGeoff Rehmet dir=$1 131f503299aSGeoff Rehmet cd $dir 13203863e2aSGeoff Rehmet for i in * ; do 133fd785755SGeoff Rehmet case $i in 134fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 135fd785755SGeoff Rehmet *) { 136fd785755SGeoff Rehmet if [ -d $i ] ; then 137fd785755SGeoff Rehmet do_uncompress $i 138fd785755SGeoff Rehmet else 139fd785755SGeoff Rehmet if [ -e $i ] ; then 140fd785755SGeoff Rehmet uncompress_page $i 141fd785755SGeoff Rehmet fi 142fd785755SGeoff Rehmet fi } ;; 143fd785755SGeoff Rehmet esac 144fd785755SGeoff Rehmet done 145f503299aSGeoff Rehmet cd $workdir 146fd785755SGeoff Rehmet else 147fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 148fd785755SGeoff Rehmet fi 149fd785755SGeoff Rehmet shift 150fd785755SGeoff Rehmet done 151fd785755SGeoff Rehmet} 152fd785755SGeoff Rehmet 153fd785755SGeoff Rehmet# 154fd785755SGeoff Rehmet# compress one page 155fd785755SGeoff Rehmet# We need to watch out for hard links here. 156fd785755SGeoff Rehmet# 157fd785755SGeoff Rehmetcompress_page() 158fd785755SGeoff Rehmet{ 159fd785755SGeoff Rehmet local pname 160fd785755SGeoff Rehmet local fname 161fd785755SGeoff Rehmet local sect 162fd785755SGeoff Rehmet 163fd785755SGeoff Rehmet # break up file name 164fd785755SGeoff Rehmet pname=$1 165fd785755SGeoff Rehmet IFS='.' ; set $pname 166fd785755SGeoff Rehmet if [ $# -lt 2 ] ; then 167fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 168fd785755SGeoff Rehmet fi 169fd785755SGeoff Rehmet # construct name and section 170fd785755SGeoff Rehmet fname=$1 ; shift 171fd785755SGeoff Rehmet while [ $# -gt 1 ] ; do 172fd785755SGeoff Rehmet fname=$fname.$1 173fd785755SGeoff Rehmet shift 174fd785755SGeoff Rehmet done 175fd785755SGeoff Rehmet sect=$1 176fd785755SGeoff Rehmet 177fd785755SGeoff Rehmet IFS=" " 178fd785755SGeoff Rehmet case "$sect" in 179fd785755SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 180fd785755SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 181fd785755SGeoff Rehmet [12345678ln]*){ 182fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 183fd785755SGeoff Rehmet if [ $2 = "gzip" ] ; then 184fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 185fd785755SGeoff Rehmet mv $pname $pname.gz # link 186fd785755SGeoff Rehmet else 187fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 188fd785755SGeoff Rehmet echo gzipping page $pname 1>&2 18903863e2aSGeoff Rehmet cat $pname | \ 19003863e2aSGeoff Rehmet (cd .. ; soelim )| gzip -c -- > /tmp/manager.$$ 191fd785755SGeoff Rehmet chmod u+w $pname 192fd785755SGeoff Rehmet cp /tmp/manager.$$ $pname 193fd785755SGeoff Rehmet chmod 444 $pname 194fd785755SGeoff Rehmet mv $pname $pname.gz 195fd785755SGeoff Rehmet rm /tmp/manager.$$ 196fd785755SGeoff Rehmet else 197fd785755SGeoff Rehmet # skip symlink - this can be 198fd785755SGeoff Rehmet # a program like expn, which is 199fd785755SGeoff Rehmet # its own man page ! 200fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 201fd785755SGeoff Rehmet fi 202fd785755SGeoff Rehmet fi };; 203fd785755SGeoff Rehmet *) { 204fd785755SGeoff Rehmet IFS=" " 205fd785755SGeoff Rehmet echo skipping file $pname 1>&2 206fd785755SGeoff Rehmet } ;; 207fd785755SGeoff Rehmet esac 208fd785755SGeoff Rehmet # reset IFS - this is important! 209fd785755SGeoff Rehmet IFS=" " 210fd785755SGeoff Rehmet} 211fd785755SGeoff Rehmet 212fd785755SGeoff Rehmet# 213fd785755SGeoff Rehmet# Compress man pages in paths 214fd785755SGeoff Rehmet# 215fd785755SGeoff Rehmetdo_compress() 216fd785755SGeoff Rehmet{ 217fd785755SGeoff Rehmet local i 218fd785755SGeoff Rehmet local dir 219f503299aSGeoff Rehmet local workdir 220fd785755SGeoff Rehmet 221f503299aSGeoff Rehmet workdir=`pwd` 222fd785755SGeoff Rehmet while [ $# != 0 ] ; do 223fd785755SGeoff Rehmet if [ -d $1 ] ; then 224fd785755SGeoff Rehmet dir=$1 225f503299aSGeoff Rehmet cd $dir 226f503299aSGeoff Rehmet for i in * ; do 227fd785755SGeoff Rehmet case $i in 228fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 229fd785755SGeoff Rehmet *) { 230fd785755SGeoff Rehmet if [ -d $i ] ; then 231fd785755SGeoff Rehmet do_compress $i 232fd785755SGeoff Rehmet else 233fd785755SGeoff Rehmet if [ -e $i ] ; then 234fd785755SGeoff Rehmet compress_page $i 235fd785755SGeoff Rehmet fi 236fd785755SGeoff Rehmet fi } ;; 237fd785755SGeoff Rehmet esac 238fd785755SGeoff Rehmet done 239f503299aSGeoff Rehmet cd $workdir 240fd785755SGeoff Rehmet else 241fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 242fd785755SGeoff Rehmet fi 243fd785755SGeoff Rehmet shift 244fd785755SGeoff Rehmet done 245fd785755SGeoff Rehmet} 246fd785755SGeoff Rehmet 247fd785755SGeoff Rehmet# 248fd785755SGeoff Rehmet# Display a usage message 249fd785755SGeoff Rehmet# 250fd785755SGeoff Rehmetctl_usage() 251fd785755SGeoff Rehmet{ 252fd785755SGeoff Rehmet echo "usage : $1 -compress <path> ... " 1>&2 253fd785755SGeoff Rehmet echo " $1 -uncompress <path> ... " 1>&2 254fd785755SGeoff Rehmet echo " $1 -purge <days> <path> ... " 1>&2 255fd785755SGeoff Rehmet echo " $1 -purge expire <path> ... " 1>&2 256fd785755SGeoff Rehmet exit 1 257fd785755SGeoff Rehmet} 258fd785755SGeoff Rehmet 259fd785755SGeoff Rehmet 260fd785755SGeoff Rehmet# 261fd785755SGeoff Rehmet# dispatch options 262fd785755SGeoff Rehmet# 263fd785755SGeoff Rehmetif [ $# = 0 ] ; then ; ctl_usage $0 ; fi ; 264fd785755SGeoff Rehmet 265fd785755SGeoff Rehmetcase "$1" in 266fd785755SGeoff Rehmet -compress) shift ; do_compress "$@" ;; 267fd785755SGeoff Rehmet -uncompress) shift ; do_uncompress "$@" ;; 268fd785755SGeoff Rehmet -purge) shift ; do_purge "$@" ;; 269fd785755SGeoff Rehmet *) ctl_usage $0 ;; 270fd785755SGeoff Rehmetesac 271