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 125fd785755SGeoff Rehmet 126fd785755SGeoff Rehmet while [ $# != 0 ] ; do 127fd785755SGeoff Rehmet if [ -d $1 ] ; then 128fd785755SGeoff Rehmet dir=$1 129fd785755SGeoff Rehmet for i in $dir/* ; do 130fd785755SGeoff Rehmet case $i in 131fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 132fd785755SGeoff Rehmet *) { 133fd785755SGeoff Rehmet if [ -d $i ] ; then 134fd785755SGeoff Rehmet do_uncompress $i 135fd785755SGeoff Rehmet else 136fd785755SGeoff Rehmet if [ -e $i ] ; then 137fd785755SGeoff Rehmet uncompress_page $i 138fd785755SGeoff Rehmet fi 139fd785755SGeoff Rehmet fi } ;; 140fd785755SGeoff Rehmet esac 141fd785755SGeoff Rehmet done 142fd785755SGeoff Rehmet else 143fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 144fd785755SGeoff Rehmet fi 145fd785755SGeoff Rehmet shift 146fd785755SGeoff Rehmet done 147fd785755SGeoff Rehmet} 148fd785755SGeoff Rehmet 149fd785755SGeoff Rehmet# 150fd785755SGeoff Rehmet# compress one page 151fd785755SGeoff Rehmet# We need to watch out for hard links here. 152fd785755SGeoff Rehmet# 153fd785755SGeoff Rehmetcompress_page() 154fd785755SGeoff Rehmet{ 155fd785755SGeoff Rehmet local pname 156fd785755SGeoff Rehmet local fname 157fd785755SGeoff Rehmet local sect 158fd785755SGeoff Rehmet 159fd785755SGeoff Rehmet # break up file name 160fd785755SGeoff Rehmet pname=$1 161fd785755SGeoff Rehmet IFS='.' ; set $pname 162fd785755SGeoff Rehmet if [ $# -lt 2 ] ; then 163fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 164fd785755SGeoff Rehmet fi 165fd785755SGeoff Rehmet # construct name and section 166fd785755SGeoff Rehmet fname=$1 ; shift 167fd785755SGeoff Rehmet while [ $# -gt 1 ] ; do 168fd785755SGeoff Rehmet fname=$fname.$1 169fd785755SGeoff Rehmet shift 170fd785755SGeoff Rehmet done 171fd785755SGeoff Rehmet sect=$1 172fd785755SGeoff Rehmet 173fd785755SGeoff Rehmet IFS=" " 174fd785755SGeoff Rehmet case "$sect" in 175fd785755SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 176fd785755SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 177fd785755SGeoff Rehmet [12345678ln]*){ 178fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 179fd785755SGeoff Rehmet if [ $2 = "gzip" ] ; then 180fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 181fd785755SGeoff Rehmet mv $pname $pname.gz # link 182fd785755SGeoff Rehmet else 183fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 184fd785755SGeoff Rehmet echo gzipping page $pname 1>&2 185fd785755SGeoff Rehmet soelim $pname | gzip -c -- > /tmp/manager.$$ 186fd785755SGeoff Rehmet chmod u+w $pname 187fd785755SGeoff Rehmet cp /tmp/manager.$$ $pname 188fd785755SGeoff Rehmet chmod 444 $pname 189fd785755SGeoff Rehmet mv $pname $pname.gz 190fd785755SGeoff Rehmet rm /tmp/manager.$$ 191fd785755SGeoff Rehmet else 192fd785755SGeoff Rehmet # skip symlink - this can be 193fd785755SGeoff Rehmet # a program like expn, which is 194fd785755SGeoff Rehmet # its own man page ! 195fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 196fd785755SGeoff Rehmet fi 197fd785755SGeoff Rehmet fi };; 198fd785755SGeoff Rehmet *) { 199fd785755SGeoff Rehmet IFS=" " 200fd785755SGeoff Rehmet echo skipping file $pname 1>&2 201fd785755SGeoff Rehmet } ;; 202fd785755SGeoff Rehmet esac 203fd785755SGeoff Rehmet # reset IFS - this is important! 204fd785755SGeoff Rehmet IFS=" " 205fd785755SGeoff Rehmet} 206fd785755SGeoff Rehmet 207fd785755SGeoff Rehmet# 208fd785755SGeoff Rehmet# Compress man pages in paths 209fd785755SGeoff Rehmet# 210fd785755SGeoff Rehmetdo_compress() 211fd785755SGeoff Rehmet{ 212fd785755SGeoff Rehmet local i 213fd785755SGeoff Rehmet local dir 214fd785755SGeoff Rehmet 215fd785755SGeoff Rehmet while [ $# != 0 ] ; do 216fd785755SGeoff Rehmet if [ -d $1 ] ; then 217fd785755SGeoff Rehmet dir=$1 218fd785755SGeoff Rehmet for i in $dir/* ; do 219fd785755SGeoff Rehmet case $i in 220fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 221fd785755SGeoff Rehmet *) { 222fd785755SGeoff Rehmet if [ -d $i ] ; then 223fd785755SGeoff Rehmet do_compress $i 224fd785755SGeoff Rehmet else 225fd785755SGeoff Rehmet if [ -e $i ] ; then 226fd785755SGeoff Rehmet compress_page $i 227fd785755SGeoff Rehmet fi 228fd785755SGeoff Rehmet fi } ;; 229fd785755SGeoff Rehmet esac 230fd785755SGeoff Rehmet done 231fd785755SGeoff Rehmet else 232fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 233fd785755SGeoff Rehmet fi 234fd785755SGeoff Rehmet shift 235fd785755SGeoff Rehmet done 236fd785755SGeoff Rehmet} 237fd785755SGeoff Rehmet 238fd785755SGeoff Rehmet# 239fd785755SGeoff Rehmet# Display a usage message 240fd785755SGeoff Rehmet# 241fd785755SGeoff Rehmetctl_usage() 242fd785755SGeoff Rehmet{ 243fd785755SGeoff Rehmet echo "usage : $1 -compress <path> ... " 1>&2 244fd785755SGeoff Rehmet echo " $1 -uncompress <path> ... " 1>&2 245fd785755SGeoff Rehmet echo " $1 -purge <days> <path> ... " 1>&2 246fd785755SGeoff Rehmet echo " $1 -purge expire <path> ... " 1>&2 247fd785755SGeoff Rehmet exit 1 248fd785755SGeoff Rehmet} 249fd785755SGeoff Rehmet 250fd785755SGeoff Rehmet 251fd785755SGeoff Rehmet# 252fd785755SGeoff Rehmet# dispatch options 253fd785755SGeoff Rehmet# 254fd785755SGeoff Rehmetif [ $# = 0 ] ; then ; ctl_usage $0 ; fi ; 255fd785755SGeoff Rehmet 256fd785755SGeoff Rehmetcase "$1" in 257fd785755SGeoff Rehmet -compress) shift ; do_compress "$@" ;; 258fd785755SGeoff Rehmet -uncompress) shift ; do_uncompress "$@" ;; 259fd785755SGeoff Rehmet -purge) shift ; do_purge "$@" ;; 260fd785755SGeoff Rehmet *) ctl_usage $0 ;; 261fd785755SGeoff Rehmetesac 262