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