1fd785755SGeoff Rehmet#!/bin/sh 2fd785755SGeoff Rehmet# 3df57947fSPedro F. Giffuni# SPDX-License-Identifier: BSD-4-Clause 4df57947fSPedro 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# 35fd785755SGeoff Rehmet# 36fd785755SGeoff Rehmet# manctl: 37fd785755SGeoff Rehmet# a utility for manipulating manual pages 38fd785755SGeoff Rehmet# functions: 39*068e9180SElyes Haouas# compress uncompressed man pages (eliminating .so's) 40321bd776SGeoff Rehmet# this is now two-pass. If possible, .so's 41321bd776SGeoff Rehmet# are replaced with hard links 42fd785755SGeoff Rehmet# uncompress compressed man pages 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# Uncompress one page 53fd785755SGeoff Rehmet# 54fd785755SGeoff Rehmetuncompress_page() 55fd785755SGeoff Rehmet{ 56fd785755SGeoff Rehmet local pname 57fd785755SGeoff Rehmet local fname 58fd785755SGeoff Rehmet local sect 59fd785755SGeoff Rehmet local ext 60fd785755SGeoff Rehmet 61fd785755SGeoff Rehmet # break up file name 62fd785755SGeoff Rehmet pname=$1 63fd785755SGeoff Rehmet IFS='.' ; set $pname 64fd785755SGeoff Rehmet # less than 3 fields - don't know what to do with this 65fd785755SGeoff Rehmet if [ $# -lt 3 ] ; then 66fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 67fd785755SGeoff Rehmet fi 68fd785755SGeoff Rehmet # construct name and section 69fd785755SGeoff Rehmet fname=$1 ; shift 70fd785755SGeoff Rehmet while [ $# -gt 2 ] ; do 71fd785755SGeoff Rehmet fname=$fname.$1 72fd785755SGeoff Rehmet shift 73fd785755SGeoff Rehmet done 74fd785755SGeoff Rehmet sect=$1 75fd785755SGeoff Rehmet ext=$2 76fd785755SGeoff Rehmet 77fd785755SGeoff Rehmet IFS=" " 78fd785755SGeoff Rehmet case "$ext" in 79fd785755SGeoff Rehmet gz|Z) { 80fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 81fd785755SGeoff Rehmet if [ $2 != "gzip" ] ; then 82fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 83fd785755SGeoff Rehmet mv $pname $fname.$ext # link 84fd785755SGeoff Rehmet else 85fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 86fd785755SGeoff Rehmet echo gunzipping page $pname 1>&2 87cfbe890aSChris D. Faulhaber temp=`mktemp -t manager` || exit 1 88cfbe890aSChris D. Faulhaber gunzip -c $pname > $temp 89fd785755SGeoff Rehmet chmod u+w $pname 90cfbe890aSChris D. Faulhaber cp $temp $pname 91fd785755SGeoff Rehmet chmod 444 $pname 92fd785755SGeoff Rehmet mv $pname $fname.$sect 93cfbe890aSChris D. Faulhaber rm -f $temp 94fd785755SGeoff Rehmet else 95fd785755SGeoff Rehmet # skip symlinks - this can be 96fd785755SGeoff Rehmet # a program like expn, which is 97fd785755SGeoff Rehmet # its own man page ! 98fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 99fd785755SGeoff Rehmet fi 100fd785755SGeoff Rehmet fi };; 101fd785755SGeoff Rehmet *) { 102fd785755SGeoff Rehmet IFS=" " 103fd785755SGeoff Rehmet echo skipping file $pname 1>&2 104fd785755SGeoff Rehmet } ;; 105fd785755SGeoff Rehmet esac 106fd785755SGeoff Rehmet # reset IFS - this is important! 107fd785755SGeoff Rehmet IFS=" " 108fd785755SGeoff Rehmet} 109fd785755SGeoff Rehmet 110fd785755SGeoff Rehmet 111fd785755SGeoff Rehmet# 112fd785755SGeoff Rehmet# Uncompress manpages in paths 113fd785755SGeoff Rehmet# 114fd785755SGeoff Rehmetdo_uncompress() 115fd785755SGeoff Rehmet{ 116fd785755SGeoff Rehmet local i 117fd785755SGeoff Rehmet local dir 118f503299aSGeoff Rehmet local workdir 119fd785755SGeoff Rehmet 120f503299aSGeoff Rehmet workdir=`pwd` 121fd785755SGeoff Rehmet while [ $# != 0 ] ; do 122fd785755SGeoff Rehmet if [ -d $1 ] ; then 123fd785755SGeoff Rehmet dir=$1 124f503299aSGeoff Rehmet cd $dir 12503863e2aSGeoff Rehmet for i in * ; do 126fd785755SGeoff Rehmet case $i in 127fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 128fd785755SGeoff Rehmet *) { 129fd785755SGeoff Rehmet if [ -d $i ] ; then 130fd785755SGeoff Rehmet do_uncompress $i 131fd785755SGeoff Rehmet else 132fd785755SGeoff Rehmet if [ -e $i ] ; then 133fd785755SGeoff Rehmet uncompress_page $i 134fd785755SGeoff Rehmet fi 135fd785755SGeoff Rehmet fi } ;; 136fd785755SGeoff Rehmet esac 137fd785755SGeoff Rehmet done 138f503299aSGeoff Rehmet cd $workdir 139fd785755SGeoff Rehmet else 140fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 141fd785755SGeoff Rehmet fi 142fd785755SGeoff Rehmet shift 143fd785755SGeoff Rehmet done 144fd785755SGeoff Rehmet} 145fd785755SGeoff Rehmet 146fd785755SGeoff Rehmet# 147321bd776SGeoff Rehmet# Remove .so's from one file 148321bd776SGeoff Rehmet# 149321bd776SGeoff Rehmetso_purge_page() 150321bd776SGeoff Rehmet{ 151321bd776SGeoff Rehmet local so_entries 152321bd776SGeoff Rehmet local lines 153321bd776SGeoff Rehmet local fname 154321bd776SGeoff Rehmet 155321bd776SGeoff Rehmet so_entries=`grep "^\.so" $1 | wc -l` 156bfbd29a1SJordan K. Hubbard if [ $so_entries -eq 0 ] ; then return 0 ; fi 157321bd776SGeoff Rehmet 158321bd776SGeoff Rehmet # we have a page with a .so in it 159321bd776SGeoff Rehmet echo $1 contains a .so entry 2>&1 160321bd776SGeoff Rehmet 161321bd776SGeoff Rehmet # now check how many lines in the file 162321bd776SGeoff Rehmet lines=`wc -l < $1` 163321bd776SGeoff Rehmet 164321bd776SGeoff Rehmet # if the file is only one line long, we can replace it 165321bd776SGeoff Rehmet # with a hard link! 166321bd776SGeoff Rehmet if [ $lines -eq 1 ] ; then 167321bd776SGeoff Rehmet fname=$1; 168321bd776SGeoff Rehmet echo replacing $fname with a hard link 169321bd776SGeoff Rehmet set `cat $fname`; 170321bd776SGeoff Rehmet rm -f $fname 171321bd776SGeoff Rehmet ln ../$2 $fname 172321bd776SGeoff Rehmet else 173321bd776SGeoff Rehmet echo inlining page $fname 1>&2 174cfbe890aSChris D. Faulhaber temp=`mktemp -t manager` || exit 1 175321bd776SGeoff Rehmet cat $fname | \ 176cfbe890aSChris D. Faulhaber (cd .. ; soelim ) > $temp 177321bd776SGeoff Rehmet chmod u+w $fname 178cfbe890aSChris D. Faulhaber cp $temp $fname 179321bd776SGeoff Rehmet chmod 444 $fname 180cfbe890aSChris D. Faulhaber rm -f $temp 181321bd776SGeoff Rehmet fi 182321bd776SGeoff Rehmet} 183321bd776SGeoff Rehmet 184321bd776SGeoff Rehmet# 185321bd776SGeoff Rehmet# Remove .so entries from man pages 186321bd776SGeoff Rehmet# If a page consists of just one line with a .so, 187321bd776SGeoff Rehmet# replace it with a hard link 188321bd776SGeoff Rehmet# 189321bd776SGeoff Rehmetremove_so() 190321bd776SGeoff Rehmet{ 191321bd776SGeoff Rehmet local pname 192321bd776SGeoff Rehmet local fname 193321bd776SGeoff Rehmet local sect 194321bd776SGeoff Rehmet 195321bd776SGeoff Rehmet # break up file name 196321bd776SGeoff Rehmet pname=$1 197321bd776SGeoff Rehmet IFS='.' ; set $pname 198321bd776SGeoff Rehmet if [ $# -lt 2 ] ; then 199321bd776SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 200321bd776SGeoff Rehmet fi 201321bd776SGeoff Rehmet # construct name and section 202321bd776SGeoff Rehmet fname=$1 ; shift 203321bd776SGeoff Rehmet while [ $# -gt 1 ] ; do 204321bd776SGeoff Rehmet fname=$fname.$1 205321bd776SGeoff Rehmet shift 206321bd776SGeoff Rehmet done 207321bd776SGeoff Rehmet sect=$1 208321bd776SGeoff Rehmet 209321bd776SGeoff Rehmet IFS=" " 210321bd776SGeoff Rehmet case "$sect" in 211321bd776SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 212321bd776SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 213321bd776SGeoff Rehmet [12345678ln]*){ 214321bd776SGeoff Rehmet IFS=" " ; set `file $pname` 215321bd776SGeoff Rehmet if [ $2 = "gzip" ] ; then 216321bd776SGeoff Rehmet echo moving hard link $pname 1>&2 217321bd776SGeoff Rehmet mv $pname $pname.gz # link 218321bd776SGeoff Rehmet else 219321bd776SGeoff Rehmet if [ $2 != "symbolic" ] ; then 220321bd776SGeoff Rehmet echo "removing .so's in page $pname" 1>&2 221321bd776SGeoff Rehmet so_purge_page $pname 222321bd776SGeoff Rehmet else 223321bd776SGeoff Rehmet # skip symlink - this can be 224321bd776SGeoff Rehmet # a program like expn, which is 225321bd776SGeoff Rehmet # its own man page ! 226321bd776SGeoff Rehmet echo skipping symlink $pname 1>&2 227321bd776SGeoff Rehmet fi 228321bd776SGeoff Rehmet fi };; 229321bd776SGeoff Rehmet *) { 230321bd776SGeoff Rehmet IFS=" " 231321bd776SGeoff Rehmet echo skipping file $pname 1>&2 232321bd776SGeoff Rehmet } ;; 233321bd776SGeoff Rehmet esac 234321bd776SGeoff Rehmet # reset IFS - this is important! 235321bd776SGeoff Rehmet IFS=" " 236321bd776SGeoff Rehmet} 237321bd776SGeoff Rehmet 238321bd776SGeoff Rehmet 239321bd776SGeoff Rehmet# 240fd785755SGeoff Rehmet# compress one page 241fd785755SGeoff Rehmet# We need to watch out for hard links here. 242fd785755SGeoff Rehmet# 243fd785755SGeoff Rehmetcompress_page() 244fd785755SGeoff Rehmet{ 245fd785755SGeoff Rehmet local pname 246fd785755SGeoff Rehmet local fname 247fd785755SGeoff Rehmet local sect 248fd785755SGeoff Rehmet 249fd785755SGeoff Rehmet # break up file name 250fd785755SGeoff Rehmet pname=$1 251fd785755SGeoff Rehmet IFS='.' ; set $pname 252fd785755SGeoff Rehmet if [ $# -lt 2 ] ; then 253fd785755SGeoff Rehmet IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 254fd785755SGeoff Rehmet fi 255fd785755SGeoff Rehmet # construct name and section 256fd785755SGeoff Rehmet fname=$1 ; shift 257fd785755SGeoff Rehmet while [ $# -gt 1 ] ; do 258fd785755SGeoff Rehmet fname=$fname.$1 259fd785755SGeoff Rehmet shift 260fd785755SGeoff Rehmet done 261fd785755SGeoff Rehmet sect=$1 262fd785755SGeoff Rehmet 263fd785755SGeoff Rehmet IFS=" " 264fd785755SGeoff Rehmet case "$sect" in 265fd785755SGeoff Rehmet gz) { echo file $pname already gzipped 1>&2 ; } ;; 266fd785755SGeoff Rehmet Z) { echo file $pname already compressed 1>&2 ; } ;; 267fd785755SGeoff Rehmet [12345678ln]*){ 268fd785755SGeoff Rehmet IFS=" " ; set `file $pname` 269fd785755SGeoff Rehmet if [ $2 = "gzip" ] ; then 270fd785755SGeoff Rehmet echo moving hard link $pname 1>&2 271fd785755SGeoff Rehmet mv $pname $pname.gz # link 272fd785755SGeoff Rehmet else 273fd785755SGeoff Rehmet if [ $2 != "symbolic" ] ; then 274fd785755SGeoff Rehmet echo gzipping page $pname 1>&2 275cfbe890aSChris D. Faulhaber temp=`mktemp -t manager` || exit 1 27603863e2aSGeoff Rehmet cat $pname | \ 277cfbe890aSChris D. Faulhaber (cd .. ; soelim )| gzip -c -- > $temp 278fd785755SGeoff Rehmet chmod u+w $pname 279cfbe890aSChris D. Faulhaber cp $temp $pname 280fd785755SGeoff Rehmet chmod 444 $pname 281fd785755SGeoff Rehmet mv $pname $pname.gz 282cfbe890aSChris D. Faulhaber rm -f $temp 283fd785755SGeoff Rehmet else 284fd785755SGeoff Rehmet # skip symlink - this can be 285fd785755SGeoff Rehmet # a program like expn, which is 286fd785755SGeoff Rehmet # its own man page ! 287fd785755SGeoff Rehmet echo skipping symlink $pname 1>&2 288fd785755SGeoff Rehmet fi 289fd785755SGeoff Rehmet fi };; 290fd785755SGeoff Rehmet *) { 291fd785755SGeoff Rehmet IFS=" " 292fd785755SGeoff Rehmet echo skipping file $pname 1>&2 293fd785755SGeoff Rehmet } ;; 294fd785755SGeoff Rehmet esac 295fd785755SGeoff Rehmet # reset IFS - this is important! 296fd785755SGeoff Rehmet IFS=" " 297fd785755SGeoff Rehmet} 298fd785755SGeoff Rehmet 299fd785755SGeoff Rehmet# 300fd785755SGeoff Rehmet# Compress man pages in paths 301fd785755SGeoff Rehmet# 302321bd776SGeoff Rehmetdo_compress_so() 303fd785755SGeoff Rehmet{ 304fd785755SGeoff Rehmet local i 305fd785755SGeoff Rehmet local dir 306f503299aSGeoff Rehmet local workdir 307321bd776SGeoff Rehmet local what 308fd785755SGeoff Rehmet 309321bd776SGeoff Rehmet what=$1 310321bd776SGeoff Rehmet shift 311f503299aSGeoff Rehmet workdir=`pwd` 312fd785755SGeoff Rehmet while [ $# != 0 ] ; do 313fd785755SGeoff Rehmet if [ -d $1 ] ; then 314fd785755SGeoff Rehmet dir=$1 315f503299aSGeoff Rehmet cd $dir 316f503299aSGeoff Rehmet for i in * ; do 317fd785755SGeoff Rehmet case $i in 318fd785755SGeoff Rehmet *cat?) ;; # ignore cat directories 319fd785755SGeoff Rehmet *) { 320fd785755SGeoff Rehmet if [ -d $i ] ; then 321321bd776SGeoff Rehmet do_compress_so $what $i 322fd785755SGeoff Rehmet else 323fd785755SGeoff Rehmet if [ -e $i ] ; then 324321bd776SGeoff Rehmet $what $i 325fd785755SGeoff Rehmet fi 326fd785755SGeoff Rehmet fi } ;; 327fd785755SGeoff Rehmet esac 328fd785755SGeoff Rehmet done 329f503299aSGeoff Rehmet cd $workdir 330fd785755SGeoff Rehmet else 331fd785755SGeoff Rehmet echo "directory $1 not found" 1>&2 332fd785755SGeoff Rehmet fi 333fd785755SGeoff Rehmet shift 334fd785755SGeoff Rehmet done 335fd785755SGeoff Rehmet} 336fd785755SGeoff Rehmet 337fd785755SGeoff Rehmet# 338fd785755SGeoff Rehmet# Display a usage message 339fd785755SGeoff Rehmet# 340fd785755SGeoff Rehmetctl_usage() 341fd785755SGeoff Rehmet{ 342fd785755SGeoff Rehmet echo "usage: $1 -compress <path> ... " 1>&2 343fd785755SGeoff Rehmet echo " $1 -uncompress <path> ... " 1>&2 344fd785755SGeoff Rehmet exit 1 345fd785755SGeoff Rehmet} 346fd785755SGeoff Rehmet 347321bd776SGeoff Rehmet# 348321bd776SGeoff Rehmet# remove .so's and do compress 349321bd776SGeoff Rehmet# 350321bd776SGeoff Rehmetdo_compress() 351321bd776SGeoff Rehmet{ 352321bd776SGeoff Rehmet # First remove all so's from the pages to be compressed 353321bd776SGeoff Rehmet do_compress_so remove_so "$@" 354321bd776SGeoff Rehmet # now do ahead and compress the pages 355321bd776SGeoff Rehmet do_compress_so compress_page "$@" 356321bd776SGeoff Rehmet} 357fd785755SGeoff Rehmet 358fd785755SGeoff Rehmet# 359fd785755SGeoff Rehmet# dispatch options 360fd785755SGeoff Rehmet# 3612ae90f75SWolfram Schneiderif [ $# -lt 2 ] ; then ctl_usage $0 ; fi ; 362fd785755SGeoff Rehmet 363fd785755SGeoff Rehmetcase "$1" in 364fd785755SGeoff Rehmet -compress) shift ; do_compress "$@" ;; 365fd785755SGeoff Rehmet -uncompress) shift ; do_uncompress "$@" ;; 366fd785755SGeoff Rehmet *) ctl_usage $0 ;; 367fd785755SGeoff Rehmetesac 368