#!/bin/sh # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2005 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # i.CompCpio # # This shell script uncompresses and installs files archived in # old-style WOS packages using the utilities cpio and compress. It # looks in the PKGSRC directory for the archives which may be called # out in one of eight ways : # # reloc.cpio.Z relocatable paths, less old style # root.cpio.Z absolute paths, less old style # reloc.cpio relocatable paths less old style, not compressed # root.cpio absolute paths, less old style, not compressed # reloc.Z relocatable paths, old style, compressed # root.Z absolute paths, old style, compressed # reloc relocatable paths, old style, not compressed # root absolute paths, old style, not compressed # # stdin carries the source directory as the first entry followed by the # paths of the files to be installed as indicated in the pkgmap. Since # all operations take place from the declared base directory, both relative # and absolute paths will install correctly. There are three methods and # since speed is of the essence, we skip straight to the right one : # # If it's an initial install # do a full cpio for each archive # else # If there's only the reloc archive # make a file list, rm executables, do a selective cpio # else # rm executables, do a full cpio for each archive # # Since the old-style archives contain no execute permissions, this # script saves the executables it requires so it can clean up after # unloading the archive. If /usr/lib/ld.so or .so.1 is included in the # package, no cleanup will be possible (nothing will run) so we clean # up first and then unload the entire archive without a file list. # NAME="i.CompCpio" FILELIST=${PKGSAV:?undefined}/filelist BD=${BASEDIR:-/} IR=${PKG_INSTALL_ROOT:-/} MAXLIST=550 # This is arbitrary based upon 2.4 cpio count=0 reloc_cpio_Z=0 root_cpio_Z=0 reloc_cpio=0 root_cpio=0 Reloc_Arch="" Root_Arch="" is_an_archive=0 is_a_filelist=0 mk_filelist=0 list_empty=1 local_install=0 Spcl_init=0 Rm_alt_sav=0 # critical archived dynamic libraries and executables Spcl_lib=0 Spcl_exec=0 Movelist="" Ld_Preload="" Ld1=usr/lib/ld.so.1 Ld=usr/lib/ld.so Libintl=usr/lib/libintl.so.1 Libmalloc=usr/lib/libmapmalloc.so.1 Libc=usr/lib/libc.so.1 Libw=usr/lib/libw.so.1 Libdl=usr/lib/libdl.so.1 Cpio=usr/bin/cpio Rm=usr/bin/rm Ln=usr/bin/ln Mv=usr/bin/mv Nawk=usr/bin/nawk Zcat=usr/bin/zcat # Set up the default paths MV_xpath=/usr/bin MV_cmd=$MV_xpath/mv CPIO_xpath=/usr/bin CPIO_cmd=$CPIO_xpath/cpio ZCAT_xpath=/usr/bin ZCAT_cmd=$ZCAT_xpath/zcat LN_xpath=/usr/bin LN_cmd=$LN_xpath/ln NAWK_xpath=/usr/bin NAWK_cmd=$NAWK_xpath/nawk RM_xpath=/usr/bin RM_cmd=$RM_xpath/rm Tmp_xpath=/usr/tmp$$dir Tmp_Creat=0 rm_cpio=0 rm_ln=0 rm_zcat=0 rm_nawk=0 rm_rm=0 rm_mv=0 no_select=0 # Functions # # This creates the temporary directory for holding the old dynamic # libraries and executables. # mktempdir() { if [ ! -d $Tmp_xpath ]; then mkdir $Tmp_xpath if [ $? -ne 0 ]; then echo `gettext "ERROR : $NAME cannot create $Tmp_xpath."` exit 1 fi fi Tmp_Creat=1 } # # Test a path to see if it represents a dynamic library or executable that # we use in this script. If it is, deal with the special case. # spclcase() { # $1 is the pathname to special case if [ $local_install -eq 1 ]; then case $1 in $Ld) no_select=1;; $Ld1) no_select=1;; $Libintl) Spcl_lib=1; file=libintl.so.1;; $Libmalloc) Spcl_lib=1; file=libmapmalloc.so.1;; $Libc) Spcl_lib=1; file=libc.so.1;; $Libw) Spcl_lib=1; file=libw.so.1;; $Libdl) Spcl_lib=1; file=libdl.so.1;; $Cpio) rm_cpio=1; Spcl_exec=1;; $Ln) rm_ln=1; Spcl_exec=1;; $Zcat) rm_zcat=1; Spcl_exec=1;; $Nawk) rm_nawk=1; Spcl_exec=1;; $Rm) rm_rm=1; Spcl_exec=1;; $Mv) rm_mv=1; Spcl_exec=1;; esac if [ $no_select -eq 1 ]; then is_a_filelist=0 list_empty=1 $RM_cmd $FILELIST if [ $Rm_alt_sav -eq 1 ]; then $RM_cmd -r $PKGSAV Rm_alt_sav=0 fi exec_clean 1 return 1 elif [ $Spcl_lib -eq 1 ]; then if [ $Tmp_Creat -eq 0 ]; then mktempdir fi if [ $Spcl_init -eq 0 ]; then Org_LD_LIBRARY_PATH=${LD_LIBRARY_PATH} LD_LIBRARY_PATH="$Org_LD_LIBRARY_PATH $Tmp_xpath" export LD_LIBRARY_PATH Spcl_init=1 fi Ld_Preload="$Ld_Preload $Tmp_xpath/$file" LD_PRELOAD=$Ld_Preload export LD_PRELOAD Movelist="$1 $file $Movelist" $MV_cmd $1 $Tmp_xpath $LN_cmd -s ../..$Tmp_xpath/$file $1 Spcl_lib=0 elif [ $Spcl_exec -eq 1 ]; then if [ $Tmp_Creat -eq 0 ]; then mktempdir fi $MV_cmd $1 $Tmp_xpath if [ $rm_cpio -eq 1 ]; then $LN_cmd -s ../..$Tmp_xpath/cpio $1 CPIO_cmd="$Tmp_xpath/cpio" Movelist="$1 cpio $Movelist" rm_cpio=0 elif [ $rm_ln -eq 1 ]; then $Tmp_xpath/ln -s ../..$Tmp_xpath/ln $1 LN_cmd="$Tmp_xpath/ln" Movelist="$1 ln $Movelist" rm_ln=0 elif [ $rm_nawk -eq 1 ]; then $LN_cmd -s ../..$Tmp_xpath/nawk $1 NAWK_cmd="$Tmp_xpath/nawk" Movelist="$1 nawk $Movelist" rm_nawk=0 elif [ $rm_zcat -eq 1 ]; then $LN_cmd -s ../..$Tmp_xpath/zcat $1 ZCAT_cmd="$Tmp_xpath/zcat" Movelist="$1 zcat $Movelist" rm_zcat=0 elif [ $rm_rm -eq 1 ]; then $LN_cmd -s ../..$Tmp_xpath/rm $1 RM_cmd="$Tmp_xpath/rm" Movelist="$Movelist $1 rm" rm_rm=0 elif [ $rm_mv -eq 1 ]; then $LN_cmd -s ../..$Tmp_xpath/mv $1 MV_cmd="$Tmp_xpath/mv" Movelist="$Movelist $1 mv" rm_mv=0 fi Spcl_exec=0 fi fi return 0 } # # Clean up the libraries and executables that were moved. # exec_clean() { # $1 =1 means be quiet if [ ! -z "${Movelist}" ]; then echo $Movelist | $NAWK_cmd ' { split ($0, line) for (n=1; n <= NF; n++) { print line[n] } }' | while read path; do read file if [ -h $path ]; then # If it's our slink # then put the original back if [ $1 -eq 0 ]; then echo `gettext "WARNING : $path not found in archive."` fi $MV_cmd $Tmp_xpath/$file $path else # if the archive put something down # remove the temporary copy $RM_cmd $Tmp_xpath/$file fi done for path in $Movelist; do if [ -x $path ]; then case $path in $Cpio) CPIO_cmd="$CPIO_xpath/cpio";; $Ln) LN_cmd="$LN_xpath/ln";; $Zcat) ZCAT_cmd="$ZCAT_xpath/zcat";; $Nawk) NAWK_cmd="$NAWK_xpath/nawk";; $Rm) RM_cmd="$RM_xpath/rm";; $Mv) MV_cmd="$MV_xpath/mv";; esac fi done Movelist="" if [ $Tmp_Creat -eq 1 ]; then $RM_cmd -r $Tmp_xpath Tmp_Creat=0 fi fi } # # Figure out what kind of package this is # eval_pkg() { # Any archive, whether compressed or not needs to be handled # the same. i.e. reloc.cpio.Z and root.cpio.Z should cause # the global is_an_archive to be set to 1. read path if [ ${path:-NULL} != NULL ]; then # get the package source directory PKGSRC=${path:?undefined} if [ ${PKG_INSTALL_ROOT:-/} = "/" ]; then local_install=1 fi if [ -r $PKGSRC/reloc.cpio.Z ]; then reloc_cpio_Z=1 Reloc_Arch=$PKGSRC/reloc.cpio.Z is_an_archive=1 fi if [ -r $PKGSRC/root.cpio.Z ]; then root_cpio_Z=1 Root_Arch=$PKGSRC/root.cpio.Z is_an_archive=1 fi if [ -r $PKGSRC/reloc.cpio ]; then reloc_cpio=1 Reloc_Arch=$PKGSRC/reloc.cpio is_an_archive=1 fi if [ -r $PKGSRC/root.cpio ]; then root_cpio=1 Root_Arch=$PKGSRC/root.cpio is_an_archive=1 fi if [ -r $PKGSRC/reloc.Z ]; then reloc_cpio_Z=1 Reloc_Arch=$PKGSRC/reloc.Z is_an_archive=2 fi if [ -r $PKGSRC/root.Z ]; then root_cpio_Z=1 Root_Arch=$PKGSRC/root.Z is_an_archive=2 fi if [ -f $PKGSRC/reloc ]; then reloc_cpio=1 Reloc_Arch=$PKGSRC/reloc is_an_archive=2 fi if [ -f $PKGSRC/root ]; then root_cpio=1 Root_Arch=$PKGSRC/root is_an_archive=2 fi else exit 0 # empty pipe, we're done fi } # # main # eval_pkg if [ $BD = "/" ]; then Client_BD="" else Client_BD=`echo $BD | sed s@/@@` fi if [ $is_an_archive -eq 0 ]; then echo `gettext "ERROR : $NAME cannot find archived files in $PKGSRC."` exit 1 fi if [ ! -d $PKGSAV ]; then echo `gettext "WARNING : $NAME cannot find save directory $PKGSAV."` PKGSAV=/tmp/$PKG.sav if [ ! -d $PKGSAV ]; then /usr/bin/mkdir $PKGSAV fi if [ $? -eq 0 ]; then echo `gettext " Using alternate save directory" $PKGSAV` FILELIST=$PKGSAV/filelist Rm_alt_sav=1 else echo `gettext "ERROR : cannot create alternate save directory"` $PKGSAV exit 1 fi fi if [ -f $FILELIST ]; then rm $FILELIST fi cd $BD # If there's one old-style archive and it is relocatable and this is # not an initial install then make a file list for extraction. if [ $is_an_archive -eq 1 -a ${PKG_INIT_INSTALL:-null} = null ]; then mk_filelist=1 fi # If this is not an initial install then clear out potentially executing # files and libraries for cpio and create an extraction list if necessary if [ ${PKG_INIT_INSTALL:-null} = null ]; then if [ $local_install -eq 1 ]; then # If extraction list is desired, create it if [ $mk_filelist -eq 1 ]; then is_a_filelist=1 while read path do echo $path >> $FILELIST list_empty=0 if [ -x ${path:-NULL} ]; then full_path=`echo $Client_BD/$path | sed s@//@/@g` spclcase $full_path if [ $? -eq 1 ]; then break fi fi done # If there's a path containing a '$' then we can't # use the extraction list because of the shell if [ $list_empty -eq 0 ]; then s=`LD_PRELOAD="$Ld_Preload" $NAWK_cmd ' /\\$/ { print } ' $FILELIST` if [ ! -z "${s}" ]; then is_a_filelist=0 fi fi else # No extraction list is desired while read path do if [ -x ${path:-NULL} ]; then full_path=`echo $Client_BD/$path | sed s@//@/@g` spclcase $full_path if [ $? -eq 1 ]; then break fi fi done fi # $mk_filelist -eq 1 else # ! ($local_install -eq 1) # If extraction list is desired, create it if [ $mk_filelist -eq 1 ]; then is_a_filelist=1 while read path do echo $path >> $FILELIST list_empty=0 done # If there's a path containing a '$' then we can't # use the extraction list because of the shell if [ $list_empty -eq 0 ]; then s=`LD_PRELOAD="$Ld_Preload" $NAWK_cmd ' /\\$/ { print } ' $FILELIST` if [ ! -z "${s}" ]; then is_a_filelist=0 fi fi fi # $mk_filelist -eq 1 fi # $local_install -eq 1 fi # ${PKG_INIT_INSTALL:-null} = null # Now extract the data from the archive(s) # extract compressed cpio relocatable archive if [ $reloc_cpio_Z -eq 1 ]; then cd $BD if [ $is_a_filelist -eq 1 ]; then if [ $list_empty -eq 0 ]; then $ZCAT_cmd $Reloc_Arch | $CPIO_cmd -idukm -E $FILELIST if [ $? -ne 0 ]; then echo `gettext "cpio of $Reloc_Arch failed with error $?."` exit 1 fi fi else $ZCAT_cmd $Reloc_Arch | $CPIO_cmd -idukm fi fi # extract compressed cpio absolute archive if [ $root_cpio_Z -eq 1 ]; then cd $IR $ZCAT_cmd $Root_Arch | $CPIO_cmd -idukm if [ $? -ne 0 ]; then echo `gettext "cpio of $Root_Arch failed with error $?."` exit 1 fi fi # extract cpio relocatable archive if [ $reloc_cpio -eq 1 ]; then cd $BD if [ $is_a_filelist -eq 1 ]; then if [ $list_empty -eq 0 ]; then $CPIO_cmd -idukm -I $Reloc_Arch -E $FILELIST if [ $? -ne 0 ]; then echo `gettext "cpio of $Reloc_Arch failed with error $?."` exit 1 fi fi else $CPIO_cmd -idukm -I $Reloc_Arch fi fi # extract cpio absolute archive if [ $root_cpio -eq 1 ]; then cd $IR $CPIO_cmd -idukm -I $Root_Arch if [ $? -ne 0 ]; then echo `gettext "cpio of $Root_Arch failed with error $?."` exit 1 fi fi if [ -f $FILELIST ]; then $RM_cmd $FILELIST fi if [ $Rm_alt_sav -eq 1 ]; then $RM_cmd -r $PKGSAV Rm_alt_sav=0 fi exec_clean 0 if [ $Tmp_Creat -eq 1 ]; then $RM_cmd -r $Tmp_xpath fi if [ $Spcl_init -eq 1 ]; then LD_LIBRARY_PATH=$Org_LD_LIBRARY_PATH export LD_LIBRARY_PATH Spcl_init=0 fi exit 0