1fd785755SGeoff Rehmet#!/bin/sh 2fd785755SGeoff Rehmet# 3*df57947fSPedro F. Giffuni# SPDX-License-Identifier: BSD-4-Clause 4*df57947fSPedro F. Giffuni# 5fd785755SGeoff Rehmet# Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University 6fd785755SGeoff Rehmet# All rights reserved. 7fd785755SGeoff Rehmet# 8fd785755SGeoff Rehmet# Redistribution and use in source and binary forms, with or without 9fd785755SGeoff Rehmet# modification, are permitted provided that the following conditions 10fd785755SGeoff Rehmet# are met: 11fd785755SGeoff Rehmet# 1. Redistributions of source code must retain the above copyright 12fd785755SGeoff Rehmet# notice, this list of conditions and the following disclaimer. 13fd785755SGeoff Rehmet# 2. Redistributions in binary form must reproduce the above copyright 14fd785755SGeoff Rehmet# notice, this list of conditions and the following disclaimer in the 15fd785755SGeoff Rehmet# documentation and/or other materials provided with the distribution. 16fd785755SGeoff Rehmet# 3. All advertising materials mentioning features or use of this software 17fd785755SGeoff Rehmet# must display the following acknowledgement: 18fd785755SGeoff Rehmet# This product includes software developed by Geoffrey M. Rehmet 19fd785755SGeoff Rehmet# 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University 20fd785755SGeoff Rehmet# may be used to endorse or promote products derived from this software 21fd785755SGeoff Rehmet# without specific prior written permission. 22fd785755SGeoff Rehmet# 23fd785755SGeoff Rehmet# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 24fd785755SGeoff Rehmet# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 25fd785755SGeoff Rehmet# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26fd785755SGeoff Rehmet# IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE 27fd785755SGeoff Rehmet# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28fd785755SGeoff Rehmet# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29fd785755SGeoff Rehmet# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30fd785755SGeoff Rehmet# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31fd785755SGeoff Rehmet# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32fd785755SGeoff Rehmet# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33fd785755SGeoff Rehmet# SUCH DAMAGE. 34fd785755SGeoff Rehmet# 3597d92980SPeter Wemm# $FreeBSD$ 36fd785755SGeoff Rehmet# 37fd785755SGeoff Rehmet# manctl: 38fd785755SGeoff Rehmet# a utility for manipulating manual pages 39fd785755SGeoff Rehmet# functions: 40fd785755SGeoff Rehmet# compress uncompressed man pages (elliminating .so's) 41321bd776SGeoff Rehmet# this is now two-pass. If possible, .so's 42321bd776SGeoff Rehmet# are replaced with hard links 43fd785755SGeoff Rehmet# uncompress compressed man pages 44fd785755SGeoff Rehmet# Things to watch out for: 45fd785755SGeoff Rehmet# Hard links - careful with g(un)zipping! 46fd785755SGeoff Rehmet# .so's - throw everything through soelim before gzip! 47fd785755SGeoff Rehmet# symlinks - ignore these - eg: expn is its own man page: 48fd785755SGeoff Rehmet# don't want to compress this! 49fd785755SGeoff Rehmet# 50ea4da3a8SWolfram SchneiderPATH=/bin:/sbin:/usr/bin:/usr/sbin; export PATH 51fd785755SGeoff Rehmet 52fd785755SGeoff Rehmet# 53fd785755SGeoff Rehmet# Uncompress one page 54fd785755SGeoff Rehmet# 55fd785755SGeoff Rehmetuncompress_page() 56fd785755SGeoff Rehmet{ 57fd785755SGeoff Rehmet local pname 58fd785755SGeoff Rehmet local fname 59fd785755SGeoff Rehmet local sect 60fd785755SGeoff Rehmet local ext 61fd785755SGeoff Rehmet 62fd785755SGeoff Rehmet # break up file name 63fd785755SGeoff Rehmet pname=$1 64fd785755SGeoff Rehmet IFS='.' ; set $pname 65fd785755SGeoff Rehmet # less than 3 fields - don't know what to do with this 66fd785755SGeoff Rehmet if [ $# -lt 3 ] ; then 67fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 68fd785755SGeoff Rehmet fi 69fd785755SGeoff Rehmet # construct name and section 70fd785755SGeoff Rehmet fname=$1 ; shift 71fd785755SGeoff Rehmet while [ $# -gt 2 ] ; do 72fd785755SGeoff Rehmet fname=$fname.$1 73fd785755SGeoff Rehmet shift 74fd785755SGeoff Rehmet done 75fd785755SGeoff Rehmet sect=$1 76fd785755SGeoff Rehmet ext=$2 77fd785755SGeoff Rehmet 78fd785755SGeoff Rehmet IFS=" " 79fd785755SGeoff Rehmet case "$ext" in 80fd785755SGeoff Rehmet gz|Z) { 81fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 82fd785755SGeoff Rehmet if [ $2 != "gzip" ] ; then 83fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 84fd785755SGeoff Rehmet mv $pname $fname.$ext # link 85fd785755SGeoff Rehmet else 86fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 87fd785755SGeoff Rehmet echo gunzipping page $pname 1>&2 88cfbe890aSChris D. Faulhaber temp=`mktemp -t manager` || exit 1 89cfbe890aSChris D. Faulhaber gunzip -c $pname > $temp 90fd785755SGeoff Rehmet chmod u+w $pname 91cfbe890aSChris D. Faulhaber cp $temp $pname 92fd785755SGeoff Rehmet chmod 444 $pname 93fd785755SGeoff Rehmet mv $pname $fname.$sect 94cfbe890aSChris D. Faulhaber rm -f $temp 95fd785755SGeoff Rehmet else 96fd785755SGeoff Rehmet # skip symlinks - this can be 97fd785755SGeoff Rehmet # a program like expn, which is 98fd785755SGeoff Rehmet # its own man page ! 99fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 100fd785755SGeoff Rehmet fi 101fd785755SGeoff Rehmet fi };; 102fd785755SGeoff Rehmet *) { 103fd785755SGeoff Rehmet IFS=" " 104fd785755SGeoff Rehmet echo skipping file $pname 1>&2 105fd785755SGeoff Rehmet } ;; 106fd785755SGeoff Rehmet esac 107fd785755SGeoff Rehmet # reset IFS - this is important! 108fd785755SGeoff Rehmet IFS=" " 109fd785755SGeoff Rehmet} 110fd785755SGeoff Rehmet 111fd785755SGeoff Rehmet 112fd785755SGeoff Rehmet# 113fd785755SGeoff Rehmet# Uncompress manpages in paths 114fd785755SGeoff Rehmet# 115fd785755SGeoff Rehmetdo_uncompress() 116fd785755SGeoff Rehmet{ 117fd785755SGeoff Rehmet local i 118fd785755SGeoff Rehmet local dir 119f503299aSGeoff Rehmet local workdir 120fd785755SGeoff Rehmet 121f503299aSGeoff Rehmet workdir=`pwd` 122fd785755SGeoff Rehmet while [ $# != 0 ] ; do 123fd785755SGeoff Rehmet if [ -d $1 ] ; then 124fd785755SGeoff Rehmet dir=$1 125f503299aSGeoff Rehmet cd $dir 12603863e2aSGeoff Rehmet for i in * ; do 127fd785755SGeoff Rehmet case $i in 128fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 129fd785755SGeoff Rehmet *) { 130fd785755SGeoff Rehmet if [ -d $i ] ; then 131fd785755SGeoff Rehmet do_uncompress $i 132fd785755SGeoff Rehmet else 133fd785755SGeoff Rehmet if [ -e $i ] ; then 134fd785755SGeoff Rehmet uncompress_page $i 135fd785755SGeoff Rehmet fi 136fd785755SGeoff Rehmet fi } ;; 137fd785755SGeoff Rehmet esac 138fd785755SGeoff Rehmet done 139f503299aSGeoff Rehmet cd $workdir 140fd785755SGeoff Rehmet else 141fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 142fd785755SGeoff Rehmet fi 143fd785755SGeoff Rehmet shift 144fd785755SGeoff Rehmet done 145fd785755SGeoff Rehmet} 146fd785755SGeoff Rehmet 147fd785755SGeoff Rehmet# 148321bd776SGeoff Rehmet# Remove .so's from one file 149321bd776SGeoff Rehmet# 150321bd776SGeoff Rehmetso_purge_page() 151321bd776SGeoff Rehmet{ 152321bd776SGeoff Rehmet local so_entries 153321bd776SGeoff Rehmet local lines 154321bd776SGeoff Rehmet local fname 155321bd776SGeoff Rehmet 156321bd776SGeoff Rehmet so_entries=`grep "^\.so" $1 | wc -l` 157bfbd29a1SJordan K. Hubbard if [ $so_entries -eq 0 ] ; then return 0 ; fi 158321bd776SGeoff Rehmet 159321bd776SGeoff Rehmet # we have a page with a .so in it 160321bd776SGeoff Rehmet echo $1 contains a .so entry 2>&1 161321bd776SGeoff Rehmet 162321bd776SGeoff Rehmet # now check how many lines in the file 163321bd776SGeoff Rehmet lines=`wc -l < $1` 164321bd776SGeoff Rehmet 165321bd776SGeoff Rehmet # if the file is only one line long, we can replace it 166321bd776SGeoff Rehmet # with a hard link! 167321bd776SGeoff Rehmet if [ $lines -eq 1 ] ; then 168321bd776SGeoff Rehmet fname=$1; 169321bd776SGeoff Rehmet echo replacing $fname with a hard link 170321bd776SGeoff Rehmet set `cat $fname`; 171321bd776SGeoff Rehmet rm -f $fname 172321bd776SGeoff Rehmet ln ../$2 $fname 173321bd776SGeoff Rehmet else 174321bd776SGeoff Rehmet echo inlining page $fname 1>&2 175cfbe890aSChris D. Faulhaber temp=`mktemp -t manager` || exit 1 176321bd776SGeoff Rehmet cat $fname | \ 177cfbe890aSChris D. Faulhaber (cd .. ; soelim ) > $temp 178321bd776SGeoff Rehmet chmod u+w $fname 179cfbe890aSChris D. Faulhaber cp $temp $fname 180321bd776SGeoff Rehmet chmod 444 $fname 181cfbe890aSChris D. Faulhaber rm -f $temp 182321bd776SGeoff Rehmet fi 183321bd776SGeoff Rehmet} 184321bd776SGeoff Rehmet 185321bd776SGeoff Rehmet# 186321bd776SGeoff Rehmet# Remove .so entries from man pages 187321bd776SGeoff Rehmet# If a page consists of just one line with a .so, 188321bd776SGeoff Rehmet# replace it with a hard link 189321bd776SGeoff Rehmet# 190321bd776SGeoff Rehmetremove_so() 191321bd776SGeoff Rehmet{ 192321bd776SGeoff Rehmet local pname 193321bd776SGeoff Rehmet local fname 194321bd776SGeoff Rehmet local sect 195321bd776SGeoff Rehmet 196321bd776SGeoff Rehmet # break up file name 197321bd776SGeoff Rehmet pname=$1 198321bd776SGeoff Rehmet IFS='.' ; set $pname 199321bd776SGeoff Rehmet if [ $# -lt 2 ] ; then 200321bd776SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 201321bd776SGeoff Rehmet fi 202321bd776SGeoff Rehmet # construct name and section 203321bd776SGeoff Rehmet fname=$1 ; shift 204321bd776SGeoff Rehmet while [ $# -gt 1 ] ; do 205321bd776SGeoff Rehmet fname=$fname.$1 206321bd776SGeoff Rehmet shift 207321bd776SGeoff Rehmet done 208321bd776SGeoff Rehmet sect=$1 209321bd776SGeoff Rehmet 210321bd776SGeoff Rehmet IFS=" " 211321bd776SGeoff Rehmet case "$sect" in 212321bd776SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 213321bd776SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 214321bd776SGeoff Rehmet [12345678ln]*){ 215321bd776SGeoff Rehmet IFS=" " ; set `file $pname` 216321bd776SGeoff Rehmet if [ $2 = "gzip" ] ; then 217321bd776SGeoff Rehmet echo moving hard link $pname 1>&2 218321bd776SGeoff Rehmet mv $pname $pname.gz # link 219321bd776SGeoff Rehmet else 220321bd776SGeoff Rehmet if [ $2 != "symbolic" ] ; then 221321bd776SGeoff Rehmet echo "removing .so's in page $pname" 1>&2 222321bd776SGeoff Rehmet so_purge_page $pname 223321bd776SGeoff Rehmet else 224321bd776SGeoff Rehmet # skip symlink - this can be 225321bd776SGeoff Rehmet # a program like expn, which is 226321bd776SGeoff Rehmet # its own man page ! 227321bd776SGeoff Rehmet echo skipping symlink $pname 1>&2 228321bd776SGeoff Rehmet fi 229321bd776SGeoff Rehmet fi };; 230321bd776SGeoff Rehmet *) { 231321bd776SGeoff Rehmet IFS=" " 232321bd776SGeoff Rehmet echo skipping file $pname 1>&2 233321bd776SGeoff Rehmet } ;; 234321bd776SGeoff Rehmet esac 235321bd776SGeoff Rehmet # reset IFS - this is important! 236321bd776SGeoff Rehmet IFS=" " 237321bd776SGeoff Rehmet} 238321bd776SGeoff Rehmet 239321bd776SGeoff Rehmet 240321bd776SGeoff Rehmet# 241fd785755SGeoff Rehmet# compress one page 242fd785755SGeoff Rehmet# We need to watch out for hard links here. 243fd785755SGeoff Rehmet# 244fd785755SGeoff Rehmetcompress_page() 245fd785755SGeoff Rehmet{ 246fd785755SGeoff Rehmet local pname 247fd785755SGeoff Rehmet local fname 248fd785755SGeoff Rehmet local sect 249fd785755SGeoff Rehmet 250fd785755SGeoff Rehmet # break up file name 251fd785755SGeoff Rehmet pname=$1 252fd785755SGeoff Rehmet IFS='.' ; set $pname 253fd785755SGeoff Rehmet if [ $# -lt 2 ] ; then 254fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 255fd785755SGeoff Rehmet fi 256fd785755SGeoff Rehmet # construct name and section 257fd785755SGeoff Rehmet fname=$1 ; shift 258fd785755SGeoff Rehmet while [ $# -gt 1 ] ; do 259fd785755SGeoff Rehmet fname=$fname.$1 260fd785755SGeoff Rehmet shift 261fd785755SGeoff Rehmet done 262fd785755SGeoff Rehmet sect=$1 263fd785755SGeoff Rehmet 264fd785755SGeoff Rehmet IFS=" " 265fd785755SGeoff Rehmet case "$sect" in 266fd785755SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 267fd785755SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 268fd785755SGeoff Rehmet [12345678ln]*){ 269fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 270fd785755SGeoff Rehmet if [ $2 = "gzip" ] ; then 271fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 272fd785755SGeoff Rehmet mv $pname $pname.gz # link 273fd785755SGeoff Rehmet else 274fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 275fd785755SGeoff Rehmet echo gzipping page $pname 1>&2 276cfbe890aSChris D. Faulhaber temp=`mktemp -t manager` || exit 1 27703863e2aSGeoff Rehmet cat $pname | \ 278cfbe890aSChris D. Faulhaber (cd .. ; soelim )| gzip -c -- > $temp 279fd785755SGeoff Rehmet chmod u+w $pname 280cfbe890aSChris D. Faulhaber cp $temp $pname 281fd785755SGeoff Rehmet chmod 444 $pname 282fd785755SGeoff Rehmet mv $pname $pname.gz 283cfbe890aSChris D. Faulhaber rm -f $temp 284fd785755SGeoff Rehmet else 285fd785755SGeoff Rehmet # skip symlink - this can be 286fd785755SGeoff Rehmet # a program like expn, which is 287fd785755SGeoff Rehmet # its own man page ! 288fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 289fd785755SGeoff Rehmet fi 290fd785755SGeoff Rehmet fi };; 291fd785755SGeoff Rehmet *) { 292fd785755SGeoff Rehmet IFS=" " 293fd785755SGeoff Rehmet echo skipping file $pname 1>&2 294fd785755SGeoff Rehmet } ;; 295fd785755SGeoff Rehmet esac 296fd785755SGeoff Rehmet # reset IFS - this is important! 297fd785755SGeoff Rehmet IFS=" " 298fd785755SGeoff Rehmet} 299fd785755SGeoff Rehmet 300fd785755SGeoff Rehmet# 301fd785755SGeoff Rehmet# Compress man pages in paths 302fd785755SGeoff Rehmet# 303321bd776SGeoff Rehmetdo_compress_so() 304fd785755SGeoff Rehmet{ 305fd785755SGeoff Rehmet local i 306fd785755SGeoff Rehmet local dir 307f503299aSGeoff Rehmet local workdir 308321bd776SGeoff Rehmet local what 309fd785755SGeoff Rehmet 310321bd776SGeoff Rehmet what=$1 311321bd776SGeoff Rehmet shift 312f503299aSGeoff Rehmet workdir=`pwd` 313fd785755SGeoff Rehmet while [ $# != 0 ] ; do 314fd785755SGeoff Rehmet if [ -d $1 ] ; then 315fd785755SGeoff Rehmet dir=$1 316f503299aSGeoff Rehmet cd $dir 317f503299aSGeoff Rehmet for i in * ; do 318fd785755SGeoff Rehmet case $i in 319fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 320fd785755SGeoff Rehmet *) { 321fd785755SGeoff Rehmet if [ -d $i ] ; then 322321bd776SGeoff Rehmet do_compress_so $what $i 323fd785755SGeoff Rehmet else 324fd785755SGeoff Rehmet if [ -e $i ] ; then 325321bd776SGeoff Rehmet $what $i 326fd785755SGeoff Rehmet fi 327fd785755SGeoff Rehmet fi } ;; 328fd785755SGeoff Rehmet esac 329fd785755SGeoff Rehmet done 330f503299aSGeoff Rehmet cd $workdir 331fd785755SGeoff Rehmet else 332fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 333fd785755SGeoff Rehmet fi 334fd785755SGeoff Rehmet shift 335fd785755SGeoff Rehmet done 336fd785755SGeoff Rehmet} 337fd785755SGeoff Rehmet 338fd785755SGeoff Rehmet# 339fd785755SGeoff Rehmet# Display a usage message 340fd785755SGeoff Rehmet# 341fd785755SGeoff Rehmetctl_usage() 342fd785755SGeoff Rehmet{ 343fd785755SGeoff Rehmet echo "usage: $1 -compress <path> ... " 1>&2 344fd785755SGeoff Rehmet echo " $1 -uncompress <path> ... " 1>&2 345fd785755SGeoff Rehmet exit 1 346fd785755SGeoff Rehmet} 347fd785755SGeoff Rehmet 348321bd776SGeoff Rehmet# 349321bd776SGeoff Rehmet# remove .so's and do compress 350321bd776SGeoff Rehmet# 351321bd776SGeoff Rehmetdo_compress() 352321bd776SGeoff Rehmet{ 353321bd776SGeoff Rehmet # First remove all so's from the pages to be compressed 354321bd776SGeoff Rehmet do_compress_so remove_so "$@" 355321bd776SGeoff Rehmet # now do ahead and compress the pages 356321bd776SGeoff Rehmet do_compress_so compress_page "$@" 357321bd776SGeoff Rehmet} 358fd785755SGeoff Rehmet 359fd785755SGeoff Rehmet# 360fd785755SGeoff Rehmet# dispatch options 361fd785755SGeoff Rehmet# 3622ae90f75SWolfram Schneiderif [ $# -lt 2 ] ; then ctl_usage $0 ; fi ; 363fd785755SGeoff Rehmet 364fd785755SGeoff Rehmetcase "$1" in 365fd785755SGeoff Rehmet -compress) shift ; do_compress "$@" ;; 366fd785755SGeoff Rehmet -uncompress) shift ; do_uncompress "$@" ;; 367fd785755SGeoff Rehmet *) ctl_usage $0 ;; 368fd785755SGeoff Rehmetesac 369