#!/bin/sh

#
#
# media_iface dataID open [host:]mediaLoc[,[host:]mediaLoc ..] [tapeset tapenum] [ media_type ] [ skipcd_flag ] [ skipchk_flag ] 
#			if no tapeset/tapenum, just check for existance
# 			exits: 0=success   5=skip  other=failure
#                       media_type: TFILE TAPE or CDROM
#                       skipcd_flag: The skipcd button is greyed
#                       skipcheck_flag: If = "skipcheck" then we do not 
#                        check the mediaset for the CD or Tape
#	      dataID xtract [-v dotInterval] fileset [file ...]
#	      dataID close
#
#  Algorithm for open:
#	If we know we need a CD-ROM, but can't find it, we tell them 
#	to mount it. Likewise for a tape.  
#	If we're not sure whether media is a tape or CD-ROM, then we
#	look for CD-ROM and if we don't find it, assume it's a tape.
#
#############################################################################
#
#	Copyright (C) Cadence Design Systems, Inc. All rights
#	reserved.  Unpublished -- rights reserved under the
#	copyright laws of the United States of America.
#
#			RESTRICTED RIGHTS LEGEND
#	Use, duplication, or disclosure by the Government is subject
#	to restrictions as set forth in subparagraph (c)(l)(ii) of 
#	the Rights in Technical Data and Computer Software clause 
#	at DFARS 52.227-7013.
#
#			Cadence Design Systems, Inc.
#			555 River Oaks Parkway
#			San Jose, CA 95134	USA
#
#############################################################################
BOURNE=/bin/sh
XTERMPATH=/usr/bin/X11
XTERMBIN=xterm
XTERMOPTS="-T 'SoftLoad 6.0 Console' -fn 9x15  -sl 200 -g 80x40+0+0 -bg \#e0e0e0 -fg \#800000 -sb -e ${BOURNE} softload_GUI"
sysPATH=/bin:/usr/bin:/usr/ucb:$XTERMPATH

jsr=''

Clear() {
    clear		2>/dev/null	#beware of bad termcap entry
}

Page() {
    TERM=vt100 MORE=""  more		#make sure we don't clear screen
}

EchoN() {
    echo  "$*\c"
}

Beep() {
    tput bel		2>/dev/null
}

OSvendor=ibmrs
OSarchs=$OSvendor

IsRTapeDev() {		#return success if arg 'could be' a rewind tape dev
    case $1 in
        /dev/rmt/0?*bn) return 1;;
        /dev/rmt/0?*b)  return 0;;
	/dev/rmt/?*n) 	return 1;;
	/dev/rmt/?*) 	return 0;;
        /dev/nrtape)    return 1;;
        /dev/rmt[0123456789])      return 0;;
        /dev/?*.[246])  return 0;;
        /dev/?*.?)      return 1;;
        /dev/r[sm]t?*)  return 0;;
        /dev/n?*)       return 1;;
        /dev/?*)        return 0;;
	*)		return 1;;
    esac
}

IsNTapeDev() {		#return success if arg 'could be' a Nrewind tape dev
    case $1 in
        /dev/rmt/0?*bn) return 0;;
	/dev/rmt/?*n) 	return 0;;
	/dev/nrtape)	return 0;;
        /dev/?*.[1357]) return 0;;
        /dev/nr?*)      return 0;;
        /dev/n?*)       return 0;;
	*)		return 1;;
    esac
}


IsTapeDev() {		#return success if arg 'could be' local/remote tape dev
    devName=`echo $1 | sed 's@.*:@@'`
    $jsr IsRTapeDev "$devName" || $jsr IsNTapeDev "$devName"
    return $?
}


