8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / cmd / svr4pkg / pkgscripts / i.CompCpio.sh
blob247f973ec7f81b1dd30fb27ebad62bea391ba317
1 #!/bin/sh
3 # CDDL HEADER START
5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
20 # CDDL HEADER END
24 # Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25 # Use is subject to license terms.
28 # i.CompCpio
30 # This shell script uncompresses and installs files archived in
31 # old-style WOS packages using the utilities cpio and compress. It
32 # looks in the PKGSRC directory for the archives which may be called
33 # out in one of eight ways :
35 # reloc.cpio.Z relocatable paths, less old style
36 # root.cpio.Z absolute paths, less old style
37 # reloc.cpio relocatable paths less old style, not compressed
38 # root.cpio absolute paths, less old style, not compressed
39 # reloc.Z relocatable paths, old style, compressed
40 # root.Z absolute paths, old style, compressed
41 # reloc relocatable paths, old style, not compressed
42 # root absolute paths, old style, not compressed
44 # stdin carries the source directory as the first entry followed by the
45 # paths of the files to be installed as indicated in the pkgmap. Since
46 # all operations take place from the declared base directory, both relative
47 # and absolute paths will install correctly. There are three methods and
48 # since speed is of the essence, we skip straight to the right one :
50 # If it's an initial install
51 # do a full cpio for each archive
52 # else
53 # If there's only the reloc archive
54 # make a file list, rm executables, do a selective cpio
55 # else
56 # rm executables, do a full cpio for each archive
58 # Since the old-style archives contain no execute permissions, this
59 # script saves the executables it requires so it can clean up after
60 # unloading the archive. If /usr/lib/ld.so or .so.1 is included in the
61 # package, no cleanup will be possible (nothing will run) so we clean
62 # up first and then unload the entire archive without a file list.
64 NAME="i.CompCpio"
65 FILELIST=${PKGSAV:?undefined}/filelist
66 BD=${BASEDIR:-/}
67 IR=${PKG_INSTALL_ROOT:-/}
68 MAXLIST=550 # This is arbitrary based upon 2.4 cpio
69 count=0
71 reloc_cpio_Z=0
72 root_cpio_Z=0
73 reloc_cpio=0
74 root_cpio=0
75 Reloc_Arch=""
76 Root_Arch=""
77 is_an_archive=0
78 is_a_filelist=0
79 mk_filelist=0
80 list_empty=1
81 local_install=0
82 Spcl_init=0
83 Rm_alt_sav=0
85 # critical archived dynamic libraries and executables
86 Spcl_lib=0
87 Spcl_exec=0
88 Movelist=""
89 Ld_Preload=""
90 Ld1=usr/lib/ld.so.1
91 Ld=usr/lib/ld.so
92 Libintl=usr/lib/libintl.so.1
93 Libmalloc=usr/lib/libmapmalloc.so.1
94 Libc=usr/lib/libc.so.1
95 Libw=usr/lib/libw.so.1
96 Libdl=usr/lib/libdl.so.1
97 Cpio=usr/bin/cpio
98 Rm=usr/bin/rm
99 Ln=usr/bin/ln
100 Mv=usr/bin/mv
101 Nawk=usr/bin/nawk
102 Zcat=usr/bin/zcat
104 # Set up the default paths
105 MV_xpath=/usr/bin
106 MV_cmd=$MV_xpath/mv
107 CPIO_xpath=/usr/bin
108 CPIO_cmd=$CPIO_xpath/cpio
109 ZCAT_xpath=/usr/bin
110 ZCAT_cmd=$ZCAT_xpath/zcat
111 LN_xpath=/usr/bin
112 LN_cmd=$LN_xpath/ln
113 NAWK_xpath=/usr/bin
114 NAWK_cmd=$NAWK_xpath/nawk
115 RM_xpath=/usr/bin
116 RM_cmd=$RM_xpath/rm
117 Tmp_xpath=/usr/tmp$$dir
118 Tmp_Creat=0
119 rm_cpio=0
120 rm_ln=0
121 rm_zcat=0
122 rm_nawk=0
123 rm_rm=0
124 rm_mv=0
125 no_select=0
127 # Functions
130 # This creates the temporary directory for holding the old dynamic
131 # libraries and executables.
133 mktempdir() {
134 if [ ! -d $Tmp_xpath ]; then
135 mkdir $Tmp_xpath
136 if [ $? -ne 0 ]; then
137 echo `gettext "ERROR : $NAME cannot create $Tmp_xpath."`
138 exit 1
141 Tmp_Creat=1
145 # Test a path to see if it represents a dynamic library or executable that
146 # we use in this script. If it is, deal with the special case.
148 spclcase() { # $1 is the pathname to special case
149 if [ $local_install -eq 1 ]; then
150 case $1 in
151 $Ld) no_select=1;;
152 $Ld1) no_select=1;;
153 $Libintl) Spcl_lib=1; file=libintl.so.1;;
154 $Libmalloc) Spcl_lib=1; file=libmapmalloc.so.1;;
155 $Libc) Spcl_lib=1; file=libc.so.1;;
156 $Libw) Spcl_lib=1; file=libw.so.1;;
157 $Libdl) Spcl_lib=1; file=libdl.so.1;;
158 $Cpio) rm_cpio=1; Spcl_exec=1;;
159 $Ln) rm_ln=1; Spcl_exec=1;;
160 $Zcat) rm_zcat=1; Spcl_exec=1;;
161 $Nawk) rm_nawk=1; Spcl_exec=1;;
162 $Rm) rm_rm=1; Spcl_exec=1;;
163 $Mv) rm_mv=1; Spcl_exec=1;;
164 esac
166 if [ $no_select -eq 1 ]; then
167 is_a_filelist=0
168 list_empty=1
169 $RM_cmd $FILELIST
170 if [ $Rm_alt_sav -eq 1 ]; then
171 $RM_cmd -r $PKGSAV
172 Rm_alt_sav=0
174 exec_clean 1
175 return 1
176 elif [ $Spcl_lib -eq 1 ]; then
177 if [ $Tmp_Creat -eq 0 ]; then
178 mktempdir
181 if [ $Spcl_init -eq 0 ]; then
182 Org_LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
183 LD_LIBRARY_PATH="$Org_LD_LIBRARY_PATH $Tmp_xpath"
184 export LD_LIBRARY_PATH
185 Spcl_init=1
187 Ld_Preload="$Ld_Preload $Tmp_xpath/$file"
188 LD_PRELOAD=$Ld_Preload
189 export LD_PRELOAD
190 Movelist="$1 $file $Movelist"
191 $MV_cmd $1 $Tmp_xpath
192 $LN_cmd -s ../..$Tmp_xpath/$file $1
193 Spcl_lib=0
194 elif [ $Spcl_exec -eq 1 ]; then
195 if [ $Tmp_Creat -eq 0 ]; then
196 mktempdir
199 $MV_cmd $1 $Tmp_xpath
200 if [ $rm_cpio -eq 1 ]; then
201 $LN_cmd -s ../..$Tmp_xpath/cpio $1
202 CPIO_cmd="$Tmp_xpath/cpio"
203 Movelist="$1 cpio $Movelist"
204 rm_cpio=0
205 elif [ $rm_ln -eq 1 ]; then
206 $Tmp_xpath/ln -s ../..$Tmp_xpath/ln $1
207 LN_cmd="$Tmp_xpath/ln"
208 Movelist="$1 ln $Movelist"
209 rm_ln=0
210 elif [ $rm_nawk -eq 1 ]; then
211 $LN_cmd -s ../..$Tmp_xpath/nawk $1
212 NAWK_cmd="$Tmp_xpath/nawk"
213 Movelist="$1 nawk $Movelist"
214 rm_nawk=0
215 elif [ $rm_zcat -eq 1 ]; then
216 $LN_cmd -s ../..$Tmp_xpath/zcat $1
217 ZCAT_cmd="$Tmp_xpath/zcat"
218 Movelist="$1 zcat $Movelist"
219 rm_zcat=0
220 elif [ $rm_rm -eq 1 ]; then
221 $LN_cmd -s ../..$Tmp_xpath/rm $1
222 RM_cmd="$Tmp_xpath/rm"
223 Movelist="$Movelist $1 rm"
224 rm_rm=0
225 elif [ $rm_mv -eq 1 ]; then
226 $LN_cmd -s ../..$Tmp_xpath/mv $1
227 MV_cmd="$Tmp_xpath/mv"
228 Movelist="$Movelist $1 mv"
229 rm_mv=0
231 Spcl_exec=0
235 return 0
239 # Clean up the libraries and executables that were moved.
241 exec_clean() { # $1 =1 means be quiet
242 if [ ! -z "${Movelist}" ]; then
243 echo $Movelist | $NAWK_cmd '
244 { split ($0, line)
245 for (n=1; n <= NF; n++) {
246 print line[n]
248 }' | while read path; do
249 read file
250 if [ -h $path ]; then # If it's our slink
251 # then put the original back
252 if [ $1 -eq 0 ]; then
253 echo `gettext "WARNING : $path not found in archive."`
255 $MV_cmd $Tmp_xpath/$file $path
256 else # if the archive put something down
257 # remove the temporary copy
258 $RM_cmd $Tmp_xpath/$file
260 done
261 for path in $Movelist; do
262 if [ -x $path ]; then
263 case $path in
264 $Cpio) CPIO_cmd="$CPIO_xpath/cpio";;
265 $Ln) LN_cmd="$LN_xpath/ln";;
266 $Zcat) ZCAT_cmd="$ZCAT_xpath/zcat";;
267 $Nawk) NAWK_cmd="$NAWK_xpath/nawk";;
268 $Rm) RM_cmd="$RM_xpath/rm";;
269 $Mv) MV_cmd="$MV_xpath/mv";;
270 esac
272 done
273 Movelist=""
275 if [ $Tmp_Creat -eq 1 ]; then
276 $RM_cmd -r $Tmp_xpath
277 Tmp_Creat=0
283 # Figure out what kind of package this is
285 eval_pkg() {
287 # Any archive, whether compressed or not needs to be handled
288 # the same. i.e. reloc.cpio.Z and root.cpio.Z should cause
289 # the global is_an_archive to be set to 1.
291 read path
292 if [ ${path:-NULL} != NULL ]; then # get the package source directory
293 PKGSRC=${path:?undefined}
295 if [ ${PKG_INSTALL_ROOT:-/} = "/" ]; then
296 local_install=1
299 if [ -r $PKGSRC/reloc.cpio.Z ]; then
300 reloc_cpio_Z=1
301 Reloc_Arch=$PKGSRC/reloc.cpio.Z
302 is_an_archive=1
305 if [ -r $PKGSRC/root.cpio.Z ]; then
306 root_cpio_Z=1
307 Root_Arch=$PKGSRC/root.cpio.Z
308 is_an_archive=1
311 if [ -r $PKGSRC/reloc.cpio ]; then
312 reloc_cpio=1
313 Reloc_Arch=$PKGSRC/reloc.cpio
314 is_an_archive=1
317 if [ -r $PKGSRC/root.cpio ]; then
318 root_cpio=1
319 Root_Arch=$PKGSRC/root.cpio
320 is_an_archive=1
323 if [ -r $PKGSRC/reloc.Z ]; then
324 reloc_cpio_Z=1
325 Reloc_Arch=$PKGSRC/reloc.Z
326 is_an_archive=2
329 if [ -r $PKGSRC/root.Z ]; then
330 root_cpio_Z=1
331 Root_Arch=$PKGSRC/root.Z
332 is_an_archive=2
335 if [ -f $PKGSRC/reloc ]; then
336 reloc_cpio=1
337 Reloc_Arch=$PKGSRC/reloc
338 is_an_archive=2
341 if [ -f $PKGSRC/root ]; then
342 root_cpio=1
343 Root_Arch=$PKGSRC/root
344 is_an_archive=2
346 else
347 exit 0 # empty pipe, we're done
352 # main
355 eval_pkg
357 if [ $BD = "/" ]; then
358 Client_BD=""
359 else
360 Client_BD=`echo $BD | sed s@/@@`
363 if [ $is_an_archive -eq 0 ]; then
364 echo `gettext "ERROR : $NAME cannot find archived files in $PKGSRC."`
365 exit 1
368 if [ ! -d $PKGSAV ]; then
369 echo `gettext "WARNING : $NAME cannot find save directory $PKGSAV."`
370 PKGSAV=/tmp/$PKG.sav
372 if [ ! -d $PKGSAV ]; then
373 /usr/bin/mkdir $PKGSAV
376 if [ $? -eq 0 ]; then
377 echo `gettext " Using alternate save directory" $PKGSAV`
378 FILELIST=$PKGSAV/filelist
379 Rm_alt_sav=1
380 else
381 echo `gettext "ERROR : cannot create alternate save directory"` $PKGSAV
382 exit 1
386 if [ -f $FILELIST ]; then
387 rm $FILELIST
390 cd $BD
392 # If there's one old-style archive and it is relocatable and this is
393 # not an initial install then make a file list for extraction.
394 if [ $is_an_archive -eq 1 -a ${PKG_INIT_INSTALL:-null} = null ]; then
395 mk_filelist=1
398 # If this is not an initial install then clear out potentially executing
399 # files and libraries for cpio and create an extraction list if necessary
400 if [ ${PKG_INIT_INSTALL:-null} = null ]; then
401 if [ $local_install -eq 1 ]; then
402 # If extraction list is desired, create it
403 if [ $mk_filelist -eq 1 ]; then
404 is_a_filelist=1
405 while read path
407 echo $path >> $FILELIST
408 list_empty=0
409 if [ -x ${path:-NULL} ]; then
410 full_path=`echo $Client_BD/$path | sed s@//@/@g`
411 spclcase $full_path
412 if [ $? -eq 1 ]; then
413 break
416 done
418 # If there's a path containing a '$' then we can't
419 # use the extraction list because of the shell
420 if [ $list_empty -eq 0 ]; then
421 s=`LD_PRELOAD="$Ld_Preload" $NAWK_cmd ' /\\$/ { print } ' $FILELIST`
423 if [ ! -z "${s}" ]; then
424 is_a_filelist=0
427 else # No extraction list is desired
428 while read path
430 if [ -x ${path:-NULL} ]; then
431 full_path=`echo $Client_BD/$path | sed s@//@/@g`
432 spclcase $full_path
433 if [ $? -eq 1 ]; then
434 break
437 done
438 fi # $mk_filelist -eq 1
439 else # ! ($local_install -eq 1)
440 # If extraction list is desired, create it
441 if [ $mk_filelist -eq 1 ]; then
442 is_a_filelist=1
443 while read path
445 echo $path >> $FILELIST
446 list_empty=0
447 done
449 # If there's a path containing a '$' then we can't
450 # use the extraction list because of the shell
451 if [ $list_empty -eq 0 ]; then
452 s=`LD_PRELOAD="$Ld_Preload" $NAWK_cmd ' /\\$/ { print } ' $FILELIST`
454 if [ ! -z "${s}" ]; then
455 is_a_filelist=0
458 fi # $mk_filelist -eq 1
459 fi # $local_install -eq 1
460 fi # ${PKG_INIT_INSTALL:-null} = null
462 # Now extract the data from the archive(s)
463 # extract compressed cpio relocatable archive
464 if [ $reloc_cpio_Z -eq 1 ]; then
465 cd $BD
466 if [ $is_a_filelist -eq 1 ]; then
467 if [ $list_empty -eq 0 ]; then
468 $ZCAT_cmd $Reloc_Arch | $CPIO_cmd -idukm -E $FILELIST
469 if [ $? -ne 0 ]; then
470 echo `gettext "cpio of $Reloc_Arch failed with error $?."`
471 exit 1
475 else
476 $ZCAT_cmd $Reloc_Arch | $CPIO_cmd -idukm
480 # extract compressed cpio absolute archive
481 if [ $root_cpio_Z -eq 1 ]; then
482 cd $IR
483 $ZCAT_cmd $Root_Arch | $CPIO_cmd -idukm
484 if [ $? -ne 0 ]; then
485 echo `gettext "cpio of $Root_Arch failed with error $?."`
486 exit 1
490 # extract cpio relocatable archive
491 if [ $reloc_cpio -eq 1 ]; then
492 cd $BD
493 if [ $is_a_filelist -eq 1 ]; then
494 if [ $list_empty -eq 0 ]; then
495 $CPIO_cmd -idukm -I $Reloc_Arch -E $FILELIST
497 if [ $? -ne 0 ]; then
498 echo `gettext "cpio of $Reloc_Arch failed with error $?."`
499 exit 1
502 else
503 $CPIO_cmd -idukm -I $Reloc_Arch
507 # extract cpio absolute archive
508 if [ $root_cpio -eq 1 ]; then
509 cd $IR
510 $CPIO_cmd -idukm -I $Root_Arch
511 if [ $? -ne 0 ]; then
512 echo `gettext "cpio of $Root_Arch failed with error $?."`
513 exit 1
517 if [ -f $FILELIST ]; then
518 $RM_cmd $FILELIST
521 if [ $Rm_alt_sav -eq 1 ]; then
522 $RM_cmd -r $PKGSAV
523 Rm_alt_sav=0
526 exec_clean 0
528 if [ $Tmp_Creat -eq 1 ]; then
529 $RM_cmd -r $Tmp_xpath
532 if [ $Spcl_init -eq 1 ]; then
533 LD_LIBRARY_PATH=$Org_LD_LIBRARY_PATH
534 export LD_LIBRARY_PATH
535 Spcl_init=0
538 exit 0