]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/manctl/manctl.sh
Update the Arm Optimized Routine library to v24.01
[FreeBSD/FreeBSD.git] / usr.sbin / manctl / manctl.sh
1 #!/bin/sh 
2 #
3 # SPDX-License-Identifier: BSD-4-Clause
4 #
5 # Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University
6 # All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 # 1. Redistributions of source code must retain the above copyright
12 #    notice, this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in the
15 #    documentation and/or other materials provided with the distribution.
16 # 3. All advertising materials mentioning features or use of this software
17 #    must display the following acknowledgement:
18 #       This product includes software developed by Geoffrey M. Rehmet
19 # 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University
20 #    may be used to endorse or promote products derived from this software
21 #    without specific prior written permission.
22 #
23 # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
24 # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 # IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE
27 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 # SUCH DAMAGE.
34 #
35 #
36 # manctl: 
37 #       a utility for manipulating manual pages
38 # functions:
39 #       compress uncompressed man pages (elliminating .so's)
40 #               this is now two-pass.  If possible, .so's
41 #               are replaced with hard links
42 #       uncompress compressed man pages
43 # Things to watch out for:
44 #       Hard links - careful with g(un)zipping!
45 #       .so's - throw everything through soelim before gzip!
46 #       symlinks - ignore these - eg: expn is its own man page:
47 #                       don't want to compress this!
48 #
49 PATH=/bin:/sbin:/usr/bin:/usr/sbin; export PATH
50
51 #
52 # Uncompress one page
53 #
54 uncompress_page()
55 {
56         local   pname
57         local   fname
58         local   sect
59         local   ext
60
61         # break up file name
62         pname=$1
63         IFS='.' ; set $pname
64         # less than 3 fields - don't know what to do with this
65         if [ $# -lt 3 ] ; then 
66                 IFS="   " ; echo ignoring $pname 1>&2 ; return 0 ; 
67         fi
68         # construct name and section
69         fname=$1 ; shift
70         while [ $# -gt 2 ] ; do
71                 fname=$fname.$1
72                 shift
73         done
74         sect=$1
75         ext=$2
76
77         IFS="   "
78         case "$ext" in
79         gz|Z)   { 
80                 IFS="   " ; set `file $pname`
81                 if [ $2 != "gzip" ] ; then 
82                         echo moving hard link $pname 1>&2
83                         mv $pname $fname.$ext   # link
84                 else
85                         if [ $2 != "symbolic" ] ; then
86                                 echo gunzipping page $pname 1>&2
87                                 temp=`mktemp -t manager` || exit 1
88                                 gunzip -c $pname > $temp
89                                 chmod u+w $pname
90                                 cp $temp $pname
91                                 chmod 444 $pname
92                                 mv $pname $fname.$sect
93                                 rm -f $temp
94                         else
95                                 # skip symlinks - this can be
96                                 # a program like expn, which is
97                                 # its own man page !
98                                 echo skipping symlink $pname 1>&2
99                         fi
100                 fi };;
101         *)      {
102                 IFS="   "
103                 echo skipping file $pname 1>&2
104                 } ;;
105         esac
106         # reset IFS - this is important!
107         IFS="   "
108 }
109
110
111 #
112 # Uncompress manpages in paths
113 #
114 do_uncompress()
115 {
116         local   i
117         local   dir
118         local   workdir
119
120         workdir=`pwd`
121         while [ $# != 0 ] ; do
122                 if [ -d $1 ] ; then
123                         dir=$1
124                         cd $dir
125                         for i in * ; do
126                                 case $i in
127                                 *cat?)  ;; # ignore cat directories
128                                 *)      {
129                                         if [ -d $i ] ; then 
130                                                 do_uncompress $i
131                                         else
132                                                 if [ -e $i ] ; then
133                                                         uncompress_page $i
134                                                 fi
135                                         fi } ;;
136                                 esac
137                         done
138                         cd $workdir
139                 else
140                         echo "directory $1 not found" 1>&2
141                 fi
142                 shift
143         done
144 }
145
146 #
147 # Remove .so's from one file
148 #
149 so_purge_page()
150 {
151         local   so_entries
152         local   lines
153         local   fname
154
155         so_entries=`grep "^\.so" $1 | wc -l`
156         if [ $so_entries -eq 0 ] ; then return 0 ; fi
157
158         # we have a page with a .so in it
159         echo $1 contains a .so entry 2>&1
160         
161         # now check how many lines in the file
162         lines=`wc -l < $1`
163
164         # if the file is only one line long, we can replace it
165         # with a hard link!
166         if [ $lines -eq 1 ] ; then
167                 fname=$1;
168                 echo replacing $fname with a hard link
169                 set `cat $fname`;
170                 rm -f $fname
171                 ln ../$2 $fname
172         else
173                 echo inlining page $fname 1>&2
174                 temp=`mktemp -t manager` || exit 1
175                 cat $fname | \
176                 (cd .. ; soelim ) > $temp
177                 chmod u+w $fname
178                 cp $temp $fname
179                 chmod 444 $fname
180                 rm -f $temp
181         fi
182 }
183
184 #
185 # Remove .so entries from man pages
186 #       If a page consists of just one line with a .so,
187 #       replace it with a hard link
188 #
189 remove_so()
190 {
191         local   pname
192         local   fname
193         local   sect
194
195         # break up file name
196         pname=$1
197         IFS='.' ; set $pname
198         if [ $# -lt 2 ] ; then 
199                 IFS="   " ; echo ignoring $pname 1>&2 ; return 0 ; 
200         fi
201         # construct name and section
202         fname=$1 ; shift
203         while [ $# -gt 1 ] ; do
204                 fname=$fname.$1
205                 shift
206         done
207         sect=$1
208
209         IFS="   "
210         case "$sect" in
211         gz)     { echo file $pname already gzipped 1>&2 ; } ;;
212         Z)      { echo file $pname already compressed 1>&2 ; } ;;
213         [12345678ln]*){
214                 IFS="   " ; set `file $pname`
215                 if [ $2 = "gzip" ] ; then 
216                         echo moving hard link $pname 1>&2
217                         mv $pname $pname.gz     # link
218                 else
219                         if [ $2 != "symbolic" ] ; then
220                                 echo "removing .so's in  page $pname" 1>&2
221                                 so_purge_page $pname
222                         else
223                                 # skip symlink - this can be
224                                 # a program like expn, which is
225                                 # its own man page !
226                                 echo skipping symlink $pname 1>&2
227                         fi
228                 fi };;
229         *)      {
230                 IFS="   "
231                 echo skipping file $pname 1>&2
232                 } ;;
233         esac
234         # reset IFS - this is important!
235         IFS="   "
236 }
237
238
239 #
240 # compress one page
241 #       We need to watch out for hard links here.
242 #
243 compress_page()
244 {
245         local   pname
246         local   fname
247         local   sect
248
249         # break up file name
250         pname=$1
251         IFS='.' ; set $pname
252         if [ $# -lt 2 ] ; then 
253                 IFS="   " ; echo ignoring $pname 1>&2 ; return 0 ; 
254         fi
255         # construct name and section
256         fname=$1 ; shift
257         while [ $# -gt 1 ] ; do
258                 fname=$fname.$1
259                 shift
260         done
261         sect=$1
262
263         IFS="   "
264         case "$sect" in
265         gz)     { echo file $pname already gzipped 1>&2 ; } ;;
266         Z)      { echo file $pname already compressed 1>&2 ; } ;;
267         [12345678ln]*){
268                 IFS="   " ; set `file $pname`
269                 if [ $2 = "gzip" ] ; then 
270                         echo moving hard link $pname 1>&2
271                         mv $pname $pname.gz     # link
272                 else
273                         if [ $2 != "symbolic" ] ; then
274                                 echo gzipping page $pname 1>&2
275                                 temp=`mktemp -t manager` || exit 1
276                                 cat $pname | \
277                                 (cd .. ; soelim )| gzip -c -- > $temp
278                                 chmod u+w $pname
279                                 cp $temp $pname
280                                 chmod 444 $pname
281                                 mv $pname $pname.gz
282                                 rm -f $temp
283                         else
284                                 # skip symlink - this can be
285                                 # a program like expn, which is
286                                 # its own man page !
287                                 echo skipping symlink $pname 1>&2
288                         fi
289                 fi };;
290         *)      {
291                 IFS="   "
292                 echo skipping file $pname 1>&2
293                 } ;;
294         esac
295         # reset IFS - this is important!
296         IFS="   "
297 }
298
299 #
300 # Compress man pages in paths
301 #
302 do_compress_so()
303 {
304         local   i
305         local   dir
306         local   workdir
307         local   what
308
309         what=$1
310         shift
311         workdir=`pwd`
312         while [ $# != 0 ] ; do
313                 if [ -d $1 ] ; then
314                         dir=$1
315                         cd $dir
316                         for i in * ; do
317                                 case $i in
318                                 *cat?)  ;; # ignore cat directories
319                                 *)      {
320                                         if [ -d $i ] ; then 
321                                                 do_compress_so $what $i
322                                         else 
323                                                 if [ -e $i ] ; then
324                                                         $what $i
325                                                 fi
326                                         fi } ;;
327                                 esac
328                         done
329                         cd $workdir
330                 else
331                         echo "directory $1 not found" 1>&2
332                 fi
333                 shift
334         done
335 }
336
337 #
338 # Display a usage message
339 #
340 ctl_usage()
341 {
342         echo "usage: $1 -compress <path> ... " 1>&2
343         echo "       $1 -uncompress <path> ... " 1>&2
344         exit 1
345 }
346
347 #
348 # remove .so's and do compress
349 #
350 do_compress()
351 {
352         # First remove all so's from the pages to be compressed
353         do_compress_so remove_so "$@"
354         # now do ahead and compress the pages
355         do_compress_so compress_page "$@"
356 }
357
358 #
359 # dispatch options
360 #
361 if [ $# -lt 2 ] ; then ctl_usage $0 ; fi ;
362
363 case "$1" in
364         -compress)      shift ; do_compress "$@" ;;
365         -uncompress)    shift ; do_uncompress "$@" ;;
366         *)              ctl_usage $0 ;;
367 esac