NTapeDevName() {	#print name of Nrewind tapedev corresponding to argument
       case $1 in
          /dev/rmt/0?*bn) echo $1 
                          return 0;;  #Can get rid of first 2 lines
          /dev/rmt/0?*b)  echo $1 | sed 's@b@bn@'
                          return 0 ;;
	  /dev/rmt/?*) 	  echo $1 | sed 's@[^n]$@&n@'
                          return 0 ;;
          /dev/*.2)       echo $1 | sed 's@2$@3@' 
                          return 0 ;;
          /dev/*.4)       echo $1 | sed 's@4$@5@' 
                          return 0 ;;
          /dev/*.6)       echo $1 | sed 's@6$@7@' 
                          return 0 ;;
          /dev/*.[1357])  echo $1
                          return 0 ;;
          /dev/rmt[0123456789]*)      echo "$1.1"
                          return 0 ;;
          /dev/n?*)       echo $1 
                          return 0;;
          /dev/r[sm]t?*)  echo $1 | sed 's@^/dev/@/dev/n@'
                          return 0 ;;
          * )             echo $1
                          return 1;;
       esac

}

RTapeDevName() {	#print name of rewind tapedev corresponding to argument
    case $1 in
       /dev/rmt/0?*b)  echo $1
                          return 0 ;;
       /dev/rmt/0?*bn) echo $1 | sed 's@bn@b@'
                          return 0 ;;
       /dev/rmt/*)     echo $1 | sed 's@n@@'
                          return 0 ;;
       /dev/*.1)       echo $1 | sed 's@.1$@@'
                          return 0 ;;
       /dev/*.3)       echo $1 | sed 's@3$@2@'
                          return 0  ;;
       /dev/*.5)       echo $1 | sed 's@5$@4@'
                          return 0  ;;
       /dev/*.7)       echo $1 | sed 's@7$@6@' 
                          return 0 ;;
       /dev/*.[246])   echo $1
                          return 0 ;;
       /dev/rmt[0123456789]*)      echo $1
                          return 0 ;;
       /dev/r[sm]t?*)  echo $1
                          return 0 ;;
       /dev/n?*)       echo $1 | sed 's@^/dev/n@/dev/@'
                          return 0 ;;
       * )              echo $1 
                          return 1 ;;
   esac

}



AskMount() {  #AskMount {TAPE|CDROM} $mediaSet $mediaNum  $tapeDev
    noskipOption=$1; shift
    mediaType=$1; shift
    mediaSet=$1; shift
    mediaNum=$1; shift
    mount_point=$1; shift
    mediaTxt=$*
    

    if [ $noskipOption -eq 1 ]; then
        skipOption='(UNAVAILABLE) '
    else
        skipOption=""
    fi

    case $mediaType in
	TAPE)   media="tape" ; do="Insert and mount"   
                DO='inserted'
                mount="in ${mount_point}" 
                mount_prompt="device" ;;
	CDROM)  media="CD-ROM" ; do='Mount' 
                DO='mounted'
                mount="on ${mount_point}" 
                mount_prompt="mount point"
    esac

    if [ $mediaNum -ne 0 ]; then	#give option to skip media
	$jsr EchoN "
Your package selections require $mediaTxt.

    1) $do $mediaTxt $mount 
       and install packages contained on it.

    2) ${skipOption}Skip $mediaTxt and 
       proceed with the installation.
       $mediaTxt 
       is NOT available at this time.

    3) $mediaTxt already ${DO} ${mount}, continue.

    4) Change ${media} ${mount_prompt}.

    m) Main Menu

Type your choice: "
	while : ; do
	    read choice
	    case $choice in
		1) break;;		# proceed with media
		2) if [ ! -z "$skipOption" ]; then
                       $jsr EchoN \
"Type 1, 3, 4 or m: "
                   else 
                       return 5		# skip media
                   fi
                   ;;
		3) return 0		# Continue
                   ;;
                4) return 10  #Go back to load_pkgs 
                   ;;
		[mM]*) return 250;;	# return to main menu
		*) $jsr EchoN \
"Type 1, 2, 3, 4 or m: ";;
	    esac
	done
    else
         $jsr EchoN "
You require $mediaTxt.

     1)  $mediaTxt already mounted, continue.

     p)  Previous Menu

Type your choice: "
        while : ; do
            read choice
            case $choice in
                1) return 0             # Continue
                   ;;
                [pP]*) return 250;;     # return to main menu
                *) $jsr EchoN \
"Type 1 or p: ";;
            esac
        done


    fi

    if [ $mediaType = TAPE ]; then
	$jsr EchoN "
Insert $mediaTxt.
Press [Return] when tape is mounted."
	read delay
    elif [ $mediaType = CDROM ]; then	
	echo "
Use the provided shell to log in as root and mount 

	$mediaTxt

After you have mounted this CD-ROM, type 'exit' to continue installation."
	sleep 4				#in case $BOURNE clears screen
	$BOURNE
    fi
    return 0
}






test -z "$bin_dir"  && bin_dir=`pwd`;		export bin_dir
test -z "$loadLog" && loadLog=/dev/null;	export loadLog

tmp_dir=$bin_dir/../tmp

recordFile=$Proot/install/.cdsloadrc.$OSvendor

dataID=$1; shift
option=$1; shift


openMedia="$BOURNE  $bin_dir/media_cntrl $dataID  open"
readMedia="$BOURNE  $bin_dir/media_cntrl $dataID  read"
closeMedia="$BOURNE $bin_dir/media_cntrl $dataID close"

NL="
"
if [ $option = open ]; then  #{
  #  open

  dataLocs=$1; 	shift
  dataLocs=`echo $dataLocs | tr ','  ' '`
  if [ -z "$1" ]; then   #{just check for existance
    for dataLoc in $dataLocs; do  #{
      $openMedia -e $dataLoc || exit $? 
    done   #}
    exit 0
  fi  #}
  tapeset=$1;  shift
  tapenum=$1;  shift
  media_type=$1; shift
  if [ ! -z "$1" -a "$1" = "noskip" ]; then  #{
    noskip=1
    shift
  else
    noskip=0
  fi   #}

  skipcheck_flag=
  if [ ! -z "$1" -a "$1" = "skipcheck" ]; then  #{
    skipcheck_flag=$1
    shift
  fi   #}

  if [ ! -z "$1" -a "$1" = "prodinfo" ]; then  #{
    prod_flag=$1
    shift
  fi   #}


  mediaType=""

  if [ "$skipcheck_flag" != "skipcheck" ]; then  #{
    if [ -z "$InstPlat" ]; then  #{
      echo "Installation platform not specified"  1>&2
      exit 1
    fi  #}
    mediaMap=$tmp_dir/mediaMap.$InstPlat
    export InstPlat
    $BOURNE $bin_dir/read_media $tapeset:$tapenum $mediaMap > /tmp/media$$
    . /tmp/media$$
    rm /tmp/media$$
    mediaTxt=`echo $mediaTxt | tr '~' ' '`
  else
    mediaType=$media_type
    mediaTxt=$tapeset
  fi  #}


  #try to determine mediaType


  found=false
  if [ $mediaType = TAPE ]; then  #{
    for dataLoc in $dataLocs; do  #{
      if $jsr IsTapeDev $dataLoc; then  #{
        tapeDev=$dataLoc
        break  #for
      fi   #}
    done  #}
  else
    proceed=true   #look for CD-ROM
    hasCdRom=false   #until proven otherwise
    while $proceed; do  #{
      for dataLoc in $dataLocs; do   #{
        if $jsr IsTapeDev $dataLoc; then   #{flag and use later
          tapeDev=$dataLoc
          if [ $mediaType != CDROM ]; then  #{media might be a tape
             proceed=false
          fi    #}
          break  #for dataLoc ...
        else  #check for CD-ROM
          test $mediaType = CDROM && hasCdRom=true
          if $BOURNE $bin_dir/read_label $dataLoc $tapenum > /tmp/label$$; then #{
            . /tmp/label$$   #source label
            rm /tmp/label$$
            if [ $tapenum = "$dataTapenum" ]; then  #{
              if [ "X$skipcheck_flag" = "X" ]; then  #{
                if [ $tapeset = "$dataTapeset" ]; then  #{
                  found=true
                  proceed=false
                  break   #for dataLoc ...
                else
                  error_cond=true 
                fi  #}
              else
                found=true
                proceed=false
                break   #for dataLoc ...
              fi  #}
            else
              error_cond=true
            fi  #}
            if [ "X$error_cond" = "Xtrue" ]; then  #{
              if [ ! -z "$mediaMap" ]; then  #{
                mediatxt=`awk '/^'$dataTapeset:$dataTapenum' / \
                          {print $3}' $mediaMap | tr '~' ' '`
              else
                mediatxt=$dataTapeset:$dataTapenum
              fi  #}
              test "$mediatxt" = "" && mediatxt="${dataTapeset}:${dataTapenum}"
              if $hasCdRom; then   #{
                echo "${NL}Mount $mediaTxt."
                echo "This CD-ROM is $mediatxt."
              else
                echo "{NL}SL-1: Installation information mismatch(mediamap)"
                echo "    Call the Cadence Customer Response Center (CRC) 1-800-Cadenc2 
    (1-800-223-3622) to get the right files"
                exit 1

              fi  #}
            fi   #} $error_cond
          else
            rm /tmp/label$$
            test $mediaType = TFILE && exit 5
          fi  #}
        fi  #}
      done  #}for dataLoc ...

      if $proceed; then  #{
        if $hasCdRom; then  #{have'm mount CD-ROM
          if $useGUI; then  #{
            $BOURNE $bin_dir/toplevel.sh 5 "$mediatxt" "$mediaTxt" $dataLoc $noskip  > $tmp_dir/mediaLoc
            sstatus=$?
            case $sstatus in  #{
              248) echo "
Use the provided shell to log in as root and mount

        $mediaTxt

After you have mounted this CD-ROM, use the 'exit' command to proceed.
"
                sleep 4
                $BOURNE ;;
              5) exit 5 ;; # skip media
              0) ;; 
              221);;
              250) exit 250 ;; 
              *) exit $? ;; 
            esac   #}

            #New check put in to see whether the CDROM mount 
            #has changed or not.
            . $tmp_dir/mediaLoc
            if [ "$dataLoc"  != "$DeviceCD" ]; then  #{
              exit  15
            fi  #}
          else
            $jsr AskMount $noskip CDROM $tapeset $tapenum $dataLoc $mediaTxt || exit $?
          fi   #}UseGUI
        else   #need CD-ROM, no device
          echo "No CD-ROM mount point specified" | tee -a $loadLog
          exit 5   #skip media
        fi   #}
      fi   #}
    done   #}while $proceed ...
  fi   #}

  #
  # Done searching for CD-ROM, may still look for tape
  #

  if [ $found = false -a "$tapeDev" != "" ]; then  #{look for the tape
    wrongTape=false
    while [ $found = false ]; do  #{
      if [ $tapenum -ne 0 ] || $wrongTape; then  #{
        if $useGUI; then  #{
          $BOURNE $bin_dir/toplevel.sh 6 "$mediaTxt" $dataLoc $noskip >$tmp_dir/mediaLoc || exit $?
          case $? in  #{
            5) exit 5 ;;
            250) exit 250 ;;
          esac  #}
          . $tmp_dir/mediaLoc
          if [ "$dataLoc" != "$DeviceTAPE" ]; then
            exit 15
          fi
        else
           $jsr AskMount $noskip TAPE $tapeset $tapenum $dataLoc $mediaTxt || exit $?
        fi  #}
      fi   #}

      echo "Checking media ..."   | tee -a $loadLog

      if $BOURNE $bin_dir/read_label $dataLoc $tapenum > /tmp/labelinfo$$; then #{
        . /tmp/labelinfo$$   #source /tmp/labelinfo$$
        rm  /tmp/labelinfo$$

        if [ $tapenum = "$dataTapenum" ]; then #{
          if [ "X$skipcheck_flag" = "X"  ]; then #{ 
            if [ $tapeset = "$dataTapeset" ]; then  #{
              found=true
            else
              echo "
Error: You have inserted tape $dataTapeset:$dataTapenum" 1>&2
              wrongTape=true
            fi  #}
          else
            found=true
          fi  #}
        else
          echo "
Error: You have inserted tape $dataTapeset:$dataTapenum" 1>&2
          wrongTape=true
        fi  #}
      else
        rm -f /tmp/labelinfo$$
        exit 1
      fi  #}   
    done  #}
  fi  #}
  $found || exit 5  #skip it

  $openMedia -r $dataLoc $tapenum $prod_flag
  exit $?
elif [ $option = xtract ]; then
  #  xtract
  io_fltr=$bin_dir/io_fltr
  ioOpts=x
  if [ "X$1" = "Xverbose" ]; then  #{
    verbose_flag="yes"; shift
  fi  #}

  if [ "X$1" = 'X-v' ]; then  #{
    ioOpts="${ioOpts}V $2"; shift; shift
  fi  #}
  fileset=$1;  shift;
  files="$*"		#maybe null


  cmndStat=/tmp/stat$$; rm -f $cmndStat
  if [ "X$verbose_flag" != "Xyes" ]; then   #{
    ( $readMedia $fileset || echo $? > $cmndStat ) | $io_fltr $ioOpts |\
  	$bin_dir/vtar xpBf - $files
    if [ $? -ne 0 ]; then  #{
      rm -f $cmndStat
  	exit 1  #failure
    fi  #}
  else
    ( $readMedia $fileset || echo $? > $cmndStat ) | $io_fltr $ioOpts |\
	($bin_dir/vtar xvpBf - $files  || echo $? $cmndStat ) | \
         awk '{ print $2 }' | sed -e 's@,$@@' > ${tmp_dir}/tarIFile 
  fi #}

  if [ -f $cmndStat ]; then  #{
    rm -f $cmndStat
	exit 1  #failure
  fi  #}

  exit 0  #success
elif [ $option = close ]; then
  #  close
  $closeMedia 
  exit $?
else
  echo "$0: unrecognized option - $option"   1>&2
  exit 1
fi #}

