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# 33bfbd29a1SJordan K. Hubbard# $Id: manctl.sh,v 1.4 1994/04/18 18:46:50 csgr 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) 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# 49fd785755SGeoff RehmetPATH=/bin:/sbin:/usr/bin:/usr/sbin 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 97fd785755SGeoff Rehmet gunzip -c $pname > /tmp/manager.$$ 98fd785755SGeoff Rehmet chmod u+w $pname 99fd785755SGeoff Rehmet cp /tmp/manager.$$ $pname 100fd785755SGeoff Rehmet chmod 444 $pname 101fd785755SGeoff Rehmet mv $pname $fname.$sect 102fd785755SGeoff Rehmet rm /tmp/manager.$$ 103fd785755SGeoff Rehmet else 104fd785755SGeoff Rehmet # skip symlinks - this can be 105fd785755SGeoff Rehmet # a program like expn, which is 106fd785755SGeoff Rehmet # its own man page ! 107fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 108fd785755SGeoff Rehmet fi 109fd785755SGeoff Rehmet fi };; 110fd785755SGeoff Rehmet *) { 111fd785755SGeoff Rehmet IFS=" " 112fd785755SGeoff Rehmet echo skipping file $pname 1>&2 113fd785755SGeoff Rehmet } ;; 114fd785755SGeoff Rehmet esac 115fd785755SGeoff Rehmet # reset IFS - this is important! 116fd785755SGeoff Rehmet IFS=" " 117fd785755SGeoff Rehmet} 118fd785755SGeoff Rehmet 119fd785755SGeoff Rehmet 120fd785755SGeoff Rehmet# 121fd785755SGeoff Rehmet# Uncompress manpages in paths 122fd785755SGeoff Rehmet# 123fd785755SGeoff Rehmetdo_uncompress() 124fd785755SGeoff Rehmet{ 125fd785755SGeoff Rehmet local i 126fd785755SGeoff Rehmet local dir 127f503299aSGeoff Rehmet local workdir 128fd785755SGeoff Rehmet 129f503299aSGeoff Rehmet workdir=`pwd` 130fd785755SGeoff Rehmet while [ $# != 0 ] ; do 131fd785755SGeoff Rehmet if [ -d $1 ] ; then 132fd785755SGeoff Rehmet dir=$1 133f503299aSGeoff Rehmet cd $dir 13403863e2aSGeoff Rehmet for i in * ; do 135fd785755SGeoff Rehmet case $i in 136fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 137fd785755SGeoff Rehmet *) { 138fd785755SGeoff Rehmet if [ -d $i ] ; then 139fd785755SGeoff Rehmet do_uncompress $i 140fd785755SGeoff Rehmet else 141fd785755SGeoff Rehmet if [ -e $i ] ; then 142fd785755SGeoff Rehmet uncompress_page $i 143fd785755SGeoff Rehmet fi 144fd785755SGeoff Rehmet fi } ;; 145fd785755SGeoff Rehmet esac 146fd785755SGeoff Rehmet done 147f503299aSGeoff Rehmet cd $workdir 148fd785755SGeoff Rehmet else 149fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 150fd785755SGeoff Rehmet fi 151fd785755SGeoff Rehmet shift 152fd785755SGeoff Rehmet done 153fd785755SGeoff Rehmet} 154fd785755SGeoff Rehmet 155fd785755SGeoff Rehmet# 156321bd776SGeoff Rehmet# Remove .so's from one file 157321bd776SGeoff Rehmet# 158321bd776SGeoff Rehmetso_purge_page() 159321bd776SGeoff Rehmet{ 160321bd776SGeoff Rehmet local so_entries 161321bd776SGeoff Rehmet local lines 162321bd776SGeoff Rehmet local fname 163321bd776SGeoff Rehmet 164321bd776SGeoff Rehmet so_entries=`grep "^\.so" $1 | wc -l` 165bfbd29a1SJordan K. Hubbard if [ $so_entries -eq 0 ] ; then return 0 ; fi 166321bd776SGeoff Rehmet 167321bd776SGeoff Rehmet # we have a page with a .so in it 168321bd776SGeoff Rehmet echo $1 contains a .so entry 2>&1 169321bd776SGeoff Rehmet 170321bd776SGeoff Rehmet # now check how many lines in the file 171321bd776SGeoff Rehmet lines=`wc -l < $1` 172321bd776SGeoff Rehmet 173321bd776SGeoff Rehmet # if the file is only one line long, we can replace it 174321bd776SGeoff Rehmet # with a hard link! 175321bd776SGeoff Rehmet if [ $lines -eq 1 ] ; then 176321bd776SGeoff Rehmet fname=$1; 177321bd776SGeoff Rehmet echo replacing $fname with a hard link 178321bd776SGeoff Rehmet set `cat $fname`; 179321bd776SGeoff Rehmet rm -f $fname 180321bd776SGeoff Rehmet ln ../$2 $fname 181321bd776SGeoff Rehmet else 182321bd776SGeoff Rehmet echo inlining page $fname 1>&2 183321bd776SGeoff Rehmet cat $fname | \ 184321bd776SGeoff Rehmet (cd .. ; soelim ) > /tmp/manager.$$ 185321bd776SGeoff Rehmet chmod u+w $fname 186321bd776SGeoff Rehmet cp /tmp/manager.$$ $fname 187321bd776SGeoff Rehmet chmod 444 $fname 188321bd776SGeoff Rehmet fi 189321bd776SGeoff Rehmet} 190321bd776SGeoff Rehmet 191321bd776SGeoff Rehmet# 192321bd776SGeoff Rehmet# Remove .so entries from man pages 193321bd776SGeoff Rehmet# If a page consists of just one line with a .so, 194321bd776SGeoff Rehmet# replace it with a hard link 195321bd776SGeoff Rehmet# 196321bd776SGeoff Rehmetremove_so() 197321bd776SGeoff Rehmet{ 198321bd776SGeoff Rehmet local pname 199321bd776SGeoff Rehmet local fname 200321bd776SGeoff Rehmet local sect 201321bd776SGeoff Rehmet 202321bd776SGeoff Rehmet # break up file name 203321bd776SGeoff Rehmet pname=$1 204321bd776SGeoff Rehmet IFS='.' ; set $pname 205321bd776SGeoff Rehmet if [ $# -lt 2 ] ; then 206321bd776SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 207321bd776SGeoff Rehmet fi 208321bd776SGeoff Rehmet # construct name and section 209321bd776SGeoff Rehmet fname=$1 ; shift 210321bd776SGeoff Rehmet while [ $# -gt 1 ] ; do 211321bd776SGeoff Rehmet fname=$fname.$1 212321bd776SGeoff Rehmet shift 213321bd776SGeoff Rehmet done 214321bd776SGeoff Rehmet sect=$1 215321bd776SGeoff Rehmet 216321bd776SGeoff Rehmet IFS=" " 217321bd776SGeoff Rehmet case "$sect" in 218321bd776SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 219321bd776SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 220321bd776SGeoff Rehmet [12345678ln]*){ 221321bd776SGeoff Rehmet IFS=" " ; set `file $pname` 222321bd776SGeoff Rehmet if [ $2 = "gzip" ] ; then 223321bd776SGeoff Rehmet echo moving hard link $pname 1>&2 224321bd776SGeoff Rehmet mv $pname $pname.gz # link 225321bd776SGeoff Rehmet else 226321bd776SGeoff Rehmet if [ $2 != "symbolic" ] ; then 227321bd776SGeoff Rehmet echo "removing .so's in page $pname" 1>&2 228321bd776SGeoff Rehmet so_purge_page $pname 229321bd776SGeoff Rehmet else 230321bd776SGeoff Rehmet # skip symlink - this can be 231321bd776SGeoff Rehmet # a program like expn, which is 232321bd776SGeoff Rehmet # its own man page ! 233321bd776SGeoff Rehmet echo skipping symlink $pname 1>&2 234321bd776SGeoff Rehmet fi 235321bd776SGeoff Rehmet fi };; 236321bd776SGeoff Rehmet *) { 237321bd776SGeoff Rehmet IFS=" " 238321bd776SGeoff Rehmet echo skipping file $pname 1>&2 239321bd776SGeoff Rehmet } ;; 240321bd776SGeoff Rehmet esac 241321bd776SGeoff Rehmet # reset IFS - this is important! 242321bd776SGeoff Rehmet IFS=" " 243321bd776SGeoff Rehmet} 244321bd776SGeoff Rehmet 245321bd776SGeoff Rehmet 246321bd776SGeoff Rehmet# 247fd785755SGeoff Rehmet# compress one page 248fd785755SGeoff Rehmet# We need to watch out for hard links here. 249fd785755SGeoff Rehmet# 250fd785755SGeoff Rehmetcompress_page() 251fd785755SGeoff Rehmet{ 252fd785755SGeoff Rehmet local pname 253fd785755SGeoff Rehmet local fname 254fd785755SGeoff Rehmet local sect 255fd785755SGeoff Rehmet 256fd785755SGeoff Rehmet # break up file name 257fd785755SGeoff Rehmet pname=$1 258fd785755SGeoff Rehmet IFS='.' ; set $pname 259fd785755SGeoff Rehmet if [ $# -lt 2 ] ; then 260fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 261fd785755SGeoff Rehmet fi 262fd785755SGeoff Rehmet # construct name and section 263fd785755SGeoff Rehmet fname=$1 ; shift 264fd785755SGeoff Rehmet while [ $# -gt 1 ] ; do 265fd785755SGeoff Rehmet fname=$fname.$1 266fd785755SGeoff Rehmet shift 267fd785755SGeoff Rehmet done 268fd785755SGeoff Rehmet sect=$1 269fd785755SGeoff Rehmet 270fd785755SGeoff Rehmet IFS=" " 271fd785755SGeoff Rehmet case "$sect" in 272fd785755SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 273fd785755SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 274fd785755SGeoff Rehmet [12345678ln]*){ 275fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 276fd785755SGeoff Rehmet if [ $2 = "gzip" ] ; then 277fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 278fd785755SGeoff Rehmet mv $pname $pname.gz # link 279fd785755SGeoff Rehmet else 280fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 281fd785755SGeoff Rehmet echo gzipping page $pname 1>&2 28203863e2aSGeoff Rehmet cat $pname | \ 28303863e2aSGeoff Rehmet (cd .. ; soelim )| gzip -c -- > /tmp/manager.$$ 284fd785755SGeoff Rehmet chmod u+w $pname 285fd785755SGeoff Rehmet cp /tmp/manager.$$ $pname 286fd785755SGeoff Rehmet chmod 444 $pname 287fd785755SGeoff Rehmet mv $pname $pname.gz 288fd785755SGeoff Rehmet rm /tmp/manager.$$ 289fd785755SGeoff Rehmet else 290fd785755SGeoff Rehmet # skip symlink - this can be 291fd785755SGeoff Rehmet # a program like expn, which is 292fd785755SGeoff Rehmet # its own man page ! 293fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 294fd785755SGeoff Rehmet fi 295fd785755SGeoff Rehmet fi };; 296fd785755SGeoff Rehmet *) { 297fd785755SGeoff Rehmet IFS=" " 298fd785755SGeoff Rehmet echo skipping file $pname 1>&2 299fd785755SGeoff Rehmet } ;; 300fd785755SGeoff Rehmet esac 301fd785755SGeoff Rehmet # reset IFS - this is important! 302fd785755SGeoff Rehmet IFS=" " 303fd785755SGeoff Rehmet} 304fd785755SGeoff Rehmet 305fd785755SGeoff Rehmet# 306fd785755SGeoff Rehmet# Compress man pages in paths 307fd785755SGeoff Rehmet# 308321bd776SGeoff Rehmetdo_compress_so() 309fd785755SGeoff Rehmet{ 310fd785755SGeoff Rehmet local i 311fd785755SGeoff Rehmet local dir 312f503299aSGeoff Rehmet local workdir 313321bd776SGeoff Rehmet local what 314fd785755SGeoff Rehmet 315321bd776SGeoff Rehmet what=$1 316321bd776SGeoff Rehmet shift 317f503299aSGeoff Rehmet workdir=`pwd` 318fd785755SGeoff Rehmet while [ $# != 0 ] ; do 319fd785755SGeoff Rehmet if [ -d $1 ] ; then 320fd785755SGeoff Rehmet dir=$1 321f503299aSGeoff Rehmet cd $dir 322f503299aSGeoff Rehmet for i in * ; do 323fd785755SGeoff Rehmet case $i in 324fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 325fd785755SGeoff Rehmet *) { 326fd785755SGeoff Rehmet if [ -d $i ] ; then 327321bd776SGeoff Rehmet do_compress_so $what $i 328fd785755SGeoff Rehmet else 329fd785755SGeoff Rehmet if [ -e $i ] ; then 330321bd776SGeoff Rehmet $what $i 331fd785755SGeoff Rehmet fi 332fd785755SGeoff Rehmet fi } ;; 333fd785755SGeoff Rehmet esac 334fd785755SGeoff Rehmet done 335f503299aSGeoff Rehmet cd $workdir 336fd785755SGeoff Rehmet else 337fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 338fd785755SGeoff Rehmet fi 339fd785755SGeoff Rehmet shift 340fd785755SGeoff Rehmet done 341fd785755SGeoff Rehmet} 342fd785755SGeoff Rehmet 343fd785755SGeoff Rehmet# 344fd785755SGeoff Rehmet# Display a usage message 345fd785755SGeoff Rehmet# 346fd785755SGeoff Rehmetctl_usage() 347fd785755SGeoff Rehmet{ 348fd785755SGeoff Rehmet echo "usage : $1 -compress <path> ... " 1>&2 349fd785755SGeoff Rehmet echo " $1 -uncompress <path> ... " 1>&2 350fd785755SGeoff Rehmet echo " $1 -purge <days> <path> ... " 1>&2 351fd785755SGeoff Rehmet echo " $1 -purge expire <path> ... " 1>&2 352fd785755SGeoff Rehmet exit 1 353fd785755SGeoff Rehmet} 354fd785755SGeoff Rehmet 355321bd776SGeoff Rehmet# 356321bd776SGeoff Rehmet# remove .so's and do compress 357321bd776SGeoff Rehmet# 358321bd776SGeoff Rehmetdo_compress() 359321bd776SGeoff Rehmet{ 360321bd776SGeoff Rehmet # First remove all so's from the pages to be compressed 361321bd776SGeoff Rehmet do_compress_so remove_so "$@" 362321bd776SGeoff Rehmet # now do ahead and compress the pages 363321bd776SGeoff Rehmet do_compress_so compress_page "$@" 364321bd776SGeoff Rehmet} 365fd785755SGeoff Rehmet 366fd785755SGeoff Rehmet# 367fd785755SGeoff Rehmet# dispatch options 368fd785755SGeoff Rehmet# 369bfbd29a1SJordan K. Hubbardif [ $# = 0 ] ; then ctl_usage $0 ; fi ; 370fd785755SGeoff Rehmet 371fd785755SGeoff Rehmetcase "$1" in 372fd785755SGeoff Rehmet -compress) shift ; do_compress "$@" ;; 373fd785755SGeoff Rehmet -uncompress) shift ; do_uncompress "$@" ;; 374fd785755SGeoff Rehmet -purge) shift ; do_purge "$@" ;; 375fd785755SGeoff Rehmet *) ctl_usage $0 ;; 376fd785755SGeoff Rehmetesac 377