17c478bd9Sstevel@tonic-gate#!/bin/ksh 27c478bd9Sstevel@tonic-gate# 37c478bd9Sstevel@tonic-gate# CDDL HEADER START 47c478bd9Sstevel@tonic-gate# 57c478bd9Sstevel@tonic-gate# The contents of this file are subject to the terms of the 6fb9f9b97Skupfer# Common Development and Distribution License (the "License"). 7fb9f9b97Skupfer# You may not use this file except in compliance with the License. 87c478bd9Sstevel@tonic-gate# 97c478bd9Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate# See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate# and limitations under the License. 137c478bd9Sstevel@tonic-gate# 147c478bd9Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate# 207c478bd9Sstevel@tonic-gate# CDDL HEADER END 217c478bd9Sstevel@tonic-gate# 227c478bd9Sstevel@tonic-gate# 23*84d8c05bSMike Kupfer# Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. 247c478bd9Sstevel@tonic-gate# 257c478bd9Sstevel@tonic-gate# Author: Jeff Bonwick 267c478bd9Sstevel@tonic-gate# 277c478bd9Sstevel@tonic-gate# Please report any bugs to bonwick@eng. 287c478bd9Sstevel@tonic-gate# 297c478bd9Sstevel@tonic-gate# How Install works: 307c478bd9Sstevel@tonic-gate# 317c478bd9Sstevel@tonic-gate# Install performs the following steps: 327c478bd9Sstevel@tonic-gate# 33fb9f9b97Skupfer# 1. Get the list of modules, configuration files, and links 34fb9f9b97Skupfer# that are desired. 357c478bd9Sstevel@tonic-gate# 367c478bd9Sstevel@tonic-gate# 2. Create the requested subset of /kernel in Install's temp space 377c478bd9Sstevel@tonic-gate# (/tmp/Install.username by default.) 387c478bd9Sstevel@tonic-gate# 397c478bd9Sstevel@tonic-gate# 3. Create a tar file (/tmp/Install.username/Install.tar) based on (3). 407c478bd9Sstevel@tonic-gate# 417c478bd9Sstevel@tonic-gate# 4. If -n was specified, exit. If a target was specified using -T, 427c478bd9Sstevel@tonic-gate# rcp the tarfile to the target and exit. If a target was specified 437c478bd9Sstevel@tonic-gate# using -t, rsh to the target machine and untar the tarfile in the 447c478bd9Sstevel@tonic-gate# target directory. 457c478bd9Sstevel@tonic-gate# 467c478bd9Sstevel@tonic-gate# If any of these steps fail, Install will give you an error message and, 477c478bd9Sstevel@tonic-gate# in most cases, suggest corrective measures. Then, you can recover the 487c478bd9Sstevel@tonic-gate# install with "Install -R". (This is not required; it's just faster than 497c478bd9Sstevel@tonic-gate# starting from scratch.) 507c478bd9Sstevel@tonic-gate# 517c478bd9Sstevel@tonic-gate# One final comment: Unfortunately, tar and I disagree on what 527c478bd9Sstevel@tonic-gate# constitutes a fatal error. (tar -x will exit 0 even if it can't write 537c478bd9Sstevel@tonic-gate# anything in the current directory.) Thus, I am reduced to grepping stderr 547c478bd9Sstevel@tonic-gate# for (what I consider) fatal and nonfatal error messages. If you run into 557c478bd9Sstevel@tonic-gate# a situation where this doesn't behave the way you think it should (either 567c478bd9Sstevel@tonic-gate# an "Install failed" message after a successful install, or an "Install 577c478bd9Sstevel@tonic-gate# complete" message after it bombs), please let me know. 587c478bd9Sstevel@tonic-gate 597c478bd9Sstevel@tonic-gate# 607c478bd9Sstevel@tonic-gate# The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout 617c478bd9Sstevel@tonic-gate# under certain circumstances, which can really screw things up; unset it. 627c478bd9Sstevel@tonic-gate# 637c478bd9Sstevel@tonic-gateunset CDPATH 647c478bd9Sstevel@tonic-gate 657c478bd9Sstevel@tonic-gateINSTALL=`basename $0` 667c478bd9Sstevel@tonic-gateDOT=`pwd` 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gateTRAILER="Install.$LOGNAME" 697c478bd9Sstevel@tonic-gateINSTALL_STATE=${INSTALL_STATE-$HOME/.Install.state} 707c478bd9Sstevel@tonic-gateexport INSTALL_STATE 717c478bd9Sstevel@tonic-gateINSTALL_DIR=${INSTALL_DIR-/tmp/$TRAILER} 727c478bd9Sstevel@tonic-gateif [ "`basename $INSTALL_DIR`" != "$TRAILER" ]; then 737c478bd9Sstevel@tonic-gate INSTALL_DIR="$INSTALL_DIR/$TRAILER" 747c478bd9Sstevel@tonic-gatefi 757c478bd9Sstevel@tonic-gateexport INSTALL_DIR 767c478bd9Sstevel@tonic-gateINSTALL_LIB=${INSTALL_LIB-$HOME/LibInstall} 777c478bd9Sstevel@tonic-gateexport INSTALL_LIB 787c478bd9Sstevel@tonic-gateINSTALL_RC=${INSTALL_RC-$HOME/.Installrc} 797c478bd9Sstevel@tonic-gateexport INSTALL_RC 807c478bd9Sstevel@tonic-gateINSTALL_CP=${INSTALL_CP-"cp -p"} 817c478bd9Sstevel@tonic-gateexport INSTALL_CP 827c478bd9Sstevel@tonic-gateINSTALL_RCP=${INSTALL_RCP-"rcp -p"} 837c478bd9Sstevel@tonic-gateexport INSTALL_RCP 847c478bd9Sstevel@tonic-gate 857c478bd9Sstevel@tonic-gateSTATE=0 867c478bd9Sstevel@tonic-gate 87fb9f9b97SkupferDEFAULT_OPTIONS="-naq" 887c478bd9Sstevel@tonic-gateGLOM=no 897c478bd9Sstevel@tonic-gateGLOMNAME=kernel 907c478bd9Sstevel@tonic-gateIMPL="default" 917c478bd9Sstevel@tonic-gateWANT32="yes" 927c478bd9Sstevel@tonic-gateWANT64="yes" 937c478bd9Sstevel@tonic-gate 94fb9f9b97Skupfermodlist=/tmp/modlist$$ 95fb9f9b97Skupfer# dummy directory for make state files. 96fb9f9b97Skupfermodstatedir=/tmp/modstate$$ 97fb9f9b97Skupfer 987c478bd9Sstevel@tonic-gatetrap 'fail "User Interrupt" "You can resume by typing \"$INSTALL -R\""' 1 2 3 15 997c478bd9Sstevel@tonic-gate 100597bd30bSMike Kupferfunction usage { 1017c478bd9Sstevel@tonic-gate echo "" 1027c478bd9Sstevel@tonic-gate echo $1 1037c478bd9Sstevel@tonic-gate echo ' 1047c478bd9Sstevel@tonic-gateUsage: Install [ -w workspace ] 1057c478bd9Sstevel@tonic-gate [ -s srcdir (default: usr/src/uts) ] 1067c478bd9Sstevel@tonic-gate [ -k karch (e.g. sun4u; required if not deducible from pwd) ] 1077c478bd9Sstevel@tonic-gate [ -t target (extract tar file on target, e.g. user@machine:/) ] 1087c478bd9Sstevel@tonic-gate [ -T target (copy tar file to target, e.g. user@machine:/tmp) ] 1097c478bd9Sstevel@tonic-gate [ -n (no target, just create tar file in /tmp (default)) ] 1107c478bd9Sstevel@tonic-gate [ -u (install unix only) ] 1117c478bd9Sstevel@tonic-gate [ -m (install modules only) ] 1127c478bd9Sstevel@tonic-gate [ -a (install everything, i.e. unix + modules (default)) ] 1137c478bd9Sstevel@tonic-gate [ -v (verbose output) ] 1147c478bd9Sstevel@tonic-gate [ -V (REALLY verbose output) ] 1157c478bd9Sstevel@tonic-gate [ -q (quiet (default)) ] 1167c478bd9Sstevel@tonic-gate [ -c (clean up (remove temp files) when done (default) ] 1177c478bd9Sstevel@tonic-gate [ -p (preserve temp files -- useful for debugging) ] 1187c478bd9Sstevel@tonic-gate [ -L (library create: put tarfile in $INSTALL_LIB/env.karch) ] 1197c478bd9Sstevel@tonic-gate [ -l lib (library extract: use $INSTALL_LIB/lib as source) ] 1207c478bd9Sstevel@tonic-gate [ -D libdir (default: $HOME/LibInstall) ] 1217c478bd9Sstevel@tonic-gate [ -d tempdir (Install work area (default: /tmp)) ] 1227c478bd9Sstevel@tonic-gate [ -G glomname (put all files under platform/karch/glomname) ] 1237c478bd9Sstevel@tonic-gate [ -i impl (e.g. sunfire; recommended with -G) ] 1247c478bd9Sstevel@tonic-gate [ -x (update /etc/name_to_major et al) ] 1257c478bd9Sstevel@tonic-gate [ -X (do not update /etc/name_to_major et al (default)) ] 1267c478bd9Sstevel@tonic-gate [ -P (update /etc/path_to_inst -- generally not advisable) ] 1277c478bd9Sstevel@tonic-gate [ -h (help -- prints this message) ] 1287c478bd9Sstevel@tonic-gate [ -R (recover a previous Install) ] 1297c478bd9Sstevel@tonic-gate [ -o objdir (object directory - either obj or debug (the default)) ] 1307c478bd9Sstevel@tonic-gate [ -K (do not copy kmdb) ] 1317c478bd9Sstevel@tonic-gate [ -3 32-bit modules only ] 1327c478bd9Sstevel@tonic-gate [ -6 64-bit modules only ] 1337c478bd9Sstevel@tonic-gate [ list of modules to install ] 1347c478bd9Sstevel@tonic-gate 1357c478bd9Sstevel@tonic-gateFor full details: 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate man -M /ws/on297-gate/public/docs Install 1387c478bd9Sstevel@tonic-gate' 1397c478bd9Sstevel@tonic-gate exit 1 1407c478bd9Sstevel@tonic-gate} 1417c478bd9Sstevel@tonic-gate 1427c478bd9Sstevel@tonic-gate# 1437c478bd9Sstevel@tonic-gate# Save the current state of Install 1447c478bd9Sstevel@tonic-gate# 1457c478bd9Sstevel@tonic-gate 146597bd30bSMike Kupferfunction save_state { 1477c478bd9Sstevel@tonic-gate rm -f $INSTALL_STATE 1487c478bd9Sstevel@tonic-gate (echo "# State of previous Install 1497c478bd9Sstevel@tonic-gateTARGET=$TARGET 1507c478bd9Sstevel@tonic-gateENV_PATH=$ENV_PATH 1517c478bd9Sstevel@tonic-gateENV_NAME=$ENV_NAME 1527c478bd9Sstevel@tonic-gateKARCH=$KARCH 1537c478bd9Sstevel@tonic-gateUTS=$UTS 1547c478bd9Sstevel@tonic-gateINSTALL_DIR=$INSTALL_DIR 1557c478bd9Sstevel@tonic-gateINSTALL_LIB=$INSTALL_LIB 1567c478bd9Sstevel@tonic-gateIMODE=$IMODE 1577c478bd9Sstevel@tonic-gateLIBCREATE=$LIBCREATE 1587c478bd9Sstevel@tonic-gateLIBSRC=$LIBSRC 1597c478bd9Sstevel@tonic-gateVERBOSE=$VERBOSE 1607c478bd9Sstevel@tonic-gateCLEANUP=$CLEANUP 1617c478bd9Sstevel@tonic-gateGLOM=$GLOM 1627c478bd9Sstevel@tonic-gateGLOMNAME=$GLOMNAME 1637c478bd9Sstevel@tonic-gateKMDB=$KMDB 1647c478bd9Sstevel@tonic-gatefiles='$files' 1657c478bd9Sstevel@tonic-gateSTATE=$STATE" >$INSTALL_STATE) || verbose "Warning: cannot save state" 1667c478bd9Sstevel@tonic-gate} 1677c478bd9Sstevel@tonic-gate 1687c478bd9Sstevel@tonic-gate# 1697c478bd9Sstevel@tonic-gate# Restore the previous state of Install 1707c478bd9Sstevel@tonic-gate# 1717c478bd9Sstevel@tonic-gate 172597bd30bSMike Kupferfunction restore_state { 1737c478bd9Sstevel@tonic-gate test -s $INSTALL_STATE || fail "Can't find $INSTALL_STATE" 1747c478bd9Sstevel@tonic-gate eval "`cat $INSTALL_STATE`" 1757c478bd9Sstevel@tonic-gate} 1767c478bd9Sstevel@tonic-gate 1777c478bd9Sstevel@tonic-gate# 1787c478bd9Sstevel@tonic-gate# Install failed -- print error messages and exit 2 1797c478bd9Sstevel@tonic-gate# 1807c478bd9Sstevel@tonic-gate 181597bd30bSMike Kupferfunction fail { 1827c478bd9Sstevel@tonic-gate save_state 183fb9f9b97Skupfer # 184fb9f9b97Skupfer # We might have gotten here via a trap. So wait for any 185fb9f9b97Skupfer # children (especially "make modlist") to exit before giving 186fb9f9b97Skupfer # the error message or cleaning up. 187fb9f9b97Skupfer # 188fb9f9b97Skupfer wait 1897c478bd9Sstevel@tonic-gate while [ $# -gt 0 ] 1907c478bd9Sstevel@tonic-gate do 1917c478bd9Sstevel@tonic-gate echo $1 1927c478bd9Sstevel@tonic-gate shift 1937c478bd9Sstevel@tonic-gate done 194fb9f9b97Skupfer rm -rf $modstatedir 195fb9f9b97Skupfer rm -f $modlist 1967c478bd9Sstevel@tonic-gate echo "Install failed" 1977c478bd9Sstevel@tonic-gate exit 2 1987c478bd9Sstevel@tonic-gate} 1997c478bd9Sstevel@tonic-gate 2007c478bd9Sstevel@tonic-gate# 2017c478bd9Sstevel@tonic-gate# Echo a string in verbose mode only 2027c478bd9Sstevel@tonic-gate# 2037c478bd9Sstevel@tonic-gate 204597bd30bSMike Kupferfunction verbose { 2057c478bd9Sstevel@tonic-gate test "$VERBOSE" != "q" && echo $1 2067c478bd9Sstevel@tonic-gate} 2077c478bd9Sstevel@tonic-gate 2087c478bd9Sstevel@tonic-gate# 2097c478bd9Sstevel@tonic-gate# hack for tmpfs bug -- remove files gradually 2107c478bd9Sstevel@tonic-gate# 2117c478bd9Sstevel@tonic-gate 212597bd30bSMike Kupferfunction remove_dir { 2137c478bd9Sstevel@tonic-gate test -d $1 || return 2147c478bd9Sstevel@tonic-gate local_dot=`pwd` 2157c478bd9Sstevel@tonic-gate cd $1 2167c478bd9Sstevel@tonic-gate touch foo 2177c478bd9Sstevel@tonic-gate rm -f `find . -type f -print` 2187c478bd9Sstevel@tonic-gate cd $local_dot 2197c478bd9Sstevel@tonic-gate rm -rf $1 2207c478bd9Sstevel@tonic-gate} 2217c478bd9Sstevel@tonic-gate 2227c478bd9Sstevel@tonic-gate# 223fb9f9b97Skupfer# Create a directory if it doesn't already exist. 224fb9f9b97Skupfer# mkdir will provide an error message, so don't provide an additional 225fb9f9b97Skupfer# message. 226fb9f9b97Skupfer# 227fb9f9b97Skupfer 228597bd30bSMike Kupferfunction tstmkdir { 229fb9f9b97Skupfer [ -d $1 ] || mkdir -p $1 || fail 230fb9f9b97Skupfer} 231fb9f9b97Skupfer 232fb9f9b97Skupfer# 233fb9f9b97Skupfer# Patch up target directories for glommed kernel. 234fb9f9b97Skupfer# usage: fixglom listfile glomname 235fb9f9b97Skupfer# 236fb9f9b97Skupfer 237597bd30bSMike Kupferfunction fixglom { 238fb9f9b97Skupfer nawk \ 239fb9f9b97Skupfer -v glomname=$2 \ 240fb9f9b97Skupfer -v karch=$KARCH ' 241fb9f9b97Skupfer $1 == "MOD" || $1 == "SYMLINK" { 242fb9f9b97Skupfer sub(/^platform.*kernel/, "platform/" karch "/" glomname, $4) 243fb9f9b97Skupfer sub(/^kernel/, "platform/" karch "/" glomname, $4) 244fb9f9b97Skupfer sub(/^usr.kernel/, "platform/" karch "/" glomname, $4) 245fb9f9b97Skupfer print 246fb9f9b97Skupfer } 247*84d8c05bSMike Kupfer $1 == "LINK" { 248*84d8c05bSMike Kupfer sub(/^platform.*kernel/, "platform/" karch "/" glomname, $3) 249*84d8c05bSMike Kupfer sub(/^kernel/, "platform/" karch "/" glomname, $3) 250*84d8c05bSMike Kupfer sub(/^usr.kernel/, "platform/" karch "/" glomname, $3) 251*84d8c05bSMike Kupfer sub(/^platform.*kernel/, "platform/" karch "/" glomname, $5) 252*84d8c05bSMike Kupfer sub(/^kernel/, "platform/" karch "/" glomname, $5) 253*84d8c05bSMike Kupfer sub(/^usr.kernel/, "platform/" karch "/" glomname, $5) 254*84d8c05bSMike Kupfer print 255*84d8c05bSMike Kupfer } 256fb9f9b97Skupfer $1 == "CONF" { 257*84d8c05bSMike Kupfer sub(/^platform.*kernel/, "platform/" karch "/" glomname, $3) 258*84d8c05bSMike Kupfer sub(/^kernel/, "platform/" karch "/" glomname, $3) 259*84d8c05bSMike Kupfer sub(/^usr.kernel/, "platform/" karch "/" glomname, $3) 260fb9f9b97Skupfer print 261fb9f9b97Skupfer } 262fb9f9b97Skupfer ' $1 > $1.new 263fb9f9b97Skupfer mv $1.new $1 264fb9f9b97Skupfer} 265fb9f9b97Skupfer 266fb9f9b97Skupfer# 267*84d8c05bSMike Kupfer# Filter out implementation-specific modules, unless that 268*84d8c05bSMike Kupfer# implementation was requested by the user. 269fb9f9b97Skupfer# usage: filtimpl listfile implname 270fb9f9b97Skupfer# 271fb9f9b97Skupfer 272597bd30bSMike Kupferfunction filtimpl { 273fb9f9b97Skupfer nawk \ 274fb9f9b97Skupfer -v impl=$2 ' 275fb9f9b97Skupfer $1 == "MOD" || $1 == "SYMLINK" { 276*84d8c05bSMike Kupfer if ($6 == "all" || $6 == impl) 277fb9f9b97Skupfer print 278fb9f9b97Skupfer } 279fb9f9b97Skupfer $1 == "CONF" { 280*84d8c05bSMike Kupfer if ($5 == "all" || $5 == impl) 281fb9f9b97Skupfer print 282fb9f9b97Skupfer } 283fb9f9b97Skupfer $1 == "LINK" { 284*84d8c05bSMike Kupfer if ($7 == "all" || $7 == impl) 285fb9f9b97Skupfer print 286fb9f9b97Skupfer } 287fb9f9b97Skupfer ' $1 > $1.new 288fb9f9b97Skupfer mv $1.new $1 289fb9f9b97Skupfer} 290fb9f9b97Skupfer 291fb9f9b97Skupfer# 292fb9f9b97Skupfer# Filter the module list to match the user's request. 293fb9f9b97Skupfer# Usage: filtmod listfile modules 294fb9f9b97Skupfer# 295597bd30bSMike Kupferfunction filtmod { 296fb9f9b97Skupfer nawk -v reqstring="$2" ' 297fb9f9b97Skupfer function modmatch(modname) { 298fb9f9b97Skupfer if (reqstring == "All") { 299fb9f9b97Skupfer return (1) 300fb9f9b97Skupfer } else if (reqstring == "Modules") { 301fb9f9b97Skupfer if (modname != "unix" && modname != "genunix") 302fb9f9b97Skupfer return (1) 303fb9f9b97Skupfer } else { 304fb9f9b97Skupfer if (modname in reqmods) 305fb9f9b97Skupfer return (1) 306fb9f9b97Skupfer } 307fb9f9b97Skupfer return (0) 308fb9f9b97Skupfer } 309fb9f9b97Skupfer BEGIN { 310fb9f9b97Skupfer # 311fb9f9b97Skupfer # The split call creates indexes 1, 2, 3, ... We want 312fb9f9b97Skupfer # the module names as indexes. 313fb9f9b97Skupfer # 314fb9f9b97Skupfer split(reqstring, tmpmods) 315fb9f9b97Skupfer for (i in tmpmods) 316fb9f9b97Skupfer reqmods[tmpmods[i]] = 1 317fb9f9b97Skupfer } 318fb9f9b97Skupfer $1 == "MOD" { 319*84d8c05bSMike Kupfer if (modmatch($3)) 320fb9f9b97Skupfer print 321fb9f9b97Skupfer } 322fb9f9b97Skupfer $1 == "CONF" { 323fb9f9b97Skupfer if (modmatch($6)) 324fb9f9b97Skupfer print 325fb9f9b97Skupfer } 326*84d8c05bSMike Kupfer $1 == "SYMLINK" { 327*84d8c05bSMike Kupfer if (modmatch($7)) 328*84d8c05bSMike Kupfer print 329*84d8c05bSMike Kupfer } 330fb9f9b97Skupfer $1 == "LINK" { 331*84d8c05bSMike Kupfer if (modmatch($4)) 332fb9f9b97Skupfer print 333fb9f9b97Skupfer } 334fb9f9b97Skupfer ' $1 > $1.new 335fb9f9b97Skupfer mv $1.new $1 336fb9f9b97Skupfer} 337fb9f9b97Skupfer 338fb9f9b97Skupfer# 339597bd30bSMike Kupfer# Unpack the crypto tarball into the given tree, then massage the 340597bd30bSMike Kupfer# tree so that the binaries are all in objNN or debugNN directories. 341597bd30bSMike Kupfer# 342597bd30bSMike Kupferfunction unpack_crypto { 343597bd30bSMike Kupfer typeset tarfile=$1 344597bd30bSMike Kupfer typeset ctop=$2 345597bd30bSMike Kupfer [ -d "$ctop" ] || fail "Can't create tree for crypto modules." 346597bd30bSMike Kupfer 347597bd30bSMike Kupfer [ "$VERBOSE" = "V" ] && echo "unpacking crypto tarball into $ctop..." 348597bd30bSMike Kupfer bzcat "$tarfile" | (cd "$ctop"; tar xf -) 349597bd30bSMike Kupfer 350597bd30bSMike Kupfer typeset root="$ctop/proto/root_$MACH" 351597bd30bSMike Kupfer [ $OBJD = obj ] && root="$ctop/proto/root_$MACH-nd" 352597bd30bSMike Kupfer [ -d "$root" ] || fail "Can't unpack crypto tarball." 353597bd30bSMike Kupfer 354597bd30bSMike Kupfer (cd "$root"; for d in platform kernel usr/kernel; do 355597bd30bSMike Kupfer [ ! -d $d ] && continue 356597bd30bSMike Kupfer find $d -type f -print 357597bd30bSMike Kupfer done) | while read file; do 358597bd30bSMike Kupfer typeset dir=$(dirname "$file") 359597bd30bSMike Kupfer typeset base=$(basename "$file") 360597bd30bSMike Kupfer typeset type=$(basename "$dir") 361597bd30bSMike Kupfer if [ "$type" = amd64 ]; then 362597bd30bSMike Kupfer newdir="$dir/${OBJD}64" 363597bd30bSMike Kupfer elif [ "$type" = sparcv9 ]; then 364597bd30bSMike Kupfer newdir="$dir/${OBJD}64" 365597bd30bSMike Kupfer else 366597bd30bSMike Kupfer newdir="$dir/${OBJD}32" 367597bd30bSMike Kupfer fi 368597bd30bSMike Kupfer mkdir -p "$root/$newdir" 369597bd30bSMike Kupfer [ "$VERBOSE" = "V" ] && echo "mv $file $newdir" 370597bd30bSMike Kupfer mv "$root/$file" "$root/$newdir" 371597bd30bSMike Kupfer done 372597bd30bSMike Kupfer} 373597bd30bSMike Kupfer 374597bd30bSMike Kupfer# 375597bd30bSMike Kupfer# usage: fixcrypto listfile ctop 376597bd30bSMike Kupfer# Massage entries in listfile for crypto modules, so that they point 377597bd30bSMike Kupfer# into ctop. 378597bd30bSMike Kupfer# 379597bd30bSMike Kupferfunction fixcrypto { 380597bd30bSMike Kupfer typeset listfile=$1 381597bd30bSMike Kupfer typeset ctop=$2 382597bd30bSMike Kupfer 383597bd30bSMike Kupfer typeset ccontents=/tmp/crypto-toc$$ 384597bd30bSMike Kupfer find "$ctop" -type f -print > $ccontents 385597bd30bSMike Kupfer typeset root=root_$MACH 386597bd30bSMike Kupfer [ "$OBJD" = obj ] && root=root_$MACH-nd 387597bd30bSMike Kupfer 388597bd30bSMike Kupfer grep -v ^MOD $listfile > $listfile.no-mod 389*84d8c05bSMike Kupfer grep ^MOD $listfile | while read tag srcdir module targdir size impl; do 390597bd30bSMike Kupfer # 391597bd30bSMike Kupfer # We don't just grep for ${OBJD}$size/$module because 392597bd30bSMike Kupfer # there can be generic and platform-dependent versions 393597bd30bSMike Kupfer # of a module. 394597bd30bSMike Kupfer # 395597bd30bSMike Kupfer newsrcfile=$(grep -w $root/$targdir/${OBJD}$size/$module $ccontents) 396597bd30bSMike Kupfer if [ -n "$newsrcfile" ]; then 397597bd30bSMike Kupfer # srcdir doesn't include final objNN or debugNN 398597bd30bSMike Kupfer echo $tag $module $targdir $size $impl \ 399597bd30bSMike Kupfer $(dirname $(dirname "$newsrcfile")) 400597bd30bSMike Kupfer else 401597bd30bSMike Kupfer echo $tag $module $targdir $size $impl $srcdir 402597bd30bSMike Kupfer fi 403597bd30bSMike Kupfer done > $listfile.mod 404597bd30bSMike Kupfer cat $listfile.mod $listfile.no-mod > $listfile 405597bd30bSMike Kupfer 406597bd30bSMike Kupfer rm -f $listfile.mod 407597bd30bSMike Kupfer rm -f $listfile.no-mod 408597bd30bSMike Kupfer rm -f $ccontents 409597bd30bSMike Kupfer} 410597bd30bSMike Kupfer 411597bd30bSMike Kupfer# 412fb9f9b97Skupfer# Copy a module, or create a link, as needed. 413fb9f9b97Skupfer# 414fb9f9b97Skupfer 415597bd30bSMike Kupferfunction copymod { 416fb9f9b97Skupfer case $1 in 417fb9f9b97Skupfer MOD) 418*84d8c05bSMike Kupfer targdir=$INSTALL_FILES/$4 419fb9f9b97Skupfer tstmkdir $targdir 420*84d8c05bSMike Kupfer target=$targdir/$3 421*84d8c05bSMike Kupfer verbose "$INSTALL_CP $2/${OBJD}$5/$3 $target" 422*84d8c05bSMike Kupfer $INSTALL_CP $2/${OBJD}$5/$3 $target || \ 423fb9f9b97Skupfer fail "can't create $target" 424fb9f9b97Skupfer ;; 425fb9f9b97Skupfer SYMLINK) 426fb9f9b97Skupfer targdir=$INSTALL_FILES/$4 427fb9f9b97Skupfer tstmkdir $targdir 428fb9f9b97Skupfer target=$targdir/$5 429fb9f9b97Skupfer rm -f $target 430*84d8c05bSMike Kupfer verbose "ln -s $3 $target" 431*84d8c05bSMike Kupfer ln -s $3 $target || fail "can't create $target" 432*84d8c05bSMike Kupfer ;; 433*84d8c05bSMike Kupfer LINK) 434*84d8c05bSMike Kupfer targdir=$INSTALL_FILES/$5 435*84d8c05bSMike Kupfer tstmkdir $targdir 436*84d8c05bSMike Kupfer target=$targdir/$6 437*84d8c05bSMike Kupfer rm -f $target 438*84d8c05bSMike Kupfer verbose "ln $INSTALL_FILES/$3/$4 $target" 439*84d8c05bSMike Kupfer ln $INSTALL_FILES/$3/$4 $target || fail "can't create $target" 440fb9f9b97Skupfer ;; 441fb9f9b97Skupfer CONF) 442*84d8c05bSMike Kupfer target=$INSTALL_FILES/$3 443fb9f9b97Skupfer tstmkdir `dirname $target` 444*84d8c05bSMike Kupfer conffile=`basename $3` 445*84d8c05bSMike Kupfer verbose "$INSTALL_CP $4/$conffile $target" 446*84d8c05bSMike Kupfer $INSTALL_CP $4/$conffile $target 447fb9f9b97Skupfer ;; 448fb9f9b97Skupfer *) 449fb9f9b97Skupfer fail "unrecognized modlist entry: $*" 450fb9f9b97Skupfer ;; 451fb9f9b97Skupfer esac 452fb9f9b97Skupfer} 453fb9f9b97Skupfer 454*84d8c05bSMike Kupfer# Sanity-check the given module list. 455*84d8c05bSMike Kupferfunction check_modlist { 456*84d8c05bSMike Kupfer nawk ' 457*84d8c05bSMike Kupfer BEGIN { 458*84d8c05bSMike Kupfer nfields["MOD"] = 6 459*84d8c05bSMike Kupfer nfields["CONF"] = 6 460*84d8c05bSMike Kupfer nfields["LINK"] = 7 461*84d8c05bSMike Kupfer nfields["SYMLINK"] = 7 462*84d8c05bSMike Kupfer } 463*84d8c05bSMike Kupfer { 464*84d8c05bSMike Kupfer # This also catches unknown tags. 465*84d8c05bSMike Kupfer if (nfields[$1] != NF) { 466*84d8c05bSMike Kupfer print "error: invalid modlist record:" 467*84d8c05bSMike Kupfer print $0 468*84d8c05bSMike Kupfer print "expected", nfields[$1], "fields, found", NF 469*84d8c05bSMike Kupfer status=1 470*84d8c05bSMike Kupfer } 471*84d8c05bSMike Kupfer } 472*84d8c05bSMike Kupfer END { 473*84d8c05bSMike Kupfer exit status 474*84d8c05bSMike Kupfer } 475*84d8c05bSMike Kupfer ' $1 || fail "Errors in kernel module list" 476*84d8c05bSMike Kupfer} 477*84d8c05bSMike Kupfer 478fb9f9b97Skupfer# 4797c478bd9Sstevel@tonic-gate# Copy kernel modules to $INSTALL_DIR 4807c478bd9Sstevel@tonic-gate# 4817c478bd9Sstevel@tonic-gate 482597bd30bSMike Kupferfunction copy_kernel { 4837c478bd9Sstevel@tonic-gate 4847c478bd9Sstevel@tonic-gate case $KARCH in 485fb9f9b97Skupfer sun4*) ISA=sparc; MACH=sparc ;; 486ae115bc7Smrj i86*) ISA=intel; MACH=i386 ;; 4877c478bd9Sstevel@tonic-gate *) fail "${KARCH}: invalid kernel architecture";; 4887c478bd9Sstevel@tonic-gate esac 489fb9f9b97Skupfer export MACH 4907c478bd9Sstevel@tonic-gate 4917c478bd9Sstevel@tonic-gate if [ "$GLOM" = "no" ]; then 4927c478bd9Sstevel@tonic-gate verbose "Source = $UTS, ISA = $ISA, kernel = $KARCH" 4937c478bd9Sstevel@tonic-gate else 4947c478bd9Sstevel@tonic-gate verbose "Source = $UTS, ISA = $ISA, kernel = $KARCH, impl = $IMPL" 4957c478bd9Sstevel@tonic-gate fi 4967c478bd9Sstevel@tonic-gate 4977c478bd9Sstevel@tonic-gate test -d $KARCH || fail "${KARCH}: invalid kernel architecture" 4987c478bd9Sstevel@tonic-gate test -d $ISA || fail "${ISA}: invalid instruction set architecture" 499fb9f9b97Skupfer 500fb9f9b97Skupfer tstmkdir $INSTALL_FILES 501fb9f9b97Skupfer rm -rf $modstatedir 502fb9f9b97Skupfer tstmkdir $modstatedir 503fb9f9b97Skupfer export MODSTATE=$modstatedir/state 5047c478bd9Sstevel@tonic-gate 5057c478bd9Sstevel@tonic-gate # 506fb9f9b97Skupfer # Figure out which "make" to use. dmake is faster than serial 507fb9f9b97Skupfer # make, but dmake 7.3 has a bug that causes it to lose log 508fb9f9b97Skupfer # output, which means the modlist might be incomplete. 5097c478bd9Sstevel@tonic-gate # 510fb9f9b97Skupfer make=dmake 511fb9f9b97Skupfer dmvers=`$make -version` 512fb9f9b97Skupfer if [ $? -ne 0 ]; then 513fb9f9b97Skupfer make=/usr/ccs/bin/make 514fb9f9b97Skupfer elif [[ $dmvers = *Distributed?Make?7.3* ]]; then 515fb9f9b97Skupfer unset make 516fb9f9b97Skupfer searchpath="/ws/onnv-tools/SUNWspro/SOS10/bin 517fb9f9b97Skupfer /opt/SUNWspro/SOS10/bin 518fb9f9b97Skupfer /opt/SUNWspro/bin" 519fb9f9b97Skupfer for dmpath in $searchpath; do 520fb9f9b97Skupfer verbose "Trying $dmpath/dmake" 521fb9f9b97Skupfer if [ -x $dmpath/dmake ]; then 522fb9f9b97Skupfer dmvers=`$dmpath/dmake -version` 523fb9f9b97Skupfer if [[ $dmvers != *Distributed?Make?7.3* ]]; then 524fb9f9b97Skupfer make="$dmpath/dmake" 525fb9f9b97Skupfer break; 5267c478bd9Sstevel@tonic-gate fi 527fb9f9b97Skupfer fi 528fb9f9b97Skupfer done 529fb9f9b97Skupfer if [ -z $make ]; then 530fb9f9b97Skupfer make=/usr/ccs/bin/make 531fb9f9b97Skupfer echo "Warning: dmake 7.3 doesn't work with Install;" \ 532fb9f9b97Skupfer "using $make" 533fb9f9b97Skupfer fi 5347c478bd9Sstevel@tonic-gate fi 5357c478bd9Sstevel@tonic-gate 536fb9f9b97Skupfer # 537fb9f9b97Skupfer # Get a list of all modules, configuration files, and links 538fb9f9b97Skupfer # that we might want to install. 539fb9f9b97Skupfer # 540fb9f9b97Skupfer verbose "Building module list..." 541fb9f9b97Skupfer (cd $KARCH; MAKEFLAGS=e $make -K $MODSTATE modlist.karch) | \ 542fb9f9b97Skupfer egrep "^MOD|^CONF|^LINK|^SYMLINK" > $modlist 543597bd30bSMike Kupfer [ "$VERBOSE" = "V" ] && cat $modlist 544*84d8c05bSMike Kupfer check_modlist $modlist 545597bd30bSMike Kupfer if [ -n "$ON_CRYPTO_BINS" ]; then 546597bd30bSMike Kupfer cryptotar="$ON_CRYPTO_BINS" 547597bd30bSMike Kupfer if [ "$OBJD" = obj ]; then 548597bd30bSMike Kupfer isa=$(uname -p) 549597bd30bSMike Kupfer cryptotar=$(echo "$ON_CRYPTO_BINS" | 550597bd30bSMike Kupfer sed -e s/.$isa.tar.bz2/-nd.$isa.tar.bz2/) 551597bd30bSMike Kupfer fi 552597bd30bSMike Kupfer [ -f "$cryptotar" ] || fail "crypto ($cryptotar) doesn't exist" 553597bd30bSMike Kupfer cryptotree=$(mktemp -d /tmp/crypto.XXXXXX) 554597bd30bSMike Kupfer [ -n "$cryptotree" ] || fail "can't create tree for crypto" 555597bd30bSMike Kupfer unpack_crypto "$cryptotar" "$cryptotree" 556597bd30bSMike Kupfer # 557597bd30bSMike Kupfer # fixcrypto must come before fixglom, because 558597bd30bSMike Kupfer # fixcrypto uses the unglommed path to find things in 559597bd30bSMike Kupfer # the unpacked crypto. 560597bd30bSMike Kupfer # 561597bd30bSMike Kupfer fixcrypto $modlist "$cryptotree" 562597bd30bSMike Kupfer fi 563fb9f9b97Skupfer if [ "$GLOM" = "yes" ]; then 564fb9f9b97Skupfer fixglom $modlist $GLOMNAME 565fb9f9b97Skupfer filtimpl $modlist $IMPL 566fb9f9b97Skupfer fi 567fb9f9b97Skupfer if [[ -n "$files" && "$files" != All ]]; then 568fb9f9b97Skupfer filtmod $modlist "$files" 569fb9f9b97Skupfer fi 5707c478bd9Sstevel@tonic-gate 571fb9f9b97Skupfer # 572fb9f9b97Skupfer # Copy modules and create links. For architectures with both 573fb9f9b97Skupfer # 32- and 64-bit modules, we'll likely have duplicate 574fb9f9b97Skupfer # configuration files, so do those after filtering out the 575fb9f9b97Skupfer # duplicates. 576fb9f9b97Skupfer # 5777c478bd9Sstevel@tonic-gate verbose "Copying files to ${INSTALL_FILES}..." 5787c478bd9Sstevel@tonic-gate 5797c478bd9Sstevel@tonic-gate # 580fb9f9b97Skupfer # The IFS is reset to the newline character so we can buffer the 581fb9f9b97Skupfer # output of grep without piping it directly to copymod, otherwise 582fb9f9b97Skupfer # if fail() is called, then it will deadlock in fail()'s wait call 5837c478bd9Sstevel@tonic-gate # 584fb9f9b97Skupfer OIFS="$IFS" 585fb9f9b97Skupfer IFS=" 586fb9f9b97Skupfer " 587fb9f9b97Skupfer set -- `grep -v "^CONF" $modlist`; 588fb9f9b97Skupfer IFS="$OIFS" 589fb9f9b97Skupfer for onemod in "$@"; do 590fb9f9b97Skupfer copymod $onemod 591fb9f9b97Skupfer done 5927c478bd9Sstevel@tonic-gate 593fb9f9b97Skupfer OIFS="$IFS" 594fb9f9b97Skupfer IFS=" 595fb9f9b97Skupfer " 596fb9f9b97Skupfer set -- `grep "^CONF" $modlist | sort | uniq`; 597fb9f9b97Skupfer IFS="$OIFS" 598fb9f9b97Skupfer for onemod in "$@"; do 599fb9f9b97Skupfer copymod $onemod 600fb9f9b97Skupfer done 6017c478bd9Sstevel@tonic-gate 6027c478bd9Sstevel@tonic-gate # 603986fd29aSsetje # Add the glommed kernel name to the root archive 6047c478bd9Sstevel@tonic-gate # 605986fd29aSsetje if [[ $GLOM == "yes" ]]; 606ae115bc7Smrj then 6077c478bd9Sstevel@tonic-gate filelist="$INSTALL_FILES/etc/boot/solaris/filelist.ramdisk" 6087c478bd9Sstevel@tonic-gate mkdir -p `dirname $filelist` 6097c478bd9Sstevel@tonic-gate echo "platform/$KARCH/$GLOMNAME" >$filelist 6107c478bd9Sstevel@tonic-gate fi 6117c478bd9Sstevel@tonic-gate 6127c478bd9Sstevel@tonic-gate STATE=1 # all kernel modules copied correctly 6137c478bd9Sstevel@tonic-gate save_state 6147c478bd9Sstevel@tonic-gate} 6157c478bd9Sstevel@tonic-gate 616597bd30bSMike Kupferfunction kmdb_copy { 6177c478bd9Sstevel@tonic-gate typeset src="$1" 6187c478bd9Sstevel@tonic-gate typeset destdir="$2" 6197c478bd9Sstevel@tonic-gate 6207c478bd9Sstevel@tonic-gate if [[ ! -d $dest ]] ; then 621597bd30bSMike Kupfer [[ "$VERBOSE" != "q" ]] && echo "mkdir -p $destdir" 6227c478bd9Sstevel@tonic-gate 6237c478bd9Sstevel@tonic-gate mkdir -p $destdir || fail "failed to create $destdir" 6247c478bd9Sstevel@tonic-gate fi 6257c478bd9Sstevel@tonic-gate 626597bd30bSMike Kupfer [[ "$VERBOSE" != "q" ]] && echo "cp $src $destdir" 6277c478bd9Sstevel@tonic-gate 6287c478bd9Sstevel@tonic-gate cp $src $destdir || fail "failed to copy $src to $destdir" 6297c478bd9Sstevel@tonic-gate} 6307c478bd9Sstevel@tonic-gate 631597bd30bSMike Kupferfunction kmdb_copy_machkmods { 6327c478bd9Sstevel@tonic-gate typeset modbase="$1" 6337c478bd9Sstevel@tonic-gate typeset destdir="$2" 6347c478bd9Sstevel@tonic-gate typeset dir= 6357c478bd9Sstevel@tonic-gate typeset kmod= 6367c478bd9Sstevel@tonic-gate 6377c478bd9Sstevel@tonic-gate [[ ! -d $modbase ]] && return 6387c478bd9Sstevel@tonic-gate 6397c478bd9Sstevel@tonic-gate for dir in $(find $modbase -name kmod) ; do 6407c478bd9Sstevel@tonic-gate set -- $(echo $dir |tr '/' ' ') 6417c478bd9Sstevel@tonic-gate 6427c478bd9Sstevel@tonic-gate [[ $# -lt 2 ]] && fail "invalid mach kmod dir $dir" 6437c478bd9Sstevel@tonic-gate 6447c478bd9Sstevel@tonic-gate shift $(($# - 2)) 6457c478bd9Sstevel@tonic-gate kmod=$1 6467c478bd9Sstevel@tonic-gate 6477c478bd9Sstevel@tonic-gate [[ ! -f $dir/$kmod ]] && continue 6487c478bd9Sstevel@tonic-gate 6497c478bd9Sstevel@tonic-gate kmdb_copy $dir/$kmod $destdir 6507c478bd9Sstevel@tonic-gate done 6517c478bd9Sstevel@tonic-gate} 6527c478bd9Sstevel@tonic-gate 653597bd30bSMike Kupferfunction kmdb_copy_karchkmods { 6547c478bd9Sstevel@tonic-gate typeset modbase="$1" 6557c478bd9Sstevel@tonic-gate typeset destdir="$2" 6567c478bd9Sstevel@tonic-gate typeset bitdir="$3" 6577c478bd9Sstevel@tonic-gate typeset dir= 6587c478bd9Sstevel@tonic-gate typeset kmod= 6597c478bd9Sstevel@tonic-gate typeset karch= 6607c478bd9Sstevel@tonic-gate 6617c478bd9Sstevel@tonic-gate [[ ! -d $modbase ]] && return 6627c478bd9Sstevel@tonic-gate 6637c478bd9Sstevel@tonic-gate for dir in $(find $modbase -name kmod) ; do 6647c478bd9Sstevel@tonic-gate set -- $(echo $dir | tr '/' ' ') 6657c478bd9Sstevel@tonic-gate 6667c478bd9Sstevel@tonic-gate [[ $# -lt 3 ]] && fail "invalid karch kmod dir $dir" 6677c478bd9Sstevel@tonic-gate 6687c478bd9Sstevel@tonic-gate shift $(($# - 3)) 6697c478bd9Sstevel@tonic-gate kmod=$1 6707c478bd9Sstevel@tonic-gate bdir=$2 6717c478bd9Sstevel@tonic-gate 6727c478bd9Sstevel@tonic-gate [[ $bdir != $bitdir ]] && continue 6737c478bd9Sstevel@tonic-gate [[ ! -f $dir/$1 ]] && continue 6747c478bd9Sstevel@tonic-gate 6757c478bd9Sstevel@tonic-gate kmdb_copy $dir/$kmod $destdir 6767c478bd9Sstevel@tonic-gate done 6777c478bd9Sstevel@tonic-gate} 6787c478bd9Sstevel@tonic-gate 679597bd30bSMike Kupferfunction kmdb_copy_kmdbmod { 6807c478bd9Sstevel@tonic-gate typeset kmdbpath="$1" 6817c478bd9Sstevel@tonic-gate typeset destdir="$2" 6827c478bd9Sstevel@tonic-gate 6837c478bd9Sstevel@tonic-gate [[ ! -f $kmdbpath ]] && return 1 6847c478bd9Sstevel@tonic-gate 6857c478bd9Sstevel@tonic-gate kmdb_copy $kmdbpath $destdir 6867c478bd9Sstevel@tonic-gate 6877c478bd9Sstevel@tonic-gate return 0 6887c478bd9Sstevel@tonic-gate} 6897c478bd9Sstevel@tonic-gate 690597bd30bSMike Kupferfunction copy_kmdb { 6917c478bd9Sstevel@tonic-gate typeset kmdbtgtdir=$INSTALL_FILES/platform/$KARCH/$GLOMNAME/misc 6927c478bd9Sstevel@tonic-gate typeset bitdirs= 6937c478bd9Sstevel@tonic-gate typeset isadir= 6947c478bd9Sstevel@tonic-gate typeset b64srcdir= 6957c478bd9Sstevel@tonic-gate typeset b64tgtdir= 6967c478bd9Sstevel@tonic-gate typeset b32srcdir= 6977c478bd9Sstevel@tonic-gate typeset b32tgtdir= 6987c478bd9Sstevel@tonic-gate typeset machdir= 6997c478bd9Sstevel@tonic-gate typeset platdir= 7007c478bd9Sstevel@tonic-gate 7017c478bd9Sstevel@tonic-gate if [[ $KMDB = "no" || ! -d $SRC/cmd/mdb ]] ; then 7027c478bd9Sstevel@tonic-gate # The kmdb copy was suppressed or the workspace doesn't contain 7037c478bd9Sstevel@tonic-gate # the mdb subtree. Either way, there's nothing to do. 7047c478bd9Sstevel@tonic-gate STATE=2 7057c478bd9Sstevel@tonic-gate save_state 7067c478bd9Sstevel@tonic-gate return 7077c478bd9Sstevel@tonic-gate fi 7087c478bd9Sstevel@tonic-gate 7097c478bd9Sstevel@tonic-gate if [[ $(mach) = "i386" ]] ; then 7107c478bd9Sstevel@tonic-gate isadir="intel" 7117c478bd9Sstevel@tonic-gate b64srcdir="amd64" 7127c478bd9Sstevel@tonic-gate b64tgtdir="amd64" 7137c478bd9Sstevel@tonic-gate b32srcdir="ia32" 7147c478bd9Sstevel@tonic-gate b32tgtdir="." 7157c478bd9Sstevel@tonic-gate else 7167c478bd9Sstevel@tonic-gate isadir="sparc" 7177c478bd9Sstevel@tonic-gate b64srcdir="v9" 7187c478bd9Sstevel@tonic-gate b64tgtdir="sparcv9" 7197c478bd9Sstevel@tonic-gate b32srcdir="v7" 7207c478bd9Sstevel@tonic-gate b32tgtdir="." 7217c478bd9Sstevel@tonic-gate fi 7227c478bd9Sstevel@tonic-gate 7237c478bd9Sstevel@tonic-gate typeset foundkmdb=no 7247c478bd9Sstevel@tonic-gate typeset kmdbpath= 725a9857382Sae112802 typeset destdir= 7267c478bd9Sstevel@tonic-gate 7277c478bd9Sstevel@tonic-gate platdir=$INSTALL_FILES/platform/$KARCH/$GLOMNAME 7287c478bd9Sstevel@tonic-gate if [[ $GLOM = "yes" ]] ; then 7297c478bd9Sstevel@tonic-gate machdir=$platdir 7307c478bd9Sstevel@tonic-gate else 7317c478bd9Sstevel@tonic-gate machdir=$INSTALL_FILES/kernel 7327c478bd9Sstevel@tonic-gate fi 7337c478bd9Sstevel@tonic-gate 734fb9f9b97Skupfer srctrees=$SRC 735fb9f9b97Skupfer if [[ -d $SRC/../closed && "$CLOSED_IS_PRESENT" != no ]]; then 736fb9f9b97Skupfer srctrees="$srctrees $SRC/../closed" 737597bd30bSMike Kupfer else 738597bd30bSMike Kupfer if [ -z "$ON_CRYPTO_BINS" ]; then 739597bd30bSMike Kupfer echo "Warning: ON_CRYPTO_BINS not set; pre-signed" \ 740597bd30bSMike Kupfer "crypto not provided." 741597bd30bSMike Kupfer fi 742fb9f9b97Skupfer fi 7437c478bd9Sstevel@tonic-gate if [[ $WANT64 = "yes" ]] ; then 744a9857382Sae112802 # kmdbmod for sparc and x86 are built and installed 745a9857382Sae112802 # in different places 746a9857382Sae112802 if [[ $(mach) = "i386" ]] ; then 747a9857382Sae112802 kmdbpath=$SRC/cmd/mdb/$isadir/$b64srcdir/kmdb/kmdbmod 748a9857382Sae112802 destdir=$machdir/misc/$b64tgtdir 749a9857382Sae112802 else 750a9857382Sae112802 kmdbpath=$SRC/cmd/mdb/$KARCH/$b64srcdir/kmdb/kmdbmod 751a9857382Sae112802 destdir=$platdir/misc/$b64tgtdir 752a9857382Sae112802 fi 753a9857382Sae112802 754a9857382Sae112802 if kmdb_copy_kmdbmod $kmdbpath $destdir ; then 7557c478bd9Sstevel@tonic-gate foundkmdb="yes" 7567c478bd9Sstevel@tonic-gate 757fb9f9b97Skupfer for tree in $srctrees; do 758fb9f9b97Skupfer kmdb_copy_machkmods \ 759fb9f9b97Skupfer $tree/cmd/mdb/$isadir/$b64srcdir \ 7607c478bd9Sstevel@tonic-gate $machdir/kmdb/$b64tgtdir 761fb9f9b97Skupfer kmdb_copy_karchkmods $tree/cmd/mdb/$KARCH \ 7627c478bd9Sstevel@tonic-gate $platdir/kmdb/$b64tgtdir $b64srcdir 763fb9f9b97Skupfer done 7647c478bd9Sstevel@tonic-gate fi 7657c478bd9Sstevel@tonic-gate fi 7667c478bd9Sstevel@tonic-gate 7677c478bd9Sstevel@tonic-gate if [[ $WANT32 = "yes" ]] ; then 768a9857382Sae112802 kmdbpath=$SRC/cmd/mdb/$isadir/$b32srcdir/kmdb/kmdbmod 769a9857382Sae112802 destdir=$machdir/misc/$b32tgtdir 770a9857382Sae112802 771a9857382Sae112802 if kmdb_copy_kmdbmod $kmdbpath $destdir ; then 7727c478bd9Sstevel@tonic-gate foundkmdb="yes" 7737c478bd9Sstevel@tonic-gate 774fb9f9b97Skupfer for tree in $srctrees; do 775fb9f9b97Skupfer kmdb_copy_machkmods \ 776fb9f9b97Skupfer $tree/cmd/mdb/$isadir/$b32srcdir \ 7777c478bd9Sstevel@tonic-gate $machdir/kmdb/$b32tgtdir 778fb9f9b97Skupfer kmdb_copy_karchkmods $tree/cmd/mdb/$KARCH \ 7797c478bd9Sstevel@tonic-gate $platdir/kmdb/$b32tgtdir $b32srcdir 780fb9f9b97Skupfer done 7817c478bd9Sstevel@tonic-gate fi 7827c478bd9Sstevel@tonic-gate fi 7837c478bd9Sstevel@tonic-gate 7847c478bd9Sstevel@tonic-gate # A kmdb-less workspace isn't fatal, but it is potentially problematic, 7857c478bd9Sstevel@tonic-gate # as the changes made to uts may have altered something upon which kmdb 7867c478bd9Sstevel@tonic-gate # depends. We will therefore remind the user that they haven't built it 7877c478bd9Sstevel@tonic-gate # yet. 7887c478bd9Sstevel@tonic-gate if [[ $foundkmdb != "yes" ]] ; then 7897c478bd9Sstevel@tonic-gate echo "WARNING: kmdb isn't built, and won't be included" 7907c478bd9Sstevel@tonic-gate fi 7917c478bd9Sstevel@tonic-gate 7927c478bd9Sstevel@tonic-gate STATE=2 7937c478bd9Sstevel@tonic-gate save_state 7947c478bd9Sstevel@tonic-gate return 7957c478bd9Sstevel@tonic-gate} 7967c478bd9Sstevel@tonic-gate 7977c478bd9Sstevel@tonic-gate# 7987c478bd9Sstevel@tonic-gate# Make tarfile 7997c478bd9Sstevel@tonic-gate# 8007c478bd9Sstevel@tonic-gate 801597bd30bSMike Kupferfunction make_tarfile { 8027c478bd9Sstevel@tonic-gate echo "Creating tarfile $TARFILE" 8037c478bd9Sstevel@tonic-gate test -d $INSTALL_FILES || fail "Can't find $INSTALL_FILES" 8047c478bd9Sstevel@tonic-gate cd $INSTALL_FILES 8057c478bd9Sstevel@tonic-gate rm -f $TARFILE files 8067c478bd9Sstevel@tonic-gate 8077c478bd9Sstevel@tonic-gate # We don't want to change the permissions or ownership of pre-existing 8087c478bd9Sstevel@tonic-gate # directories on the target machine, so we're going to take care to 8097c478bd9Sstevel@tonic-gate # avoid including directories in the tarfile. On extraction, tar won't 8107c478bd9Sstevel@tonic-gate # modify pre-existing directories, and will create non-existent ones as 8117c478bd9Sstevel@tonic-gate # the user doing the extraction. 8127c478bd9Sstevel@tonic-gate find . ! -type d -print |fgrep -vx './files' >files 8137c478bd9Sstevel@tonic-gate tar cf $TARFILE -I files || fail "Couldn't create tarfile $TARFILE" 8147c478bd9Sstevel@tonic-gate STATE=3 8157c478bd9Sstevel@tonic-gate} 8167c478bd9Sstevel@tonic-gate 8177c478bd9Sstevel@tonic-gate# 8187c478bd9Sstevel@tonic-gate# Routines to copy files to the target machine 8197c478bd9Sstevel@tonic-gate# 8207c478bd9Sstevel@tonic-gate 821597bd30bSMike Kupferfunction remote_fail { 8227c478bd9Sstevel@tonic-gate fail "" "$1" "" \ 8237c478bd9Sstevel@tonic-gate "Make sure that $TARGET_MACHINE is up." \ 8247c478bd9Sstevel@tonic-gate"Check .rhosts in the home directory of user $TARGET_USER on $TARGET_MACHINE." \ 8257c478bd9Sstevel@tonic-gate "Check /etc/hosts.equiv, /etc/passwd, and /etc/shadow." \ 8267c478bd9Sstevel@tonic-gate "Change permissions on $TARGET_MACHINE as necessary." \ 8277c478bd9Sstevel@tonic-gate "Then, use \"$INSTALL -R\" to resume the install." "" 8287c478bd9Sstevel@tonic-gate} 8297c478bd9Sstevel@tonic-gate 830597bd30bSMike Kupferfunction remote_install { 8317c478bd9Sstevel@tonic-gate if [ "$IMODE" = "n" ]; then 8327c478bd9Sstevel@tonic-gate STATE=4 8337c478bd9Sstevel@tonic-gate return 0 8347c478bd9Sstevel@tonic-gate fi 8357c478bd9Sstevel@tonic-gate test -s $TARFILE || fail "$TARFILE missing or empty" 8367c478bd9Sstevel@tonic-gate verbose "Installing system on $TARGET" 8377c478bd9Sstevel@tonic-gate test -d $INSTALL_DIR || fail "Can't find $INSTALL_DIR" 8387c478bd9Sstevel@tonic-gate cd $INSTALL_DIR 8397c478bd9Sstevel@tonic-gate rm -f errors fatal nonfatal 8407c478bd9Sstevel@tonic-gate if [ "$IMODE" = "T" ]; then 8417c478bd9Sstevel@tonic-gate EMESG="Can't rcp to $TARGET" 8427c478bd9Sstevel@tonic-gate touch errors 8437c478bd9Sstevel@tonic-gate sh -e${SHV}c "$INSTALL_RCP $TARFILE $TARGET/Install.tar" 8447c478bd9Sstevel@tonic-gate else 8457c478bd9Sstevel@tonic-gate EMESG="Can't rsh to $TARGET_MACHINE" 8467c478bd9Sstevel@tonic-gate rsh -l $TARGET_USER $TARGET_MACHINE \ 8477c478bd9Sstevel@tonic-gate "(cd $TARGET_DIR; /usr/bin/tar x${V}f -)" \ 8487c478bd9Sstevel@tonic-gate <$TARFILE 2>errors 8497c478bd9Sstevel@tonic-gate fi 8507c478bd9Sstevel@tonic-gate test $? -ne 0 && remote_fail "$EMESG" 8517c478bd9Sstevel@tonic-gate cd $INSTALL_DIR 8527c478bd9Sstevel@tonic-gate egrep "set time|warning|blocksize" errors >nonfatal 8537c478bd9Sstevel@tonic-gate egrep -v "set time|warning|blocksize" errors >fatal 8547c478bd9Sstevel@tonic-gate if [ -s fatal ]; then 8557c478bd9Sstevel@tonic-gate echo "Fatal errors from rsh:" 8567c478bd9Sstevel@tonic-gate cat fatal 8577c478bd9Sstevel@tonic-gate remote_fail "Can't install on $TARGET_MACHINE" 8587c478bd9Sstevel@tonic-gate fi 8597c478bd9Sstevel@tonic-gate if [ -s nonfatal -a "$VERBOSE" != "q" ]; then 8607c478bd9Sstevel@tonic-gate echo "Non-fatal errors from rsh:" 8617c478bd9Sstevel@tonic-gate cat nonfatal 8627c478bd9Sstevel@tonic-gate fi 8637c478bd9Sstevel@tonic-gate rm -f fatal nonfatal errors 8647c478bd9Sstevel@tonic-gate test "$IMODE" = "T" && echo "Files can be extracted on \ 8657c478bd9Sstevel@tonic-gate$TARGET_MACHINE using 'tar xvf $TARGET_DIR/Install.tar'" 8667c478bd9Sstevel@tonic-gate STATE=4 8677c478bd9Sstevel@tonic-gate} 8687c478bd9Sstevel@tonic-gate 869597bd30bSMike Kupferfunction okexit { 8707c478bd9Sstevel@tonic-gate cd /tmp 8717c478bd9Sstevel@tonic-gate test "$CLEANUP" = c && remove_dir $INSTALL_DIR 8727c478bd9Sstevel@tonic-gate save_state 873fb9f9b97Skupfer rm -rf $modstatedir 874fb9f9b97Skupfer rm -f $modlist 875597bd30bSMike Kupfer [ -n "$cryptotree" ] && rm -rf "$cryptotree" 8767c478bd9Sstevel@tonic-gate verbose "Install complete" 8777c478bd9Sstevel@tonic-gate exit 0 8787c478bd9Sstevel@tonic-gate} 8797c478bd9Sstevel@tonic-gate 8807c478bd9Sstevel@tonic-gate# 8817c478bd9Sstevel@tonic-gate# Process options 8827c478bd9Sstevel@tonic-gate# 8837c478bd9Sstevel@tonic-gate 8847c478bd9Sstevel@tonic-gateRCOPTS="" 8857c478bd9Sstevel@tonic-gateLIBCREATE="no" 8867c478bd9Sstevel@tonic-gateLIBSRC="" 8877c478bd9Sstevel@tonic-gateENV_PATH=$CODEMGR_WS 8887c478bd9Sstevel@tonic-gateOBJD="debug" 8897c478bd9Sstevel@tonic-gateKMDB="yes" 8907c478bd9Sstevel@tonic-gate 8917c478bd9Sstevel@tonic-gatetest -s $INSTALL_RC && RCOPTS=`cat $INSTALL_RC` 8927c478bd9Sstevel@tonic-gateset $INSTALL $DEFAULT_OPTIONS $RCOPTS $* 8937c478bd9Sstevel@tonic-gateshift 8947c478bd9Sstevel@tonic-gate 8957c478bd9Sstevel@tonic-gatewhile getopts acd:D:G:hi:k:Kl:Lmno:pPqRs:t:T:uvVw:xX36 opt 8967c478bd9Sstevel@tonic-gatedo 8977c478bd9Sstevel@tonic-gate case $opt in 8987c478bd9Sstevel@tonic-gate w) ENV_PATH="$OPTARG"; SRC="$ENV_PATH/usr/src";; 8997c478bd9Sstevel@tonic-gate s) UTS="$OPTARG";; 9007c478bd9Sstevel@tonic-gate k) KARCH="$OPTARG";; 9017c478bd9Sstevel@tonic-gate t|T) TARGET="$OPTARG"; IMODE=$opt; CLEANUP="c";; 9027c478bd9Sstevel@tonic-gate n) TARGET=""; IMODE="n"; CLEANUP="p";; 9037c478bd9Sstevel@tonic-gate u) files="unix genunix";; 904fb9f9b97Skupfer m) files="Modules";; 905fb9f9b97Skupfer a) files="All";; 9067c478bd9Sstevel@tonic-gate v|V|q) VERBOSE=$opt;; 9077c478bd9Sstevel@tonic-gate c|p) CLEANUP=$opt;; 9087c478bd9Sstevel@tonic-gate L) LIBCREATE="yes"; CLEANUP="c";; 9097c478bd9Sstevel@tonic-gate l) LIBSRC="$OPTARG";; 9107c478bd9Sstevel@tonic-gate D) INSTALL_LIB="$OPTARG";; 9117c478bd9Sstevel@tonic-gate d) INSTALL_DIR="$OPTARG/$TRAILER";; 9127c478bd9Sstevel@tonic-gate G) GLOM=yes; GLOMNAME="$OPTARG";; 9139df5481aSEric Schrock P|X|x) echo "-$opt is obsolete; ignored";; 9147c478bd9Sstevel@tonic-gate h) usage "${INSTALL}: installs unix and modules";; 9157c478bd9Sstevel@tonic-gate R) x=$OPTIND; restore_state; OPTIND=$x;; 9167c478bd9Sstevel@tonic-gate i) IMPL="$OPTARG";; 9177c478bd9Sstevel@tonic-gate o) OBJD="$OPTARG";; 9187c478bd9Sstevel@tonic-gate K) KMDB="no";; 9197c478bd9Sstevel@tonic-gate 3) WANT64="no";; 9207c478bd9Sstevel@tonic-gate 6) WANT32="no";; 9217c478bd9Sstevel@tonic-gate \?) usage "Illegal option";; 9227c478bd9Sstevel@tonic-gate esac 9237c478bd9Sstevel@tonic-gatedone 9247c478bd9Sstevel@tonic-gateshift `expr $OPTIND - 1` 9257c478bd9Sstevel@tonic-gate 9267c478bd9Sstevel@tonic-gateENV_NAME=`basename $ENV_PATH` 9277c478bd9Sstevel@tonic-gate 9287c478bd9Sstevel@tonic-gate# 9297c478bd9Sstevel@tonic-gate# The rest of the command line is a list of individual files to copy. 9307c478bd9Sstevel@tonic-gate# If non-null, this list overrides the -uma options. 9317c478bd9Sstevel@tonic-gate# 9327c478bd9Sstevel@tonic-gate 9337c478bd9Sstevel@tonic-gateif [[ $# -gt 0 ]] ; then 9347c478bd9Sstevel@tonic-gate files="$*" 9357c478bd9Sstevel@tonic-gate KMDB="no" 9367c478bd9Sstevel@tonic-gatefi 9377c478bd9Sstevel@tonic-gate 938597bd30bSMike Kupfercase "$VERBOSE" in 9397c478bd9Sstevel@tonic-gate v) V="v"; SHV="x";; 9407c478bd9Sstevel@tonic-gate V) V="v"; SHV="x"; set -x;; 9417c478bd9Sstevel@tonic-gate q) V=""; SHV="";; 9427c478bd9Sstevel@tonic-gateesac 9437c478bd9Sstevel@tonic-gate 9447c478bd9Sstevel@tonic-gate# 9457c478bd9Sstevel@tonic-gate# Create temp directory for Install's files 9467c478bd9Sstevel@tonic-gate# 9477c478bd9Sstevel@tonic-gate 948fb9f9b97Skupfertstmkdir $INSTALL_DIR 9497c478bd9Sstevel@tonic-gate 9507c478bd9Sstevel@tonic-gateTARFILE=$INSTALL_DIR/Install.${KARCH}.tar 9517c478bd9Sstevel@tonic-gateINSTALL_FILES=$INSTALL_DIR/$KARCH 9527c478bd9Sstevel@tonic-gate 9537c478bd9Sstevel@tonic-gate# 9547c478bd9Sstevel@tonic-gate# Extract the target machine and target directory from a target of the 9557c478bd9Sstevel@tonic-gate# form [user@]machine:/dir . 9567c478bd9Sstevel@tonic-gate# 9577c478bd9Sstevel@tonic-gate 9587c478bd9Sstevel@tonic-gateif [ "$IMODE" != "n" ]; then 9597c478bd9Sstevel@tonic-gate eval `echo $TARGET | nawk -F':' '{ 9607c478bd9Sstevel@tonic-gate if (NF != 2 || !length($1) || !length($2)) 9617c478bd9Sstevel@tonic-gate print "usage \"Invalid target\"" 9627c478bd9Sstevel@tonic-gate m = $1; d = $2 9637c478bd9Sstevel@tonic-gate if ($1 ~ /@/) { 9647c478bd9Sstevel@tonic-gate k = split($1, f, "@"); 9657c478bd9Sstevel@tonic-gate if (k != 2 || !length(f[1]) || !length (f[2])) 9667c478bd9Sstevel@tonic-gate print "usage \"Invalid target\"" 9677c478bd9Sstevel@tonic-gate u = f[1]; m = f[2] 9687c478bd9Sstevel@tonic-gate } 9697c478bd9Sstevel@tonic-gate print "TARGET_USER=" u ";" 9707c478bd9Sstevel@tonic-gate print "TARGET_MACHINE=" m ";" 9717c478bd9Sstevel@tonic-gate print "TARGET_DIR=" d ";" 9727c478bd9Sstevel@tonic-gate }'` 9737c478bd9Sstevel@tonic-gate if [ -z "$TARGET_USER" ]; then 9747c478bd9Sstevel@tonic-gate TARGET_USER=$LOGNAME 9757c478bd9Sstevel@tonic-gate fi 9767c478bd9Sstevel@tonic-gatefi 9777c478bd9Sstevel@tonic-gate 9787c478bd9Sstevel@tonic-gate# 9797c478bd9Sstevel@tonic-gate# Allow the use of library source or target for the install 9807c478bd9Sstevel@tonic-gate# 9817c478bd9Sstevel@tonic-gate 9827c478bd9Sstevel@tonic-gateif [ -n "$LIBSRC" ]; then 9837c478bd9Sstevel@tonic-gate LIBSRC="`basename $LIBSRC .tar`.tar" 9847c478bd9Sstevel@tonic-gate TARFILE=$INSTALL_LIB/$LIBSRC 9857c478bd9Sstevel@tonic-gate test -s $TARFILE || fail "Can't find tarfile $TARFILE" 9867c478bd9Sstevel@tonic-gate verbose "Installing from library tarfile $TARFILE" 9877c478bd9Sstevel@tonic-gate STATE=3 9887c478bd9Sstevel@tonic-gateelif [ "$LIBCREATE" = "yes" ]; then 989fb9f9b97Skupfer tstmkdir $INSTALL_LIB 9907c478bd9Sstevel@tonic-gate TARFILE="$INSTALL_LIB/${ENV_NAME}.${KARCH}.tar" 9917c478bd9Sstevel@tonic-gatefi 9927c478bd9Sstevel@tonic-gate 9937c478bd9Sstevel@tonic-gate# 994fb9f9b97Skupfer# The next few lines allow recovery and activation with -R, 9957c478bd9Sstevel@tonic-gate# and library installs with -l. 9967c478bd9Sstevel@tonic-gate# 9977c478bd9Sstevel@tonic-gate 9987c478bd9Sstevel@tonic-gate[[ $STATE -eq 1 ]] && copy_kmdb 9997c478bd9Sstevel@tonic-gate[[ $STATE -eq 2 ]] && make_tarfile 10007c478bd9Sstevel@tonic-gate[[ $STATE -eq 3 ]] && remote_install 10017c478bd9Sstevel@tonic-gate[[ $STATE -eq 4 ]] && okexit 10027c478bd9Sstevel@tonic-gate 10037c478bd9Sstevel@tonic-gatesave_state 10047c478bd9Sstevel@tonic-gate 10057c478bd9Sstevel@tonic-gatecd $DOT 10067c478bd9Sstevel@tonic-gateDOTDOT=`cd ..; pwd` 10077c478bd9Sstevel@tonic-gate 10087c478bd9Sstevel@tonic-gate# 10097c478bd9Sstevel@tonic-gate# Try to be smart: if DOTDOT ends in uts, then infer UTS and KARCH from DOT 10107c478bd9Sstevel@tonic-gate# Otherwise, if SRC is set, infer UTS = $SRC/uts. 10117c478bd9Sstevel@tonic-gate# 10127c478bd9Sstevel@tonic-gate 10137c478bd9Sstevel@tonic-gateif [ "`basename $DOTDOT`" = "uts" ]; then 10147c478bd9Sstevel@tonic-gate UTS=$DOTDOT 10157c478bd9Sstevel@tonic-gate KARCH=`basename $DOT` 1016fb9f9b97Skupfer if [ ! -n "$SRC" ]; then 1017fb9f9b97Skupfer SRC=`dirname $DOTDOT` 1018fb9f9b97Skupfer verbose "Setting SRC to $SRC" 1019fb9f9b97Skupfer fi 1020fb9f9b97Skupfer export SRC 10217c478bd9Sstevel@tonic-gatefi 10227c478bd9Sstevel@tonic-gate 10237c478bd9Sstevel@tonic-gateif [ -z "$UTS" -a -n "$SRC" ]; then 10247c478bd9Sstevel@tonic-gate UTS="${SRC}/uts" 10257c478bd9Sstevel@tonic-gate test -n "$KARCH" || fail "no karch specified (e.g. -k sun4u)" 10267c478bd9Sstevel@tonic-gatefi 10277c478bd9Sstevel@tonic-gate 10287c478bd9Sstevel@tonic-gateif [ "$LIBCREATE" = "yes" ]; then 10297c478bd9Sstevel@tonic-gate TARFILE=$INSTALL_LIB/${ENV_NAME}.${KARCH}.tar 10307c478bd9Sstevel@tonic-gateelse 10317c478bd9Sstevel@tonic-gate TARFILE=$INSTALL_DIR/Install.${KARCH}.tar 10327c478bd9Sstevel@tonic-gatefi 10337c478bd9Sstevel@tonic-gateINSTALL_FILES=$INSTALL_DIR/$KARCH 10347c478bd9Sstevel@tonic-gatesave_state 10357c478bd9Sstevel@tonic-gate 10367c478bd9Sstevel@tonic-gatecd $DOT 10377c478bd9Sstevel@tonic-gatetest -z "$UTS" && fail 'Cannot find kernel sources -- $SRC not set' 10387c478bd9Sstevel@tonic-gatetest -d "$UTS" || fail "${UTS}: no such directory" 10397c478bd9Sstevel@tonic-gate 10407c478bd9Sstevel@tonic-gate# 10417c478bd9Sstevel@tonic-gate# Convert UTS into an absolute path. 10427c478bd9Sstevel@tonic-gate# 10437c478bd9Sstevel@tonic-gate 10447c478bd9Sstevel@tonic-gatecd $UTS 10457c478bd9Sstevel@tonic-gateUTS=`pwd` 10467c478bd9Sstevel@tonic-gate 10477c478bd9Sstevel@tonic-gatetest "`basename $UTS`" = "uts" || \ 10487c478bd9Sstevel@tonic-gate verbose "Warning: source path $UTS doesn't end in 'uts'" 10497c478bd9Sstevel@tonic-gate 10507c478bd9Sstevel@tonic-gateremove_dir $INSTALL_DIR/$KARCH 10517c478bd9Sstevel@tonic-gaterm -f $TARFILE 10527c478bd9Sstevel@tonic-gate 10537c478bd9Sstevel@tonic-gatecopy_kernel # sets STATE=1 if successful 10547c478bd9Sstevel@tonic-gatecopy_kmdb # sets STATE=2 if successful 10557c478bd9Sstevel@tonic-gatemake_tarfile # sets STATE=3 if successful 10567c478bd9Sstevel@tonic-gateremote_install # sets STATE=4 if successful 10577c478bd9Sstevel@tonic-gate 10587c478bd9Sstevel@tonic-gateokexit 1059