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