#! /bin/csh -fb # PackageScript(.csh) # # This is the main script for starting packaged worlds. Things like # CommanderWorld and RawViewersWorld are front ends to this. This parses # the command line and then makes a local copy of the packaged world # before executing it. # Philip James, March 14, 1990 12:30:34 pm PST # Willie-Sue Orr, April 29, 1992 12:57:41 pm PDT # Brent Welch, June 28, 1990 1:31:43 pm PDT # JKF, May 20, 1991 12:55:40 pm PDT # # Usage: PackageScript package←name options ... # Valid options are # -localdir localdir # -localdirENV environ←var # -remotedir remotedir # -remotedirENV environ←var # -nocopy # -cirioPort number # -vp num←vps # -stdiop num←iops # -thread num←threads # -mem stack←memory ?? # -heap initial←heap←size # +Targs thread←arg←to←add # -Targs thread←arg←to←replace←defaults # +PCRargs pcr←arg←to←add # -PCRargs pcr←arg←to←replace←defaults # -rung~o set switch to load unoptomized code # # Obsolete options that are ignored are # -opt (all packages are optimized now) # -noOpt (ditto) # -nocirio (cirio is in all packages now) # -plain (I don't know what this meant) # -sv (Everything uses SysV shared memory now) # # # Sanity checks against the environment # if ( `/usr/ucb/printenv cedar10←1` == "" ) setenv cedar10←1 /project/cedar10.1/ if (! -d $cedar10←1) then echo 'Cannot find Cedar home ($cedar10←1): ' "$cedar10←1" exit 1 endif if (! -d $cedar10←1/bin) then echo 'Cannot find Cedar binaries: ($cedar10←1/bin): ' "$cedar10←1/bin" exit 1 endif if (! -d $cedar10←1/release) then echo 'Cannot find Cedar release ($cedar10←1/release): ' "$cedar10←1/release" exit 1 endif # # Set up default parameters: $1 is the package name # $package←name is all lowercase. # $installed←package is the latest version of the package from $remotedir # set local←package = $1 set initialCommand = $2 # setenv COMMANDER←INITIAL←COMMAND $2 set package←name = `/bin/echo $local←package | /bin/tr A-Z a-z` shift argv shift argv set remotedir = "" set mysteryArg = "" if ( ! $?TMPDIR) setenv TMPDIR /tmp if ( ! $?XR←HOME ) setenv XR←HOME /pseudo/xrhome if ( ! $?XR←CONFIG ) setenv XR←CONFIG Threads if ( ! $?XR←MACH ) setenv XR←MACH sparc if ( ! $?XR←VERSION ) setenv XR←VERSION INSTALLED if ( ! $?XR←XHOST ) setenv XR←XHOST `/bin/hostname` set threads←args = ( -slaveiop 1 -slave 1 ) set num←vp = 2 # -vp default set num←iop = 2 # -stdiop default set num←threads = 80 # -thread default set mem = 300000 # -mem default set shmtype = sv # -shmtype default set pcr←args = ( -t ) set heap = 5000000 # -h default set override←Targs = "no" set override←PCRargs = "no" set note = "no" set tcopy = `/usr/ucb/printenv NOCOPY` if ("$tcopy" != "") then set copy = "no" else set copy = "yes" endif set alwayscopy = `/usr/ucb/printenv ALWAYSCOPY` if ("$alwayscopy" != "") then set alwayscopy = "yes" else set alwayscopy = "no" endif # # Parse command line # top: if ( $#argv > 0 ) then switch ($argv[1]) case -localdir: shift argv if (! -d $argv[1]) then /bin/echo "Bad localdir: $argv[1]" exit 1 endif set localdir = $argv[1] shift argv goto top case -localdirENV: shift argv set DIR←VAR = $argv[1] # # One level of indirection to get the user's # preferred local directory from the environment. # The standard scripts use this method, even though # the user may not define the environment variable. # set localdir = `/usr/ucb/printenv $DIR←VAR` if ("$localdir" == "") then # # no pre-defined directory in the environment # unset localdir set note = "yes" else if (! -d $localdir) then /bin/echo "Bad $local←package directory from $DIR←VAR environment variable" exit 1 endif endif shift argv goto top case -remotedir: shift argv if (! -d $argv[1]) then /bin/echo "Bad remotedir: $argv[1]" exit 1 endif set remotedir = $argv[1] shift argv goto top case -remotedirENV: shift argv set DIR←VAR = $argv[1] # # One level of indirection to get the user's # preferred remote directory from the environment. # The standard scripts use this method, even though # the user may not define the environment variable. # set remotedir = `/usr/ucb/printenv $DIR←VAR` if ("$remotedir" != "") then if (! -d $localdir) then /bin/echo "Bad $local←package directory from $DIR←VAR environment variable" exit 1 endif endif shift argv goto top case -nocopy: shift argv set copy = "no" goto top case -alwayscopy: shift argv set alwayscopy = "yes" goto top case -cirioPort: shift argv setenv CirioPort $argv[1] shift argv goto top case -vp: shift argv set num←vp = ( $argv[1]:q ) shift argv goto top case -stdiop: shift argv set num←iop = ( $argv[1]:q ) shift argv goto top case -thread: shift argv set num←threads = ( $argv[1]:q ) shift argv goto top case -mem: shift argv set mem = ( $argv[1]:q ) shift argv goto top case -shmtype: shift argv set shmtype = ( $argv[1]:q ) shift argv goto top case -heap: shift argv set heap = ( $argv[1]:q ) shift argv goto top case -Targs: shift argv set threads←args = ( $argv[1]:q ) set override←Targs = "yes" shift argv goto top case +Targs: shift argv set threads←args = ( $threads←args:q $argv[1]:q ) shift argv goto top case -PCRargs: shift argv set pcr←args = ( $argv[1]:q ) set override←PCRargs = "yes" shift argv goto top case +PCRargs: shift argv set pcr←args = ( $pcr←args:q $argv[1]:q ) shift argv goto top case -rung~o: shift argv set initialCommand = ( "rung -~o; " $initialCommand ) goto top # # Old arguments # case -plain: /bin/echo "-plain is obsolete" shift argv goto top case -opt: /bin/echo "-opt is obsolete" shift argv goto top case -noOpt: /bin/echo 'All packages are optimized.' exit 1 case -sv: shift argv /bin/echo "-sv option is obsolete" goto top case -nocirio: /bin/echo "packaged world without Cirio no longer exists." shift argv goto top case -makedo: /bin/echo 'packaged world with language tools no longer exists.' shift argv goto top case -*: /bin/echo "argument { $argv[1] } not understood" exit 1 default: set mysteryArg = ( $argv[1]:q ) shift argv goto top endsw endif if ($override←Targs == "no") then set threads←args = ( $threads←args:q -vp $num←vp -stdiop $num←iop -thread $num←threads -mem $mem -shmtype $shmtype ) endif if ($override←PCRargs == "no") then set pcr←args = ( $pcr←args:q -h $heap ) endif if ($mysteryArg:q != "") then set initialCommand = ( $initialCommand:q \; $mysteryArg:q ) endif # echo $initialCommand:q setenv COMMANDER←INITIAL←COMMAND "$initialCommand:q" # # See if a remotedir has been set, or supply a default # if ($remotedir == "") then set remotedir = $cedar10←1/release/packagedworlds/sun4 endif # # Choose a local directory (/tmp or /usr/tmp) with lots of space. # if ($copy == "yes" && ! $?localdir) then # # Nothing specified explicitly. Look around for an existing package, # otherwise choose a directory with lots of room. # if (-e /tmp/$local←package) then set localdir = /tmp else if (-e /usr/tmp/$local←package) then set localdir = /usr/tmp else set spacetmp = `/bin/df /tmp | /bin/sed '/Filesystem/d' | /bin/awk '{print $4}'` set spaceusr = `/bin/df /usr/tmp | /bin/sed '/Filesystem/d' | /bin/awk '{print $4}'` if ($spaceusr > $spacetmp) then set localdir = "/usr/tmp" else set localdir = "/tmp" endif if ("$note" == "yes") then /bin/echo "Note: the $DIR←VAR env-var specifies a place for a copy of $local←package" /bin/echo "Otherwise, either /tmp or /usr/tmp is used, depending on space available" endif endif else if (! $?localdir) then set localdir # so if test doesn't fail below. copy == no here. endif # # get the latest version of the package from remotedir # set installed←package = `/bin/ls -t $remotedir/$package←name.~*~ | /usr/ucb/head -1` # # Decide if we should copy the installed version to the local copy # Need a CHANGED variable to distinquish between using no copy because # unchanged and no copy because we're using the remote file. # set CHANGED = $copy # yes if make local copy, no if use remote file if ($copy == "yes" && -e $localdir/$local←package ) then set x1 = `/bin/ls -lL $installed←package | /bin/awk '{ print $4, $5, $6, $7 }'` set x2 = `/bin/ls -lL $localdir/$local←package | /bin/awk '{ print $4, $5, $6, $7 }'` if ( "$x1" == "$x2" ) set CHANGED = "no" endif if ( $CHANGED == "yes" ) then if ( -e $localdir/$local←package) then if ( $alwayscopy == "yes" ) then set YES = "y" else /bin/echo "Your copy of $local←package is different than the installed one" /bin/echo -n "do you want to update ? " set YES = $< endif else set YES = "y" endif if ( $YES =~ y* ) then # # check disk space before copy # if ( -e $localdir/$local←package) rm -f $localdir/$local←package set size = `/bin/ls -lL $installed←package | /bin/awk '{printf "%d", $4 / 1024}'` set space = `/bin/df $localdir | /bin/sed '/Filesystem/d' | /bin/awk '{print $4}'` /bin/echo "$local←package kbytes $size, $localdir free kbytes $space" if ($size > $space) then /bin/echo "No space in $localdir for copy" set copy = "no" else /bin/echo "cp -p $installed←package $localdir/$local←package" cp -p $installed←package $localdir/$local←package chmod +w $localdir/$local←package endif endif endif # # Run the package # if ($copy == "yes") then set program = $localdir/$local←package else set program = $installed←package endif /bin/echo "Running $program" if ( $#argv > 0 ) then exec $program ${threads←args} -tmpdir $TMPDIR -- ${pcr←args} -@ $argv[1-] -@ else exec $program ${threads←args} -tmpdir $TMPDIR -- ${pcr←args} endif # eof