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