1 #!/bin/sh
2 #
3 # CDDL HEADER START
4 #
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.
8 #
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.
13 #
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]
19 #
20 # CDDL HEADER END
21 #
22
23 #
24 # Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25 # Use is subject to license terms.
26 #
27
28 # i.CompCpio
29 #
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 :
34 #
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
43 #
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 :
49 #
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
57 #
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.
63 #
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
70
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
84
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 Awk=usr/xpg4/bin/awk
102 Zcat=usr/bin/zcat
103
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 AWK_xpath=/usr/xpg4/bin/
114 AWK_cmd=$AWK_xpath/awk
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_awk=0
123 rm_rm=0
124 rm_mv=0
125 no_select=0
126
127 # Functions
128
129 #
130 # This creates the temporary directory for holding the old dynamic
131 # libraries and executables.
132 #
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
139 fi
140 fi
141 Tmp_Creat=1
142 }
143
144 #
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.
147 #
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 $Awk) rm_awk=1; Spcl_exec=1;;
162 $Rm) rm_rm=1; Spcl_exec=1;;
163 $Mv) rm_mv=1; Spcl_exec=1;;
164 esac
165
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
173 fi
174 exec_clean 1
175 return 1
176 elif [ $Spcl_lib -eq 1 ]; then
177 if [ $Tmp_Creat -eq 0 ]; then
178 mktempdir
179 fi
180
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
186 fi
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
197 fi
198
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_awk -eq 1 ]; then
211 $LN_cmd -s ../..$Tmp_xpath/awk $1
212 AWK_cmd="$Tmp_xpath/awk"
213 Movelist="$1 awk $Movelist"
214 rm_awk=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
230 fi
231 Spcl_exec=0
232 fi
233 fi
234
235 return 0
236 }
237
238 #
239 # Clean up the libraries and executables that were moved.
240 #
241 exec_clean() { # $1 =1 means be quiet
242 if [ ! -z "${Movelist}" ]; then
243 echo $Movelist | $AWK_cmd '
244 { split ($0, line)
245 for (n=1; n <= NF; n++) {
246 print line[n]
247 }
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."`
254 fi
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
259 fi
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 $Awk) AWK_cmd="$AWK_xpath/awk";;
268 $Rm) RM_cmd="$RM_xpath/rm";;
269 $Mv) MV_cmd="$MV_xpath/mv";;
270 esac
271 fi
272 done
273 Movelist=""
274
275 if [ $Tmp_Creat -eq 1 ]; then
276 $RM_cmd -r $Tmp_xpath
277 Tmp_Creat=0
278 fi
279 fi
280 }
281
282 #
283 # Figure out what kind of package this is
284 #
285 eval_pkg() {
286
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.
290
291 read path
292 if [ ${path:-NULL} != NULL ]; then # get the package source directory
293 PKGSRC=${path:?undefined}
294
295 if [ ${PKG_INSTALL_ROOT:-/} = "/" ]; then
296 local_install=1
297 fi
298
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
303 fi
304
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
309 fi
310
311 if [ -r $PKGSRC/reloc.cpio ]; then
312 reloc_cpio=1
313 Reloc_Arch=$PKGSRC/reloc.cpio
314 is_an_archive=1
315 fi
316
317 if [ -r $PKGSRC/root.cpio ]; then
318 root_cpio=1
319 Root_Arch=$PKGSRC/root.cpio
320 is_an_archive=1
321 fi
322
323 if [ -r $PKGSRC/reloc.Z ]; then
324 reloc_cpio_Z=1
325 Reloc_Arch=$PKGSRC/reloc.Z
326 is_an_archive=2
327 fi
328
329 if [ -r $PKGSRC/root.Z ]; then
330 root_cpio_Z=1
331 Root_Arch=$PKGSRC/root.Z
332 is_an_archive=2
333 fi
334
335 if [ -f $PKGSRC/reloc ]; then
336 reloc_cpio=1
337 Reloc_Arch=$PKGSRC/reloc
338 is_an_archive=2
339 fi
340
341 if [ -f $PKGSRC/root ]; then
342 root_cpio=1
343 Root_Arch=$PKGSRC/root
344 is_an_archive=2
345 fi
346 else
347 exit 0 # empty pipe, we're done
348 fi
349 }
350
351 #
352 # main
353 #
354
355 eval_pkg
356
357 if [ $BD = "/" ]; then
358 Client_BD=""
359 else
360 Client_BD=`echo $BD | sed s@/@@`
361 fi
362
363 if [ $is_an_archive -eq 0 ]; then
364 echo `gettext "ERROR : $NAME cannot find archived files in $PKGSRC."`
365 exit 1
366 fi
367
368 if [ ! -d $PKGSAV ]; then
369 echo `gettext "WARNING : $NAME cannot find save directory $PKGSAV."`
370 PKGSAV=/tmp/$PKG.sav
371
372 if [ ! -d $PKGSAV ]; then
373 /usr/bin/mkdir $PKGSAV
374 fi
375
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
383 fi
384 fi
385
386 if [ -f $FILELIST ]; then
387 rm $FILELIST
388 fi
389
390 cd $BD
391
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
396 fi
397
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
406 do
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
414 fi
415 fi
416 done
417
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" $AWK_cmd ' /\\$/ { print } ' $FILELIST`
422
423 if [ ! -z "${s}" ]; then
424 is_a_filelist=0
425 fi
426 fi
427 else # No extraction list is desired
428 while read path
429 do
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
435 fi
436 fi
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
444 do
445 echo $path >> $FILELIST
446 list_empty=0
447 done
448
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" $AWK_cmd ' /\\$/ { print } ' $FILELIST`
453
454 if [ ! -z "${s}" ]; then
455 is_a_filelist=0
456 fi
457 fi
458 fi # $mk_filelist -eq 1
459 fi # $local_install -eq 1
460 fi # ${PKG_INIT_INSTALL:-null} = null
461
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
472 fi
473
474 fi
475 else
476 $ZCAT_cmd $Reloc_Arch | $CPIO_cmd -idukm
477 fi
478 fi
479
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
487 fi
488 fi
489
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
496
497 if [ $? -ne 0 ]; then
498 echo `gettext "cpio of $Reloc_Arch failed with error $?."`
499 exit 1
500 fi
501 fi
502 else
503 $CPIO_cmd -idukm -I $Reloc_Arch
504 fi
505 fi
506
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
514 fi
515 fi
516
517 if [ -f $FILELIST ]; then
518 $RM_cmd $FILELIST
519 fi
520
521 if [ $Rm_alt_sav -eq 1 ]; then
522 $RM_cmd -r $PKGSAV
523 Rm_alt_sav=0
524 fi
525
526 exec_clean 0
527
528 if [ $Tmp_Creat -eq 1 ]; then
529 $RM_cmd -r $Tmp_xpath
530 fi
531
532 if [ $Spcl_init -eq 1 ]; then
533 LD_LIBRARY_PATH=$Org_LD_LIBRARY_PATH
534 export LD_LIBRARY_PATH
535 Spcl_init=0
536 fi
537
538 exit 0