Home | History | Annotate | Line # | Download | only in miniroot
install.sub revision 1.33
      1   1.1       pk #!/bin/sh
      2  1.33      mrg #	$NetBSD: install.sub,v 1.33 2000/02/20 00:23:10 mrg Exp $
      3   1.1       pk #
      4   1.2  thorpej # Copyright (c) 1996 The NetBSD Foundation, Inc.
      5   1.1       pk # All rights reserved.
      6   1.1       pk #
      7   1.2  thorpej # This code is derived from software contributed to The NetBSD Foundation
      8   1.2  thorpej # by Jason R. Thorpe.
      9   1.2  thorpej #
     10   1.1       pk # Redistribution and use in source and binary forms, with or without
     11   1.1       pk # modification, are permitted provided that the following conditions
     12   1.1       pk # are met:
     13   1.1       pk # 1. Redistributions of source code must retain the above copyright
     14   1.1       pk #    notice, this list of conditions and the following disclaimer.
     15   1.1       pk # 2. Redistributions in binary form must reproduce the above copyright
     16   1.1       pk #    notice, this list of conditions and the following disclaimer in the
     17   1.1       pk #    documentation and/or other materials provided with the distribution.
     18   1.1       pk # 3. All advertising materials mentioning features or use of this software
     19   1.1       pk #    must display the following acknowledgement:
     20   1.2  thorpej #        This product includes software developed by the NetBSD
     21   1.2  thorpej #        Foundation, Inc. and its contributors.
     22   1.2  thorpej # 4. Neither the name of The NetBSD Foundation nor the names of its
     23   1.2  thorpej #    contributors may be used to endorse or promote products derived
     24   1.2  thorpej #    from this software without specific prior written permission.
     25   1.1       pk #
     26   1.2  thorpej # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27   1.2  thorpej # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28   1.2  thorpej # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  1.22      jtc # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.22      jtc # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31   1.2  thorpej # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32   1.2  thorpej # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33   1.2  thorpej # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34   1.2  thorpej # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35   1.2  thorpej # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36   1.2  thorpej # POSSIBILITY OF SUCH DAMAGE.
     37   1.1       pk #
     38   1.1       pk 
     39   1.1       pk #	NetBSD installation/upgrade script - common subroutines.
     40   1.1       pk 
     41   1.1       pk ROOTDISK=""				# filled in below
     42   1.7      leo VERSION=				# filled in automatically (see list)
     43   1.7      leo export VERSION
     44   1.1       pk 
     45   1.1       pk ALLSETS="base comp etc games man misc text"	# default install sets
     46   1.1       pk UPGRSETS="base comp games man misc text"	# default upgrade sets
     47  1.13       pk THESETS=					# one of the above
     48  1.13       pk 
     49  1.13       pk local_sets_dir=""			# Path searched for sets by install_sets
     50  1.13       pk 					# on the local filesystems
     51   1.1       pk 
     52   1.7      leo # decide upon an editor
     53   1.7      leo if [ X$EDITOR = X ]; then
     54   1.7      leo 	if [ -x /usr/bin/vi ]; then
     55   1.7      leo 		EDITOR=vi
     56   1.7      leo 	else
     57   1.7      leo 		EDITOR=ed
     58   1.7      leo 	fi
     59   1.7      leo fi
     60   1.7      leo 
     61   1.1       pk getresp() {
     62   1.1       pk 	read resp
     63   1.1       pk 	if [ "X$resp" = "X" ]; then
     64   1.1       pk 		resp=$1
     65   1.1       pk 	fi
     66   1.1       pk }
     67   1.1       pk 
     68   1.1       pk isin() {
     69   1.1       pk # test the first argument against the remaining ones, return succes on a match
     70   1.1       pk 	_a=$1; shift
     71   1.1       pk 	while [ $# != 0 ]; do
     72   1.1       pk 		if [ "$_a" = "$1" ]; then return 0; fi
     73   1.1       pk 		shift
     74   1.1       pk 	done
     75   1.1       pk 	return 1
     76   1.1       pk }
     77   1.1       pk 
     78   1.1       pk rmel() {
     79   1.1       pk # remove first argument from list formed by the remaining arguments
     80   1.6      leo 	local	_a
     81   1.6      leo 
     82   1.1       pk 	_a=$1; shift
     83   1.1       pk 	while [ $# != 0 ]; do
     84   1.1       pk 		if [ "$_a" != "$1" ]; then
     85   1.1       pk 			echo "$1";
     86   1.1       pk 		fi
     87   1.1       pk 		shift
     88   1.1       pk 	done
     89   1.1       pk }
     90   1.1       pk 
     91   1.3       pk cutword () {
     92   1.3       pk # read a line of data, return Nth element.
     93   1.3       pk 	local _a
     94   1.3       pk 	local _n
     95   1.4       pk 	local _oifs
     96   1.4       pk 
     97   1.4       pk 	# optional field separator
     98   1.4       pk 	_oifs="$IFS"
     99   1.4       pk 	case "$1" in
    100   1.6      leo 		-t?*) IFS=${1#-t}; shift;;
    101   1.4       pk 	esac
    102   1.4       pk 
    103   1.3       pk 	_n=$1
    104   1.3       pk 	read _a; set -- $_a
    105   1.4       pk 	IFS="$_oifs"
    106   1.3       pk 	if [ "$1" = "" ]; then return; fi
    107   1.3       pk 	eval echo \$$_n
    108   1.3       pk }
    109   1.3       pk 
    110   1.3       pk cutlast () {
    111   1.3       pk # read a line of data, return last element. Equiv. of awk '{print $NF}'.
    112   1.3       pk 	local _a
    113   1.4       pk 	local _oifs
    114   1.4       pk 
    115   1.4       pk 	# optional field separator
    116   1.4       pk 	_oifs="$IFS"
    117   1.4       pk 	case "$1" in
    118   1.6      leo 		-t?*) IFS=${1#-t}; shift;;
    119   1.4       pk 	esac
    120   1.4       pk 
    121   1.3       pk 	read _a; set -- $_a
    122   1.4       pk 	IFS="$_oifs"
    123   1.3       pk 	if [ "$1" = "" ]; then return; fi
    124   1.5       pk 	while [ "$#" -gt 10 ]; do shift 10; done
    125   1.3       pk 	eval echo \$$#
    126   1.3       pk }
    127   1.3       pk 
    128   1.3       pk firstchar () {
    129   1.3       pk # return first character of argument
    130   1.3       pk 	local _a
    131   1.3       pk 	_a=$1
    132   1.3       pk 	while [ ${#_a} != 1 ]; do
    133   1.3       pk 		_a=${_a%?}
    134   1.3       pk 	done
    135   1.3       pk 	echo $_a
    136   1.3       pk }
    137   1.3       pk 
    138   1.5       pk basename () {
    139   1.5       pk 	local _oifs
    140   1.5       pk 	if [ "$1" = "" ]; then return; fi
    141   1.5       pk 	_oifs="$IFS"
    142   1.5       pk 	IFS="/"
    143   1.5       pk 	set -- $1
    144   1.5       pk 	IFS="$_oifs"
    145   1.5       pk 	while [ "$#" -gt 10 ]; do shift 10; done
    146   1.5       pk 	eval echo \$$#
    147   1.5       pk }
    148   1.5       pk 
    149   1.7      leo dir_has_sets() {
    150   1.7      leo 	# return true when the directory $1 contains a set for $2...$n
    151   1.7      leo 	local _dir
    152   1.7      leo 	local _file
    153   1.7      leo 
    154   1.7      leo 	_dir=$1; shift
    155   1.7      leo 	for _file in $*
    156   1.7      leo 	do
    157   1.7      leo 		if [ -f $_dir/${_file}.tar.gz ]; then
    158   1.7      leo 			return 0
    159   1.7      leo 		fi
    160  1.13       pk 		# Try for stupid msdos convention
    161  1.13       pk 		if [ -f $_dir/${_file}.tgz ]; then
    162  1.13       pk 			return 0
    163  1.13       pk 		fi
    164  1.18       is 		# Try for split files
    165  1.18       is 		if [ -f $_dir/${_file}${VERSION}.aa ]; then
    166  1.18       is 			return 0
    167  1.18       is 		fi
    168   1.7      leo 	done
    169   1.7      leo 	return 1
    170   1.7      leo }
    171   1.7      leo 
    172   1.1       pk twiddle() {
    173   1.1       pk # spin the propeller so we don't get bored
    174   1.1       pk 	while : ; do  
    175   1.1       pk 		sleep 1; echo -n "/";
    176   1.1       pk 		sleep 1; echo -n "-";
    177   1.1       pk 		sleep 1; echo -n "\\";
    178   1.1       pk 		sleep 1; echo -n "|";
    179   1.1       pk 	done > /dev/tty & echo $!
    180   1.1       pk }
    181   1.1       pk 
    182  1.13       pk get_localdir() {
    183  1.13       pk 	# $1 is relative mountpoint
    184  1.13       pk 	local _mp
    185  1.13       pk 	local _dir
    186  1.13       pk 
    187  1.13       pk 	_mp=$1
    188  1.13       pk 	_dir=
    189  1.13       pk 	while : ; do
    190  1.32       pk 	    if [ X$_mp != X ]; then
    191  1.32       pk 		cat << __get_localdir_1
    192  1.32       pk Note: your filesystems are mounted under the temporary mount point \"$_mp\".
    193  1.32       pk The pathname you are requested to enter below should NOT include the \"$_mp\"
    194  1.32       pk prefix.
    195  1.32       pk __get_localdir_1
    196  1.32       pk 	    fi
    197  1.13       pk 	    echo -n "Enter the pathname where the sets are stored [$_dir] "
    198  1.13       pk 	    getresp "$_dir"
    199  1.13       pk 	    _dir=$resp
    200  1.13       pk 
    201  1.13       pk 	    # Allow break-out with empty response
    202  1.13       pk 	    if [ -z "$_dir" ]; then
    203  1.13       pk 		echo -n "Are you sure you don't want to set the pathname? [n] "
    204  1.13       pk 		getresp "n"
    205  1.13       pk 		case "$resp" in
    206  1.13       pk 			y*|Y*)
    207  1.13       pk 				break
    208  1.13       pk 				;;
    209  1.13       pk 			*)
    210  1.13       pk 				continue
    211  1.13       pk 				;;
    212  1.13       pk 		esac
    213  1.13       pk 	    fi
    214  1.13       pk 
    215  1.13       pk 	    if dir_has_sets "$_mp/$_dir" $THESETS
    216  1.13       pk 	    then
    217  1.13       pk 		local_sets_dir="$_mp/$_dir"
    218  1.13       pk 		break
    219  1.13       pk 	    else
    220  1.32       pk 		cat << __get_localdir_2
    221  1.32       pk The directory \"$_mp/$_dir\" does not exist, or does not hold any of the
    222  1.13       pk upgrade sets.
    223  1.32       pk __get_localdir_2
    224  1.13       pk 		echo -n "Re-enter pathname? [y] "
    225  1.13       pk 		getresp "y"
    226  1.13       pk 		case "$resp" in
    227  1.13       pk 			y*|Y*)
    228  1.13       pk 				;;
    229  1.13       pk 			*)
    230  1.13       pk 				local_sets_dir=""
    231  1.13       pk 				break
    232  1.13       pk 				;;
    233  1.13       pk 		esac
    234  1.13       pk 	    fi
    235  1.13       pk 	done
    236  1.13       pk }
    237  1.13       pk 
    238   1.1       pk getrootdisk() {
    239   1.1       pk 	cat << \__getrootdisk_1
    240   1.1       pk 
    241   1.1       pk The installation program needs to know which disk to consider
    242   1.1       pk the root disk.  Note the unit number may be different than
    243   1.1       pk the unit number you used in the standalone installation
    244   1.1       pk program.
    245   1.1       pk 
    246   1.1       pk Available disks are:
    247   1.1       pk 
    248   1.1       pk __getrootdisk_1
    249   1.1       pk 	_DKDEVS=`md_get_diskdevs`
    250   1.1       pk 	echo	"$_DKDEVS"
    251   1.1       pk 	echo	""
    252   1.1       pk 	echo -n	"Which disk is the root disk? "
    253   1.1       pk 	getresp ""
    254   1.1       pk 	if isin $resp $_DKDEVS ; then
    255   1.1       pk 		ROOTDISK="$resp"
    256   1.1       pk 	else
    257   1.1       pk 		echo ""
    258   1.1       pk 		echo "The disk $resp does not exist."
    259   1.1       pk 		ROOTDISK=""
    260   1.1       pk 	fi
    261   1.1       pk }
    262   1.1       pk 
    263   1.1       pk labelmoredisks() {
    264   1.1       pk 	cat << \__labelmoredisks_1
    265   1.1       pk 
    266   1.1       pk You may label the following disks:
    267   1.1       pk 
    268   1.1       pk __labelmoredisks_1
    269   1.1       pk 	echo "$_DKDEVS"
    270   1.1       pk 	echo	""
    271   1.1       pk 	echo -n	"Label which disk? [done] "
    272   1.1       pk 	getresp "done"
    273   1.1       pk 	case "$resp" in
    274  1.31      sjg 		"done")
    275   1.1       pk 			;;
    276   1.1       pk 
    277   1.1       pk 		*)
    278   1.5       pk 			if isin $resp $_DKDEVS ; then
    279   1.1       pk 				md_labeldisk $resp
    280   1.1       pk 			else
    281   1.1       pk 				echo ""
    282   1.1       pk 				echo "The disk $resp does not exist."
    283   1.1       pk 			fi
    284   1.1       pk 			;;
    285   1.1       pk 	esac
    286   1.1       pk }
    287   1.1       pk 
    288   1.1       pk addhostent() {
    289   1.1       pk 	# $1 - IP address
    290   1.1       pk 	# $2 - symbolic name
    291   1.1       pk 
    292   1.1       pk 	# Create an entry in the hosts table.  If no host table
    293   1.1       pk 	# exists, create one.  If the IP address already exists,
    294   1.1       pk 	# replace it's entry.
    295   1.1       pk 	if [ ! -f /tmp/hosts ]; then
    296   1.1       pk 		echo "127.0.0.1 localhost" > /tmp/hosts
    297   1.1       pk 	fi
    298   1.1       pk 
    299   1.3       pk 	sed "/^$1 /d" < /tmp/hosts > /tmp/hosts.new
    300   1.3       pk 	mv /tmp/hosts.new /tmp/hosts
    301   1.1       pk 
    302   1.1       pk 	echo "$1 $2 $2.$FQDN" >> /tmp/hosts
    303   1.1       pk }
    304   1.1       pk 
    305   1.1       pk addifconfig() {
    306   1.1       pk 	# $1 - interface name
    307   1.1       pk 	# $2 - interface symbolic name
    308   1.1       pk 	# $3 - interface IP address
    309   1.1       pk 	# $4 - interface netmask
    310  1.16       pk 	# $5 - (optional) interface link-layer medium
    311  1.16       pk 	# $6 - (optional) interface link-layer directives
    312  1.16       pk 	local _m
    313  1.16       pk 
    314  1.16       pk 	_m=""
    315  1.16       pk 	if [ "$5" != "" ]; then
    316  1.16       pk 		_m="media $5"
    317  1.16       pk 	fi
    318  1.16       pk 	# Create a ifconfig.* file for the interface.
    319  1.16       pk 	echo "inet $2 netmask $4 $_m $6" > /tmp/ifconfig.$1
    320   1.1       pk 
    321   1.1       pk 	addhostent $3 $2
    322   1.1       pk }
    323   1.1       pk 
    324   1.1       pk configurenetwork() {
    325   1.1       pk 	local _ifsdone
    326   1.1       pk 	local _ifs
    327   1.1       pk 
    328  1.16       pk #	_IFS=`md_get_ifdevs`
    329  1.16       pk 	_IFS=`ifconfig -l | sed '
    330  1.16       pk 		s/lo0//
    331  1.16       pk 		s/ppp[0-9]//g
    332  1.16       pk 		s/sl[0-9]//g
    333  1.16       pk 		s/tun[0-9]//g'`
    334  1.16       pk 
    335   1.1       pk 	_ifsdone=""
    336   1.1       pk 	resp=""		# force at least one iteration
    337   1.1       pk 	while [ "X${resp}" != X"done" ]; do
    338   1.1       pk 	cat << \__configurenetwork_1
    339   1.1       pk 
    340   1.1       pk You may configure the following network interfaces (the interfaces
    341   1.1       pk marked with [X] have been succesfully configured):
    342   1.1       pk 
    343   1.1       pk __configurenetwork_1
    344   1.1       pk 
    345   1.1       pk 		for _ifs in $_IFS; do
    346   1.1       pk 			if isin $_ifs $_ifsdone ; then
    347   1.1       pk 				echo -n "[X] "
    348   1.1       pk 			else
    349   1.1       pk 				echo -n "    "
    350   1.1       pk 			fi
    351   1.1       pk 			echo $_ifs
    352   1.1       pk 		done
    353   1.1       pk 		echo	""
    354   1.1       pk 		echo -n	"Configure which interface? [done] "
    355   1.1       pk 		getresp "done"
    356   1.1       pk 		case "$resp" in
    357   1.1       pk 		"done")
    358   1.1       pk 			;;
    359   1.1       pk 		*)
    360   1.1       pk 			_ifs=$resp
    361   1.1       pk 			if isin $_ifs $_IFS ; then
    362   1.1       pk 				if configure_ifs $_ifs ; then
    363   1.1       pk 					_ifsdone="$_ifs $_ifsdone"
    364   1.1       pk 				fi
    365   1.1       pk 			else
    366   1.1       pk 				echo "Invalid response: \"$resp\" is not in list"
    367   1.1       pk 			fi
    368   1.1       pk 			;;
    369   1.1       pk 		esac
    370   1.1       pk 	done
    371   1.1       pk }
    372   1.1       pk 
    373   1.1       pk configure_ifs() {
    374   1.1       pk 
    375   1.8       pk 	local _up
    376   1.8       pk 	local _interface_name
    377   1.8       pk 	local _interface_ip
    378   1.8       pk 	local _interface_mask
    379   1.8       pk 	local _interface_symname
    380  1.15      gwr 	local _interface_extra
    381  1.19       pk 	local _interface_mediumtype
    382  1.19       pk 	local _interface_supported_media
    383  1.28       is 	local _m
    384  1.29      mrg 	local _t
    385   1.8       pk 
    386   1.1       pk 	_interface_name=$1
    387  1.16       pk 	_up=DOWN
    388  1.16       pk 	if isin $_interface_name `ifconfig -l -u` ; then
    389  1.16       pk 		_up=UP
    390  1.16       pk 	fi
    391  1.16       pk 
    392  1.16       pk 	_interface_supported_media=`ifconfig -m $_interface_name | sed -n '
    393  1.29      mrg 		/^[ 	]*media autoselect/d
    394  1.29      mrg 		4,$s/[ 	]*media //p'`
    395   1.1       pk 
    396  1.29      mrg 	# get current "media" "ip" and "netmask" ("broadcast")
    397  1.29      mrg 	_t=`ifconfig $_interface_name | sed -n '
    398  1.29      mrg 		s/^[ 	]*media: [^ 	]* \([^ ][^ ]*\).*/\1/p'`
    399   1.8       pk 
    400  1.29      mrg 	if [ "$_t" != "manual" -a "$_t" != "media:" -a "$_t" != "autoselect" ];
    401  1.29      mrg 	then
    402  1.19       pk 		_interface_mediumtype=$1
    403  1.19       pk 	fi
    404  1.29      mrg 
    405  1.29      mrg 	set -- `ifconfig $_interface_name | sed -n '
    406  1.29      mrg 		/^[ 	]*inet/{
    407  1.29      mrg 		s/inet//
    408  1.29      mrg 		s/--> [0-9.][0-9.]*//
    409  1.29      mrg 		s/netmask//
    410  1.29      mrg 		s/broadcast//
    411  1.29      mrg 		p;}'`
    412  1.29      mrg 
    413  1.29      mrg 	_interface_ip=$1
    414  1.29      mrg 	_interface_mask=$2
    415   1.8       pk 
    416   1.1       pk 	# Get IP address
    417   1.1       pk 	resp=""		# force one iteration
    418   1.1       pk 	while [ "X${resp}" = X"" ]; do
    419   1.8       pk 		echo -n "IP address? [$_interface_ip] "
    420   1.8       pk 		getresp "$_interface_ip"
    421   1.1       pk 		_interface_ip=$resp
    422   1.1       pk 	done
    423   1.1       pk 
    424   1.1       pk 	# Get symbolic name
    425   1.1       pk 	resp=""		# force one iteration
    426   1.1       pk 	while [ "X${resp}" = X"" ]; do
    427   1.1       pk 		echo -n "Symbolic (host) name? "
    428   1.1       pk 		getresp ""
    429   1.1       pk 		_interface_symname=$resp
    430   1.1       pk 	done
    431   1.1       pk 
    432   1.1       pk 	# Get netmask
    433   1.1       pk 	resp=""		# force one iteration
    434   1.1       pk 	while [ "X${resp}" = X"" ]; do
    435   1.8       pk 		echo -n "Netmask? [$_interface_mask] "
    436   1.8       pk 		getresp "$_interface_mask"
    437   1.1       pk 		_interface_mask=$resp
    438   1.1       pk 	done
    439   1.1       pk 
    440  1.16       pk 	echo "Your network interface might require explicit selection"
    441  1.16       pk 	echo "of the type of network medium attached. Supported media:"
    442  1.29      mrg 	echo "$_interface_supported_media"
    443  1.29      mrg 	echo -n "Additional media type arguments (none)? [$_interface_mediumtype] "
    444  1.16       pk 	getresp "$_interface_mediumtype"
    445  1.28       is 	_m=""
    446  1.29      mrg 	if [ "X${resp}" != X"" -a "X${resp}" != Xnone ]; then
    447  1.16       pk 		_interface_mediumtype=$resp
    448  1.28       is 		_m="media ${resp}"
    449  1.16       pk 	fi
    450  1.16       pk 
    451  1.16       pk 
    452  1.15      gwr 	echo "Your network interface might require additional link-layer"
    453  1.15      gwr 	echo "directives (like \`link0'). If this is the case you can enter"
    454  1.15      gwr 	echo "these at the next prompt."
    455  1.15      gwr 	echo ""
    456  1.29      mrg 	echo -n "Additional link-layer arguments (none)? [$_interface_extra] "
    457  1.15      gwr 	getresp "$_interface_extra"
    458  1.29      mrg 	if [ "X${resp}" != X"" -a "X${resp}" != Xnone ]; then
    459  1.15      gwr 		_interface_extra=$resp
    460  1.15      gwr 	fi
    461  1.15      gwr 
    462   1.1       pk 	# Configure the interface.  If it
    463   1.1       pk 	# succeeds, add it to the permanent
    464   1.1       pk 	# network configuration info.
    465   1.8       pk 	if [ $_up != "UP" ]; then
    466   1.8       pk 		ifconfig ${_interface_name} down
    467   1.8       pk 		if ifconfig ${_interface_name} inet \
    468   1.8       pk 		    ${_interface_ip} \
    469  1.28       is 		    netmask ${_interface_mask} \
    470  1.28       is 		    ${_interface_extra} ${_m} up ; then
    471   1.8       pk 			addifconfig \
    472  1.28       is 			    "${_interface_name}" \
    473  1.28       is 			    "${_interface_symname}" \
    474  1.28       is 			    "${_interface_ip}" \
    475  1.28       is 			    "${_interface_mask}" \
    476  1.28       is 			    "${_interface_mediumtype}" \
    477  1.28       is 			    "${_interface_extra}"
    478   1.8       pk 			return 0
    479   1.8       pk 		fi
    480   1.8       pk 	else
    481   1.8       pk 		echo "Interface ${_interface_name} is already active."
    482   1.8       pk 		echo "Just saving configuration on new root filesystem."
    483   1.1       pk 		addifconfig \
    484  1.28       is 		    "${_interface_name}" \
    485  1.28       is 		    "${_interface_symname}" \
    486  1.28       is 		    "${_interface_ip}" \
    487  1.28       is 		    "${_interface_mask}" \
    488  1.28       is 		    "${_interface_mediumtype}" \
    489  1.28       is 		    "${_interface_extra}"
    490   1.1       pk 	fi
    491   1.1       pk 	return 1
    492   1.1       pk }
    493   1.1       pk 
    494   1.1       pk # Much of this is gratuitously stolen from /etc/netstart.
    495   1.1       pk enable_network() {
    496   1.1       pk 
    497   1.1       pk 	# Set up the hostname.
    498   1.1       pk 	if [ ! -f /mnt/etc/myname ]; then
    499   1.1       pk 		echo "ERROR: no /etc/myname!"
    500   1.1       pk 		return 1
    501   1.1       pk 	fi
    502   1.1       pk 	hostname=`cat /mnt/etc/myname`
    503   1.1       pk 	hostname $hostname
    504   1.1       pk 
    505   1.1       pk 	# configure all the interfaces which we know about.
    506  1.16       pk if [ -f /mnt/etc/rc.conf ]; then
    507  1.16       pk (
    508  1.16       pk 	# assume network interface configuration style 1.2D and up
    509  1.16       pk 	. /mnt/etc/rc.conf
    510  1.16       pk 
    511  1.16       pk 	if [ "$net_interfaces" != NO ]; then
    512  1.24       pk 		if [ "$auto_ifconfig" = YES ]; then
    513  1.16       pk 			tmp="`ifconfig -l`"
    514  1.16       pk 		else
    515  1.16       pk 			tmp="$net_interfaces"
    516  1.16       pk 		fi
    517  1.16       pk 		echo -n "configuring network interfaces:"
    518  1.16       pk 		for i in $tmp; do
    519  1.16       pk 			eval `echo 'args=$ifconfig_'$i`
    520  1.16       pk 			if [ ! -z "$args" ]; then
    521  1.16       pk 				echo -n " $i"
    522  1.16       pk 				ifconfig $i $args
    523  1.16       pk 			elif [ -f /mnt/etc/ifconfig.$i ]; then
    524  1.16       pk 				echo -n " $i"
    525  1.16       pk 				(while read args; do
    526  1.16       pk 					ifconfig $i $args
    527  1.16       pk 				done) < /mnt/etc/ifconfig.$i
    528  1.24       pk 			elif [ "$auto_ifconfig" != YES ]; then
    529  1.16       pk 				echo
    530  1.16       pk 				echo -n "/mnt/etc/ifconfig.$i missing"
    531  1.16       pk 				echo -n "& ifconfig_$i not set"
    532  1.16       pk 				echo "; interface $i can't be configured"
    533  1.16       pk 			fi
    534  1.16       pk 		done
    535  1.16       pk 		echo "."
    536  1.16       pk 	fi
    537  1.16       pk )
    538  1.16       pk else
    539   1.1       pk (
    540   1.1       pk 	tmp="$IFS"
    541   1.1       pk 	IFS="$IFS."
    542   1.1       pk 	set -- `echo /mnt/etc/hostname*`
    543   1.1       pk 	IFS=$tmp
    544   1.1       pk 	unset tmp
    545   1.1       pk 
    546   1.1       pk 	while [ $# -ge 2 ] ; do
    547   1.1       pk 		shift		# get rid of "hostname"
    548   1.1       pk 		(
    549   1.1       pk 			read af name mask bcaddr extras
    550   1.1       pk 			read dt dtaddr
    551   1.1       pk 
    552   1.1       pk 			if [ ! -n "$name" ]; then
    553   1.1       pk 		    echo "/etc/hostname.$1: invalid network configuration file"
    554   1.1       pk 				exit
    555   1.1       pk 			fi
    556   1.1       pk 
    557   1.1       pk 			cmd="ifconfig $1 $af $name "
    558   1.1       pk 			if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
    559   1.1       pk 			if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
    560   1.1       pk 			if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
    561   1.1       pk 				cmd="$cmd broadcast $bcaddr";
    562   1.1       pk 			fi
    563   1.1       pk 			cmd="$cmd $extras"
    564   1.1       pk 
    565   1.1       pk 			$cmd
    566   1.1       pk 		) < /mnt/etc/hostname.$1
    567   1.1       pk 		shift
    568   1.1       pk 	done
    569   1.1       pk )
    570  1.16       pk fi
    571   1.1       pk 
    572   1.1       pk 	# set the address for the loopback interface
    573   1.1       pk 	ifconfig lo0 inet localhost
    574   1.1       pk 
    575   1.1       pk 	# use loopback, not the wire
    576   1.1       pk 	route add $hostname localhost
    577   1.1       pk 
    578   1.1       pk 	# /etc/mygate, if it exists, contains the name of my gateway host
    579   1.1       pk 	# that name must be in /etc/hosts.
    580   1.1       pk 	if [ -f /mnt/etc/mygate ]; then
    581   1.1       pk 		route delete default > /dev/null 2>&1
    582   1.1       pk 		route add default `cat /mnt/etc/mygate`
    583   1.1       pk 	fi
    584   1.1       pk 
    585   1.1       pk 	# enable the resolver, if appropriate.
    586   1.1       pk 	if [ -f /mnt/etc/resolv.conf ]; then
    587   1.1       pk 		_resolver_enabled="TRUE"
    588   1.1       pk 		cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
    589   1.1       pk 	fi
    590   1.1       pk 
    591   1.1       pk 	# Display results...
    592   1.1       pk 	echo	"Network interface configuration:"
    593   1.1       pk 	ifconfig -a
    594   1.1       pk 
    595   1.1       pk 	echo	""
    596   1.1       pk 
    597   1.1       pk 	if [ "X${_resolver_enabled}" = X"TRUE" ]; then
    598   1.1       pk 		netstat -r
    599   1.1       pk 		echo	""
    600   1.1       pk 		echo	"Resolver enabled."
    601   1.1       pk 	else
    602   1.1       pk 		netstat -rn
    603   1.1       pk 		echo	""
    604   1.1       pk 		echo	"Resolver not enabled."
    605   1.1       pk 	fi
    606   1.1       pk 
    607   1.1       pk 	return 0
    608   1.1       pk }
    609   1.1       pk 
    610   1.1       pk install_ftp() {
    611  1.21      leo 	local	_f
    612  1.21      leo 	local	_sets
    613  1.21      leo 	local	_next
    614  1.21      leo 
    615  1.21      leo 	# Build a script to extract valid files from a list
    616  1.21      leo 	# of filenames on stdin.
    617  1.21      leo 	# XXX : Can we use this on more places? Leo.
    618  1.21      leo 
    619  1.21      leo 	echo "#!/bin/sh" > /tmp/fname_filter.sh
    620  1.21      leo 	echo "while read line; do"	>> /tmp/fname_filter.sh
    621  1.21      leo 	echo "    case \$line in"	>> /tmp/fname_filter.sh
    622  1.21      leo 	for _f in $THESETS; do
    623  1.21      leo 		echo "    $_f.tar.gz|$_f.tgz|$_f.${VERSION}.aa)" \
    624  1.21      leo 					>> /tmp/fname_filter.sh
    625  1.21      leo 		echo '        echo -n "$line ";;' \
    626  1.21      leo 					>> /tmp/fname_filter.sh
    627  1.21      leo 	done
    628  1.21      leo 	echo "        *) ;;"		>> /tmp/fname_filter.sh
    629  1.21      leo 	echo "    esac"			>> /tmp/fname_filter.sh
    630  1.21      leo 	echo "done"			>> /tmp/fname_filter.sh
    631  1.21      leo 
    632   1.1       pk 	# Get several parameters from the user, and create
    633   1.1       pk 	# a shell script that directs the appropriate
    634   1.1       pk 	# commands into ftp.
    635   1.1       pk 	cat << \__install_ftp_1
    636   1.1       pk 
    637   1.1       pk This is an automated ftp-based installation process.  You will be asked
    638   1.1       pk several questions.  The correct set of commands will be placed in a script
    639   1.1       pk that will be fed to ftp(1).
    640   1.1       pk 
    641   1.1       pk __install_ftp_1
    642   1.1       pk 	# Get server IP address
    643   1.1       pk 	resp=""		# force one iteration
    644   1.1       pk 	while [ "X${resp}" = X"" ]; do
    645   1.1       pk 		echo -n "Server IP? [${_ftp_server_ip}] "
    646   1.1       pk 		getresp "${_ftp_server_ip}"
    647   1.1       pk 		_ftp_server_ip=$resp
    648   1.1       pk 	done
    649   1.1       pk 
    650   1.1       pk 	# Get login name
    651   1.1       pk 	resp=""		# force one iteration
    652   1.1       pk 	while [ "X${resp}" = X"" ]; do
    653   1.1       pk 		echo -n "Login? [${_ftp_server_login}] "
    654   1.1       pk 		getresp "${_ftp_server_login}"
    655   1.1       pk 		_ftp_server_login=$resp 
    656   1.1       pk 	done
    657   1.1       pk 
    658   1.1       pk 	# Get password
    659   1.1       pk 	resp=""		# force one iteration
    660   1.1       pk 	while [ "X${resp}" = X"" ]; do
    661  1.16       pk 		echo -n "Password? "
    662  1.16       pk 		stty -echo
    663  1.16       pk 		getresp ""
    664  1.16       pk 		echo ""
    665  1.16       pk 		stty echo
    666   1.1       pk 		_ftp_server_password=$resp
    667   1.1       pk 	done
    668   1.1       pk 
    669   1.1       pk 	cat << \__install_ftp_2
    670   1.1       pk 
    671  1.21      leo You will be asked to enter the name of the directory that contains the
    672  1.21      leo installation sets. When you enter a '?' you will see a listing of the
    673  1.21      leo current directory on the server.
    674  1.21      leo __install_ftp_2
    675  1.21      leo 	_sets=""
    676  1.21      leo 	while [ -z "$_sets" ]
    677  1.21      leo 	do
    678  1.21      leo 		resp=""		# force one iteration
    679  1.21      leo 		while [ "X${resp}" = X"" ]; do
    680  1.21      leo 			echo -n "Server directory? [${_ftp_server_dir}] "
    681  1.21      leo 		    getresp "${_ftp_server_dir}"
    682  1.21      leo 		    if [ "X$resp" = 'X?' -a -z "$_ftp_server_dir" ]; then
    683  1.21      leo 			resp=""
    684  1.21      leo 		    fi
    685  1.21      leo 		done
    686  1.21      leo 		if [ $resp != '?' ]; then
    687  1.21      leo 			_ftp_server_dir=$resp
    688  1.21      leo 		fi
    689  1.21      leo 
    690  1.21      leo 		# Build the basics of an ftp-script...
    691  1.21      leo 		echo "#!/bin/sh" > /tmp/ftp-script.sh
    692  1.21      leo 		echo "cd /mnt" >> /tmp/ftp-script.sh
    693  1.26       is 		echo "ftp -e -i -n $_ftp_server_ip << \__end_commands" >> \
    694  1.21      leo 		    /tmp/ftp-script.sh
    695  1.21      leo 		echo "user $_ftp_server_login $_ftp_server_password" >> \
    696  1.21      leo 		    /tmp/ftp-script.sh
    697  1.21      leo 		echo "bin" >> /tmp/ftp-script.sh
    698  1.21      leo 		echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
    699  1.21      leo 
    700  1.21      leo 		# Make a copy of this script that lists the directory
    701  1.21      leo 		# contents, and use that to determine the files to get.
    702  1.21      leo 		cat /tmp/ftp-script.sh	>  /tmp/ftp-dir.sh
    703  1.21      leo 		echo "ls"		>> /tmp/ftp-dir.sh
    704  1.21      leo 		echo "quit"		>> /tmp/ftp-dir.sh
    705  1.21      leo 		echo "__end_commands"	>> /tmp/ftp-dir.sh
    706  1.21      leo 
    707  1.21      leo 		if [ $resp = '?' ]; then
    708  1.21      leo 			sh /tmp/ftp-dir.sh
    709  1.21      leo 		else
    710  1.21      leo 			_sets=`sh /tmp/ftp-dir.sh | sh /tmp/fname_filter.sh`
    711  1.21      leo 		fi
    712  1.21      leo 	done
    713  1.21      leo 	rm -f /tmp/ftp-dir.sh /tmp/fname_filter.sh
    714  1.21      leo 
    715  1.21      leo 	while : ; do
    716  1.21      leo 		echo "The following sets are available for extraction:"
    717  1.27       is 		echo "(marked sets are already on the extraction list)"
    718  1.21      leo 		echo ""
    719   1.1       pk 
    720  1.21      leo 		_next=""
    721  1.21      leo 		for _f in $_sets ; do
    722  1.21      leo 			if isin $_f $_setsdone; then
    723  1.21      leo 				echo -n "[X] "
    724  1.21      leo 				_next=""
    725  1.21      leo 			else
    726  1.21      leo 				echo -n "    "
    727  1.21      leo 				if [ -z "$_next" ]; then _next=$_f; fi
    728  1.21      leo 			fi
    729  1.21      leo 			echo $_f
    730  1.21      leo 		done
    731  1.21      leo 		echo ""
    732   1.1       pk 
    733  1.21      leo 		# Get name of the file and add extraction command
    734  1.21      leo 		# to the ftp-script.
    735  1.21      leo 		if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
    736  1.21      leo 		echo -n "Continue to add filenames [$resp]? "
    737  1.21      leo 		getresp "$resp"
    738  1.21      leo 		if [ "$resp" = "n" ]; then
    739   1.1       pk 			break
    740   1.1       pk 		fi
    741   1.1       pk 
    742  1.21      leo 		echo -n "File name [$_next]? "
    743  1.21      leo 		getresp "$_next"
    744  1.21      leo 		if isin $resp $_sets; then
    745  1.33      mrg 			echo "get $resp |\"pax -zr${verbose_flag}pe\"" >> \
    746  1.21      leo 					/tmp/ftp-script.sh
    747  1.21      leo 			_setsdone="$resp $_setsdone"
    748  1.21      leo 		else
    749  1.21      leo 			echo "You entered an invalid filename."
    750  1.21      leo 			echo ""
    751  1.21      leo 		fi
    752   1.1       pk 	done
    753   1.1       pk 
    754   1.1       pk 	echo "quit" >> /tmp/ftp-script.sh
    755   1.1       pk 	echo "__end_commands" >> /tmp/ftp-script.sh
    756   1.1       pk 
    757   1.1       pk 	sh /tmp/ftp-script.sh
    758   1.1       pk 	rm -f /tmp/ftp-script.sh
    759   1.1       pk 	echo "Extraction complete."
    760   1.1       pk }
    761   1.1       pk 
    762  1.11       pk install_from_mounted_fs() {
    763  1.13       pk 	# $1 - directory containing installation sets
    764   1.1       pk 	local _filename
    765  1.13       pk 	local _sets
    766  1.12       pk 	local _next
    767  1.29      mrg 	local _all
    768   1.1       pk 	local _f
    769  1.18       is 	local _dirname
    770   1.1       pk 
    771  1.18       is 	_dirname=$1
    772  1.13       pk 	_sets=""
    773  1.20       is 
    774  1.31      sjg 	if ! dir_has_sets ${_dirname} $THESETS
    775  1.31      sjg 	then
    776  1.20       is 
    777  1.18       is 		echo ""
    778  1.31      sjg 		echo "The directory at the mount point, \"${_dirname}\", contains: "
    779  1.18       is 		echo ""
    780  1.18       is 		ls -F ${_dirname}
    781  1.18       is 		echo ""
    782  1.31      sjg 		echo    "Enter the subdirectory relative to the mountpoint, that"
    783  1.31      sjg 		echo -n "contains the savesets: [try this directory] "
    784  1.18       is 		getresp ""
    785  1.31      sjg 		if [ "X${resp}" != "X" ]; then
    786  1.18       is 			_dirname=${_dirname}/$resp
    787  1.18       is 		fi
    788  1.31      sjg 
    789  1.31      sjg 		while ! dir_has_sets ${_dirname} $THESETS; do
    790  1.31      sjg 			echo ""
    791  1.31      sjg 			echo -n "There are no NetBSD install sets available in "
    792  1.31      sjg 			echo "\"${_dirname}\"."
    793  1.31      sjg 			echo "\"${_dirname}\" contains: "
    794  1.31      sjg 			echo ""
    795  1.31      sjg 			ls -F ${_dirname}
    796  1.31      sjg 			echo ""
    797  1.31      sjg 			echo -n "Enter subdirectory: [try other install media] "
    798  1.31      sjg 			getresp ""
    799  1.31      sjg 			if [ "X${resp}" = "X" ]; then
    800  1.31      sjg 				return
    801  1.31      sjg 			fi
    802  1.31      sjg 			if [ ! -d ${_dirname}/${resp} ]; then
    803  1.31      sjg 				echo "\"${resp}\" is no directory; try again."
    804  1.31      sjg 			else
    805  1.31      sjg 				_dirname=${_dirname}/$resp
    806  1.31      sjg 			fi
    807  1.31      sjg 		done
    808  1.31      sjg 	fi
    809  1.18       is 
    810  1.18       is 	for _f in $THESETS ; do
    811  1.18       is 		if [ -f ${_dirname}/${_f}.tar.gz ]; then
    812  1.18       is 			_sets="$_sets ${_f}.tar.gz"
    813  1.18       is 		elif [ -f ${_dirname}/${_f}.tgz ]; then
    814  1.18       is 			_sets="$_sets ${_f}.tgz"
    815  1.18       is 		elif [ -f ${_dirname}/${_f}${VERSION}.aa ]; then
    816  1.18       is 			_sets="$_sets ${_f}${VERSION}"
    817  1.18       is 		fi
    818  1.18       is 	done
    819   1.1       pk 
    820   1.1       pk 	while : ; do
    821   1.1       pk 		echo "The following sets are available for extraction:"
    822   1.1       pk 		echo "(marked sets have already been extracted)"
    823   1.1       pk 		echo ""
    824   1.1       pk 
    825  1.12       pk 		_next=""
    826  1.29      mrg 		_all=""
    827   1.1       pk 		for _f in $_sets ; do
    828   1.1       pk 			if isin $_f $_setsdone; then
    829   1.1       pk 				echo -n "[X] "
    830  1.12       pk 				_next=""
    831   1.1       pk 			else
    832   1.1       pk 				echo -n "    "
    833  1.29      mrg 				if [ -z "$_next" ]; then
    834  1.29      mrg 					_next=$_f;
    835  1.29      mrg 				fi
    836  1.29      mrg 				_all="$_all $_f"
    837   1.1       pk 			fi
    838   1.1       pk 			echo $_f
    839   1.1       pk 		done
    840   1.1       pk 		echo ""
    841   1.1       pk 
    842   1.1       pk 		# Get the name of the file.
    843  1.33      mrg 		if [ "X$_next" = "X" ]; then
    844  1.33      mrg 			resp=n
    845  1.33      mrg 		else
    846  1.33      mrg 			resp=y
    847  1.33      mrg 		fi
    848   1.1       pk 		echo -n "Continue extraction [$resp]?"
    849   1.1       pk 		getresp "$resp"
    850   1.1       pk 		if [ "$resp" = "n" ]; then
    851   1.1       pk 			break
    852   1.1       pk 		fi
    853   1.1       pk 
    854  1.29      mrg 		echo -n "File name(s) (or "all") [$_next]? "
    855  1.12       pk 		getresp "$_next"
    856  1.29      mrg 		if [ "x$resp" = xall ]; then
    857  1.29      mrg 			resp="$_all"
    858  1.29      mrg 		fi
    859  1.29      mrg 
    860  1.29      mrg 		for _f in $resp; do
    861  1.29      mrg 			_filename="/${_dirname}/$_f"
    862   1.1       pk 
    863  1.29      mrg 			# Ensure file exists
    864  1.29      mrg 			if [ ! -f $_filename ]; then
    865  1.29      mrg 				if [ -f ${_filename}.aa ]; then
    866  1.29      mrg 					_filename=${_filename}.\?\?
    867  1.29      mrg 				else
    868  1.18       is 			 echo "File $_filename does not exist.  Check to make"
    869  1.18       is 			 echo "sure you entered the information properly."
    870  1.29      mrg 			 continue 2
    871  1.29      mrg 				fi
    872  1.18       is 			fi
    873   1.1       pk 
    874  1.29      mrg 			# Extract file
    875  1.29      mrg 			echo "Extracting the $_f set:"
    876  1.33      mrg 			cat $_filename | (cd /mnt; pax -zr${verbose_flag}pe)
    877  1.29      mrg 			echo "Extraction complete."
    878  1.29      mrg 			_setsdone="$_f $_setsdone"
    879  1.29      mrg 		done
    880   1.1       pk 
    881   1.1       pk 	done
    882   1.1       pk }
    883   1.1       pk 
    884   1.1       pk install_cdrom() {
    885   1.5       pk 	local _drive
    886   1.6      leo 	local _partition_range
    887   1.5       pk 	local _partition
    888   1.5       pk 	local _fstype
    889   1.5       pk 	local _directory
    890   1.5       pk 
    891   1.1       pk 	# Get the cdrom device info
    892   1.1       pk 	cat << \__install_cdrom_1
    893   1.1       pk 
    894   1.1       pk The following CD-ROM devices are installed on your system; please select
    895   1.6      leo the CD-ROM device containing the partition with the installation sets:
    896   1.1       pk 
    897   1.1       pk __install_cdrom_1
    898   1.1       pk 	_CDDEVS=`md_get_cddevs`
    899   1.1       pk 	echo    "$_CDDEVS"
    900   1.1       pk 	echo	""
    901   1.1       pk 	echo -n	"Which is the CD-ROM with the installation media? [abort] "
    902   1.1       pk 	getresp "abort"
    903   1.1       pk 	case "$resp" in
    904   1.1       pk 		abort)
    905   1.1       pk 			echo "Aborting."
    906   1.1       pk 			return
    907   1.1       pk 			;;
    908   1.1       pk 
    909   1.1       pk 		*)
    910   1.1       pk 			if isin $resp $_CDDEVS ; then
    911   1.5       pk 				_drive=$resp
    912   1.1       pk 			else
    913   1.1       pk 				echo ""
    914   1.1       pk 				echo "The CD-ROM $resp does not exist."
    915   1.1       pk 				echo "Aborting."
    916   1.1       pk 				return
    917   1.1       pk 			fi
    918   1.1       pk 			;;
    919   1.1       pk 	esac
    920   1.1       pk 
    921   1.1       pk 	# Get partition
    922   1.6      leo 	_partition_range=`md_get_partition_range`
    923   1.1       pk 	resp=""		# force one iteration
    924   1.1       pk 	while [ "X${resp}" = X"" ]; do
    925  1.17       is 		echo -n "Partition? [a] "
    926  1.17       is 		getresp "a"
    927   1.1       pk 		case "$resp" in
    928   1.6      leo 			$_partition_range)
    929   1.5       pk 				_partition=$resp
    930   1.1       pk 				;;
    931   1.1       pk 
    932   1.1       pk 			*)
    933   1.1       pk 				echo "Invalid response: $resp"
    934   1.1       pk 				resp=""		# force loop to repeat
    935   1.1       pk 				;;
    936   1.1       pk 		esac
    937   1.1       pk 	done
    938   1.1       pk 
    939   1.1       pk 	# Ask for filesystem type
    940   1.1       pk 	cat << \__install_cdrom_2
    941   1.1       pk 
    942   1.1       pk There are two CD-ROM filesystem types currently supported by this program:
    943   1.1       pk 	1) ISO-9660 (cd9660)
    944   1.1       pk 	2) Berkeley Fast Filesystem (ffs)
    945   1.1       pk 
    946   1.1       pk __install_cdrom_2
    947   1.1       pk 	resp=""		# force one iteration
    948   1.1       pk 	while [ "X${resp}" = X"" ]; do
    949   1.1       pk 		echo -n "Which filesystem type? [cd9660] "
    950   1.1       pk 		getresp "cd9660"
    951   1.1       pk 		case "$resp" in
    952   1.1       pk 			cd9660|ffs)
    953   1.5       pk 				_fstype=$resp
    954   1.1       pk 				;;
    955   1.1       pk 
    956   1.1       pk 			*)
    957   1.1       pk 				echo "Invalid response: $resp"
    958   1.1       pk 				resp=""		# force loop to repeat
    959   1.1       pk 				;;
    960   1.1       pk 		esac
    961   1.1       pk 	done
    962   1.1       pk 
    963   1.1       pk 	# Mount the CD-ROM
    964  1.17       is 	if ! mount -t ${_fstype} -o ro \
    965   1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    966   1.1       pk 		echo "Cannot mount CD-ROM drive.  Aborting."
    967   1.1       pk 		return
    968   1.1       pk 	fi
    969   1.1       pk 
    970  1.20       is 	install_from_mounted_fs /mnt2
    971   1.5       pk 	umount -f /mnt2 > /dev/null 2>&1
    972   1.5       pk }
    973   1.5       pk 
    974  1.14      leo mount_a_disk() {
    975  1.14      leo 	# Mount a disk on /mnt2. The set of disk devices to choose from
    976  1.14      leo 	# is $_DKDEVS.
    977  1.14      leo 	# returns 0 on failure.
    978  1.14      leo 
    979   1.5       pk 	local _drive
    980   1.6      leo 	local _partition_range
    981   1.5       pk 	local _partition
    982   1.5       pk 	local _fstype
    983   1.5       pk 	local _fsopts
    984   1.5       pk 	local _directory
    985   1.5       pk 	local _md_fstype
    986   1.5       pk 	local _md_fsopts
    987   1.5       pk 
    988   1.5       pk 	getresp "abort"
    989   1.5       pk 	case "$resp" in
    990   1.5       pk 		abort)
    991   1.5       pk 			echo "Aborting."
    992  1.14      leo 			return 0
    993   1.5       pk 			;;
    994   1.5       pk 
    995   1.5       pk 		*)
    996   1.5       pk 			if isin $resp $_DKDEVS ; then
    997   1.5       pk 				_drive=$resp
    998   1.5       pk 			else
    999   1.5       pk 				echo ""
   1000   1.5       pk 				echo "The disk $resp does not exist."
   1001   1.5       pk 				echo "Aborting."
   1002  1.14      leo 				return 0
   1003   1.5       pk 			fi
   1004   1.5       pk 			;;
   1005   1.5       pk 	esac
   1006   1.5       pk 
   1007   1.5       pk 	# Get partition
   1008   1.6      leo 	_partition_range=`md_get_partition_range`
   1009   1.5       pk 	resp=""		# force one iteration
   1010   1.5       pk 	while [ "X${resp}" = X"" ]; do
   1011   1.5       pk 		echo -n "Partition? [d] "
   1012   1.5       pk 		getresp "d"
   1013   1.5       pk 		case "$resp" in
   1014   1.6      leo 			$_partition_range)
   1015   1.5       pk 				_partition=$resp
   1016   1.5       pk 				;;
   1017   1.5       pk 
   1018   1.5       pk 			*)
   1019   1.5       pk 				echo "Invalid response: $resp"
   1020   1.5       pk 				resp=""		# force loop to repeat
   1021   1.5       pk 				;;
   1022   1.5       pk 		esac
   1023   1.5       pk 	done
   1024   1.5       pk 
   1025   1.5       pk 	# Ask for filesystem type
   1026  1.14      leo 	cat << \__mount_a_disk_2
   1027   1.5       pk 
   1028   1.5       pk The following filesystem types are supported:
   1029   1.5       pk 	1) ffs
   1030  1.14      leo __mount_a_disk_2
   1031   1.5       pk 	_md_fstype=`md_native_fstype`
   1032   1.5       pk 	_md_fsopts=`md_native_fsopts`
   1033   1.5       pk 	if [ ! -z "$_md_fstype" ]; then
   1034   1.5       pk 		echo "	2) $_md_fstype"
   1035   1.5       pk 	else
   1036   1.5       pk 		_md_fstype="_undefined_"
   1037   1.5       pk 	fi
   1038   1.5       pk 	resp=""		# force one iteration
   1039   1.5       pk 	while [ "X${resp}" = X"" ]; do
   1040   1.5       pk 		echo -n "Which filesystem type? [ffs] "
   1041   1.5       pk 		getresp "ffs"
   1042   1.5       pk 		case "$resp" in
   1043   1.5       pk 			ffs)
   1044   1.5       pk 				_fstype=$resp
   1045   1.5       pk 				_fsopts="ro"
   1046   1.5       pk 				;;
   1047   1.5       pk 			$_md_fstype)
   1048   1.5       pk 				_fstype=$resp
   1049   1.5       pk 				_fsopts=$_md_fsopts
   1050   1.5       pk 				;;
   1051   1.5       pk 			*)
   1052   1.5       pk 				echo "Invalid response: $resp"
   1053   1.5       pk 				resp=""		# force loop to repeat
   1054   1.5       pk 				;;
   1055   1.5       pk 		esac
   1056   1.5       pk 	done
   1057   1.5       pk 
   1058   1.5       pk 	# Mount the disk
   1059   1.5       pk 	if ! mount -t ${_fstype} -o $_fsopts \
   1060   1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
   1061   1.5       pk 		echo "Cannot mount disk.  Aborting."
   1062  1.14      leo 		return 0
   1063  1.14      leo 	fi
   1064  1.14      leo 	return 1
   1065  1.14      leo }
   1066  1.14      leo 
   1067  1.14      leo install_disk() {
   1068  1.14      leo 	local _directory
   1069  1.14      leo 
   1070  1.14      leo 	cat << \__install_disk_1
   1071  1.14      leo 
   1072  1.30      mrg Ok, lets install from a disk.  The file-system the install sets on may
   1073  1.30      mrg already mounted, or we might have to mount the filesystem to get to it.
   1074  1.30      mrg 
   1075  1.30      mrg __install_disk_1
   1076  1.30      mrg 
   1077  1.30      mrg 	echo -n "Is the file-system with the install sets already mounted? [n] "
   1078  1.30      mrg 	getresp "n"
   1079  1.30      mrg 	case $resp in
   1080  1.30      mrg 	y*|Y*)
   1081  1.30      mrg 		echo "What mount point are the sets located in? [] "
   1082  1.30      mrg 		getresp ""
   1083  1.30      mrg 		if [ -d "$resp" ]; then
   1084  1.30      mrg 			install_from_mounted_fs $resp
   1085  1.30      mrg 		else
   1086  1.30      mrg 			echo "$resp: Not a directory, aborting..."
   1087  1.30      mrg 		fi
   1088  1.30      mrg 		return
   1089  1.30      mrg 		;;
   1090  1.30      mrg 	*)
   1091  1.30      mrg 		;;
   1092  1.30      mrg 	esac
   1093  1.30      mrg 
   1094  1.30      mrg 	cat << \__install_disk_2
   1095  1.30      mrg 
   1096  1.14      leo The following disk devices are installed on your system; please select
   1097  1.14      leo the disk device containing the partition with the installation sets:
   1098  1.14      leo 
   1099  1.30      mrg __install_disk_2
   1100  1.14      leo 	_DKDEVS=`md_get_diskdevs`
   1101  1.14      leo 	echo    "$_DKDEVS"
   1102  1.14      leo 	echo	""
   1103  1.14      leo 	echo -n	"Which is the disk with the installation sets? [abort] "
   1104  1.14      leo 
   1105  1.14      leo 	if mount_a_disk ; then
   1106   1.5       pk 		return
   1107   1.5       pk 	fi
   1108   1.5       pk 
   1109  1.20       is 	install_from_mounted_fs /mnt2
   1110   1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
   1111   1.1       pk }
   1112   1.1       pk 
   1113   1.1       pk install_nfs() {
   1114   1.1       pk 	# Get the IP address of the server
   1115   1.1       pk 	resp=""		# force one iteration
   1116   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1117   1.1       pk 		echo -n "Server IP address? [${_nfs_server_ip}] "
   1118   1.1       pk 		getresp "${_nfs_server_ip}"
   1119   1.1       pk 	done
   1120   1.1       pk 	_nfs_server_ip=$resp
   1121   1.1       pk 
   1122   1.1       pk 	# Get server path to mount
   1123   1.1       pk 	resp=""		# force one iteration
   1124   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1125   1.1       pk 		echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
   1126   1.1       pk 		getresp "${_nfs_server_path}"
   1127   1.1       pk 	done
   1128   1.1       pk 	_nfs_server_path=$resp
   1129   1.1       pk 
   1130   1.1       pk 	# Determine use of TCP
   1131   1.1       pk 	echo -n "Use TCP transport (only works with capable NFS server)? [n] "
   1132   1.1       pk 	getresp "n"
   1133   1.1       pk 	case "$resp" in
   1134   1.1       pk 		y*|Y*)
   1135   1.1       pk 			_nfs_tcp="-T"
   1136   1.1       pk 			;;
   1137   1.1       pk 
   1138   1.1       pk 		*)
   1139   1.1       pk 			_nfs_tcp=""
   1140   1.1       pk 			;;
   1141   1.1       pk 	esac
   1142   1.1       pk 
   1143   1.1       pk 	# Mount the server
   1144   1.1       pk 	mkdir /mnt2 > /dev/null 2>&1
   1145   1.1       pk 	if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
   1146   1.1       pk 	    /mnt2 ; then
   1147   1.1       pk 		echo "Cannot mount NFS server.  Aborting."
   1148   1.1       pk 		return
   1149   1.1       pk 	fi
   1150   1.1       pk 
   1151  1.20       is 	install_from_mounted_fs /mnt2
   1152   1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
   1153   1.1       pk }
   1154   1.1       pk 
   1155   1.1       pk install_tape() {
   1156  1.11       pk 	local _xcmd
   1157  1.11       pk 
   1158   1.1       pk 	# Get the name of the tape from the user.
   1159   1.1       pk 	cat << \__install_tape_1
   1160   1.1       pk 
   1161   1.1       pk The installation program needs to know which tape device to use.  Make
   1162   1.1       pk sure you use a "no rewind on close" device.
   1163   1.1       pk 
   1164   1.1       pk __install_tape_1
   1165   1.1       pk 	_tape=`basename $TAPE`
   1166   1.1       pk 	resp=""		# force one iteration
   1167   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1168   1.1       pk 		echo -n "Name of tape device? [${_tape}]"
   1169   1.1       pk 		getresp "${_tape}"
   1170   1.1       pk 	done
   1171   1.1       pk 	_tape=`basename $resp`
   1172   1.1       pk 	TAPE="/dev/${_tape}"
   1173   1.1       pk 	if [ ! -c $TAPE ]; then
   1174   1.1       pk 		echo "$TAPE does not exist or is not a character special file."
   1175   1.1       pk 		echo "Aborting."
   1176   1.1       pk 		return
   1177   1.1       pk 	fi
   1178   1.1       pk 	export TAPE
   1179   1.1       pk 
   1180   1.1       pk 	# Rewind the tape device
   1181   1.1       pk 	echo -n "Rewinding tape..."
   1182   1.1       pk 	if ! mt rewind ; then
   1183   1.1       pk 		echo "$TAPE may not be attached to the system or may not be"
   1184   1.1       pk 		echo "a tape device.  Aborting."
   1185   1.1       pk 		return
   1186   1.1       pk 	fi
   1187   1.1       pk 	echo "done."
   1188   1.1       pk 
   1189   1.1       pk 	# Get the file number
   1190   1.1       pk 	resp=""		# force one iteration
   1191   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1192   1.1       pk 		echo -n "File number? "
   1193   1.1       pk 		getresp ""
   1194   1.1       pk 		case "$resp" in
   1195   1.1       pk 			[1-9]*)
   1196   1.1       pk 				_nskip=`expr $resp - 1`
   1197   1.1       pk 				;;
   1198   1.1       pk 
   1199   1.1       pk 			*)
   1200   1.1       pk 				echo "Invalid file number ${resp}."
   1201   1.1       pk 				resp=""		# fore loop to repeat
   1202   1.1       pk 				;;
   1203   1.1       pk 		esac
   1204   1.1       pk 	done
   1205   1.1       pk 
   1206   1.1       pk 	# Skip to correct file.
   1207   1.1       pk 	echo -n "Skipping to source file..."
   1208   1.1       pk 	if [ "X${_nskip}" != X"0" ]; then
   1209   1.1       pk 		if ! mt fsf $_nskip ; then
   1210   1.1       pk 			echo "Could not skip $_nskip files.  Aborting."
   1211   1.1       pk 			return
   1212   1.1       pk 		fi
   1213   1.1       pk 	fi
   1214   1.1       pk 	echo "done."
   1215   1.1       pk 
   1216   1.1       pk 	cat << \__install_tape_2
   1217   1.1       pk 
   1218   1.1       pk There are 2 different ways the file can be stored on tape:
   1219   1.1       pk 
   1220   1.1       pk 	1) an image of a gzipped tar file
   1221   1.1       pk 	2) a standard tar image
   1222   1.1       pk 
   1223   1.1       pk __install_tape_2
   1224   1.1       pk 	resp=""		# force one iteration
   1225   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1226   1.1       pk 		echo -n "Which way is it? [1] "
   1227   1.1       pk 		getresp "1"
   1228   1.1       pk 		case "$resp" in
   1229  1.11       pk 		1)
   1230  1.33      mrg 			_xcmd="pax -zr${verbose_flag}pe"
   1231  1.11       pk 			;;
   1232   1.1       pk 
   1233  1.11       pk 		2)
   1234  1.33      mrg 			_xcmd="pax -r${verbose_flag}pe"
   1235  1.11       pk 			;;
   1236   1.1       pk 
   1237  1.11       pk 		*)
   1238  1.11       pk 			echo "Invalid response: $resp."
   1239  1.11       pk 			resp=""		# force loop to repeat
   1240  1.11       pk 			;;
   1241   1.1       pk 		esac
   1242  1.11       pk 		( cd /mnt; dd if=$TAPE | $_xcmd )
   1243   1.1       pk 	done
   1244   1.1       pk 	echo "Extraction complete."
   1245   1.1       pk }
   1246   1.1       pk 
   1247   1.1       pk get_timezone() {
   1248   1.1       pk 	local _a
   1249   1.6      leo 	local _zonepath
   1250   1.6      leo 
   1251   1.6      leo 	#
   1252   1.6      leo 	# If the zoneinfo is not on the installation medium or on the
   1253   1.6      leo 	# installed filesystem, set TZ to GMT and return immediatly.
   1254   1.6      leo 	#
   1255   1.9       pk 	if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
   1256   1.6      leo 		TZ=GMT
   1257   1.6      leo 		return
   1258   1.6      leo 	fi
   1259   1.6      leo 	if [ ! -d /usr/share/zoneinfo ]; then
   1260   1.6      leo 		_zonepath=/mnt
   1261   1.6      leo 	else
   1262   1.6      leo 		_zonepath=""
   1263   1.6      leo 	fi
   1264   1.6      leo 		
   1265   1.1       pk cat << \__get_timezone_1
   1266   1.1       pk 
   1267   1.1       pk Select a time zone for your location. Timezones are represented on the
   1268   1.1       pk system by a directory structure rooted in "/usr/share/timezone". Most
   1269   1.1       pk timezones can be selected by entering a token like "MET" or "GMT-6".
   1270   1.1       pk Other zones are grouped by continent, with detailed zone information
   1271   1.1       pk separated by a slash ("/"), e.g. "US/Pacific".
   1272   1.1       pk 
   1273   1.1       pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
   1274   1.1       pk at the prompts below.
   1275   1.1       pk 
   1276   1.1       pk __get_timezone_1
   1277   1.1       pk 	if [ X$TZ = X ]; then
   1278  1.13       pk 		TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast`
   1279   1.3       pk 		TZ=${TZ#/usr/share/zoneinfo/}
   1280   1.1       pk 	fi
   1281   1.1       pk 	while :; do
   1282   1.1       pk 		echo -n	"What timezone are you in [\`?' for list] [$TZ]? "
   1283   1.1       pk 		getresp "$TZ"
   1284   1.1       pk 		case "$resp" in
   1285   1.1       pk 		"")
   1286   1.1       pk 			echo "Timezone defaults to GMT"
   1287   1.1       pk 			TZ="GMT"
   1288   1.1       pk 			break;
   1289   1.1       pk 			;;
   1290   1.1       pk 		"?")
   1291   1.6      leo 			ls ${_zonepath}/usr/share/zoneinfo
   1292   1.1       pk 			;;
   1293   1.1       pk 		*)
   1294   1.1       pk 			_a=$resp
   1295   1.6      leo 			while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
   1296   1.1       pk 				echo -n "There are several timezones available"
   1297   1.1       pk 				echo " within zone '$_a'"
   1298   1.1       pk 				echo -n "Select a sub-timezone [\`?' for list]: "
   1299   1.1       pk 				getresp ""
   1300   1.1       pk 				case "$resp" in
   1301   1.6      leo 				"?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;;
   1302   1.1       pk 				*)	_a=${_a}/${resp}
   1303   1.6      leo 					if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1304   1.1       pk 						break;
   1305   1.1       pk 					fi
   1306   1.1       pk 					;;
   1307   1.1       pk 				esac
   1308   1.1       pk 			done
   1309   1.6      leo 			if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1310   1.1       pk 				TZ="$_a"
   1311   1.1       pk 				echo "You have selected timezone \"$_a\"".
   1312   1.1       pk 				break 2
   1313   1.1       pk 			fi
   1314   1.1       pk 			echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
   1315   1.1       pk 			;;
   1316   1.1       pk 		esac
   1317   1.1       pk 	done
   1318   1.1       pk }
   1319   1.1       pk 
   1320   1.1       pk install_sets()
   1321   1.1       pk {
   1322  1.13       pk 	local _yup
   1323  1.13       pk 	_yup="FALSE"
   1324  1.13       pk 
   1325  1.13       pk 	# Ask the user which media to load the distribution from.
   1326  1.33      mrg 	# Ask the user if they want verbose extraction.  They might not want
   1327  1.33      mrg 	# it on, eg, SPARC frame buffer console.
   1328  1.13       pk 	cat << \__install_sets_1
   1329   1.1       pk 
   1330   1.1       pk It is now time to extract the installation sets onto the hard disk.
   1331  1.10  thorpej Make sure the sets are either on a local device (i.e. tape, CD-ROM) or on a
   1332   1.1       pk network server.
   1333   1.1       pk 
   1334  1.33      mrg Would you like to see each file listed during extraction (verbose) mode?
   1335  1.33      mrg On some console hardware, such as serial consoles and Sun frame buffers,
   1336  1.33      mrg this can extend the total extraction time.
   1337   1.1       pk __install_sets_1
   1338  1.33      mrg 	echo -n "Use verbose listing for extractions? [y] "
   1339  1.33      mrg 	getresp "y"
   1340  1.33      mrg 	case "$resp" in
   1341  1.33      mrg 	y*|Y*)
   1342  1.33      mrg 		verbose_flag=v
   1343  1.33      mrg 		;;
   1344  1.33      mrg 	*)
   1345  1.33      mrg 		echo "Not using verbose listing.."
   1346  1.33      mrg 		verbose_flag=""
   1347  1.33      mrg 		;;
   1348  1.33      mrg 	esac
   1349  1.13       pk 
   1350  1.31      sjg 	if [ -d ${Default_sets_dir:-/dev/null} ]; then
   1351  1.31      sjg 		if dir_has_sets $Default_sets_dir $THESETS; then
   1352  1.31      sjg 			local_sets_dir=$Default_sets_dir
   1353  1.31      sjg 		fi
   1354  1.31      sjg 	fi
   1355  1.13       pk 	if [ "X$local_sets_dir" != "X" ]; then
   1356  1.13       pk 		install_from_mounted_fs ${local_sets_dir}
   1357  1.13       pk 		if [ X"$_setsdone" != X ]; then
   1358  1.13       pk 			_yup="TRUE"
   1359  1.13       pk 		fi
   1360  1.13       pk 	fi
   1361  1.13       pk 
   1362  1.13       pk 	# Go on prodding for alternate locations
   1363  1.13       pk 	resp=""		# force at least one iteration
   1364  1.13       pk 	while [ X"${resp}" = X ]; do
   1365  1.13       pk 		# If _yup is not FALSE, it means that we extracted sets above.
   1366  1.13       pk 		# If that's the case, bypass the menu the first time.
   1367  1.13       pk 		if [ X"$_yup" = X"FALSE" ]; then
   1368  1.13       pk 			echo -n	"Install from (f)tp, (t)ape, (C)D-ROM, (N)FS"
   1369  1.13       pk 			echo -n " or local (d)isk? "
   1370  1.13       pk 			getresp ""
   1371   1.1       pk 			case "$resp" in
   1372  1.13       pk 			d*|D*)
   1373  1.13       pk 				install_disk
   1374  1.13       pk 				;;
   1375  1.13       pk 			f*|F*)
   1376  1.13       pk 				install_ftp
   1377  1.13       pk 				;;
   1378  1.13       pk 			t*|T*)
   1379  1.13       pk 				install_tape
   1380  1.13       pk 				;;
   1381  1.13       pk 			c*|C*)
   1382  1.13       pk 				install_cdrom
   1383  1.13       pk 				;;
   1384  1.13       pk 			n*|N*)
   1385  1.13       pk 				install_nfs
   1386   1.1       pk 				;;
   1387   1.1       pk 			*)
   1388  1.13       pk 				echo "Invalid response: $resp"
   1389  1.13       pk 				resp=""
   1390   1.1       pk 				;;
   1391   1.1       pk 			esac
   1392  1.13       pk 		else
   1393  1.13       pk 			_yup="FALSE"	# So we'll ask next time
   1394  1.13       pk 		fi
   1395   1.1       pk 
   1396  1.13       pk 		# Give the user the opportunity to extract more sets. They
   1397  1.13       pk 		# don't necessarily have to come from the same media.
   1398  1.13       pk 		echo	""
   1399  1.13       pk 		echo -n	"Extract more sets? [n] "
   1400  1.13       pk 		getresp "n"
   1401   1.1       pk 		case "$resp" in
   1402  1.13       pk 		y*|Y*)
   1403  1.13       pk 			# Force loop to repeat
   1404  1.13       pk 			resp=""
   1405   1.1       pk 			;;
   1406   1.1       pk 
   1407   1.1       pk 		*)
   1408   1.1       pk 			;;
   1409   1.1       pk 		esac
   1410  1.13       pk 	done
   1411   1.1       pk }
   1412   1.1       pk 
   1413   1.1       pk munge_fstab()
   1414   1.1       pk {
   1415   1.1       pk 	local _fstab
   1416   1.1       pk 	local _fstab_shadow
   1417   1.5       pk 	local _dev
   1418   1.5       pk 	local _mp
   1419   1.7      leo 	local _fstype
   1420   1.5       pk 	local _rest
   1421   1.6      leo 
   1422   1.1       pk 	# Now that the 'real' fstab is configured, we munge it into a 'shadow'
   1423   1.1       pk 	# fstab which we'll use for mounting and unmounting all of the target
   1424   1.1       pk 	# filesystems relative to /mnt.  Mount all filesystems.
   1425   1.1       pk 	_fstab=$1
   1426   1.1       pk 	_fstab_shadow=$2
   1427   1.7      leo 	( while read _dev _mp _fstype _rest; do
   1428   1.7      leo 		# Skip comment lines
   1429   1.7      leo 		case "$_dev" in
   1430   1.7      leo 			\#*)	continue;;
   1431   1.7      leo 			*)	;;
   1432   1.7      leo 		esac
   1433   1.7      leo 		# and some filesystem types (like there are swap,kernfs,...)
   1434   1.7      leo 		case "$_fstype" in
   1435   1.7      leo 			ffs|ufs|nfs)	;;
   1436   1.7      leo 			*)	continue;;
   1437   1.7      leo 		esac
   1438   1.3       pk 		if [ "$_mp" = "/" ]; then
   1439   1.8       pk 			echo $_dev /mnt $_fstype $_rest
   1440   1.1       pk 		else
   1441   1.8       pk 			echo $_dev /mnt$_mp $_fstype $_rest
   1442   1.3       pk 		fi
   1443   1.6      leo 	    done ) < $_fstab > $_fstab_shadow
   1444   1.1       pk }
   1445   1.1       pk 
   1446   1.1       pk mount_fs()
   1447   1.1       pk {
   1448   1.1       pk 	# Must mount filesystems manually, one at a time, so we can make
   1449   1.1       pk 	# sure the mount points exist.
   1450   1.1       pk 	# $1 is a file in fstab format
   1451   1.1       pk 	local _fstab
   1452   1.1       pk 
   1453   1.1       pk 	_fstab=$1
   1454   1.1       pk 
   1455   1.1       pk 	( while read line; do
   1456   1.4       pk 		set -- $line
   1457   1.4       pk 		_dev=$1
   1458   1.4       pk 		_mp=$2
   1459   1.4       pk 		_fstype=$3
   1460   1.4       pk 		_opt=$4
   1461   1.1       pk 
   1462   1.1       pk 		# If not the root filesystem, make sure the mount
   1463   1.1       pk 		# point is present.
   1464   1.1       pk 		if [ "X{$_mp}" != X"/mnt" ]; then
   1465   1.1       pk 			mkdir -p $_mp
   1466   1.1       pk 		fi
   1467   1.1       pk 
   1468   1.1       pk 		# Mount the filesystem.  If the mount fails, exit
   1469   1.1       pk 		# with an error condition to tell the outer
   1470   1.1       pk 		# later to bail.
   1471  1.29      mrg 		if ! mount -v -t $_fstype -o async -o $_opt $_dev $_mp ; then
   1472   1.1       pk 			# error message displated by mount
   1473   1.1       pk 			exit 1
   1474   1.1       pk 		fi
   1475   1.1       pk 	done ) < $_fstab
   1476   1.1       pk 
   1477   1.1       pk 	if [ "X${?}" != X"0" ]; then
   1478   1.1       pk 		cat << \__mount_filesystems_1
   1479   1.1       pk 
   1480   1.1       pk FATAL ERROR:  Cannot mount filesystems.  Double-check your configuration
   1481   1.1       pk and restart the installation process.
   1482   1.1       pk __mount_filesystems_1
   1483   1.1       pk 		exit
   1484   1.1       pk 	fi
   1485   1.1       pk }
   1486   1.1       pk 
   1487   1.1       pk unmount_fs()
   1488   1.1       pk {
   1489   1.1       pk 	# Unmount all filesystems and check their integrity.
   1490  1.13       pk 	# Usage: [-fast] <fstab file>
   1491  1.13       pk 	local _fast
   1492   1.1       pk 	local _fstab
   1493  1.13       pk 	local _pid
   1494  1.13       pk 
   1495  1.13       pk 	if [ "$1" = "-fast" ]; then
   1496  1.13       pk 		_fast=1
   1497  1.13       pk 		_fstab=$2
   1498  1.13       pk 	else
   1499  1.13       pk 		_fast=0
   1500  1.13       pk 		_fstab=$1
   1501  1.13       pk 	fi
   1502   1.1       pk 
   1503  1.13       pk 	if [ ! \( -f $_fstab -a -s $_fstab \) ]; then
   1504  1.13       pk 		echo "fstab empty" > /dev/tty
   1505  1.13       pk 		return
   1506  1.13       pk 	fi
   1507   1.1       pk 
   1508  1.13       pk 	if [ $_fast = 0 ]; then
   1509  1.13       pk 		echo -n	"Syncing disks..."
   1510  1.13       pk 		_pid=`twiddle`
   1511  1.13       pk 		sync; sleep 4; sync; sleep 2; sync; sleep 2
   1512  1.13       pk 		kill $_pid
   1513  1.13       pk 		echo	"done."
   1514  1.13       pk 	fi
   1515   1.1       pk 
   1516   1.1       pk 	(
   1517   1.1       pk 		_devs=""
   1518   1.1       pk 		_mps=""
   1519   1.1       pk 		# maintain reverse order
   1520   1.1       pk 		while read line; do
   1521   1.3       pk 			set -- $line
   1522   1.3       pk 			_devs="$1 ${_devs}"
   1523   1.3       pk 			_mps="$2 ${_mps}"
   1524   1.1       pk 		done
   1525   1.1       pk 		echo -n "Umounting filesystems... "
   1526   1.1       pk 		for _mp in ${_mps}; do
   1527   1.1       pk 			echo -n "${_mp} "
   1528   1.1       pk 			umount ${_mp}
   1529   1.1       pk 		done
   1530   1.1       pk 		echo "Done."
   1531   1.1       pk 
   1532  1.13       pk 		if [ $_fast = 0 ]; then
   1533  1.13       pk 			exit
   1534  1.13       pk 		fi
   1535   1.1       pk 		echo "Checking filesystem integrity..."
   1536   1.1       pk 		for _dev in ${_devs}; do
   1537   1.1       pk 			echo  "${_dev}"
   1538   1.1       pk 			fsck -f ${_dev}
   1539   1.1       pk 		done
   1540   1.1       pk 		echo "Done."
   1541   1.1       pk 	) < $_fstab
   1542   1.1       pk }
   1543   1.1       pk 
   1544   1.1       pk check_fs()
   1545   1.1       pk {
   1546   1.1       pk 	# Check filesystem integrity.
   1547   1.1       pk 	# $1 is a file in fstab format
   1548   1.1       pk 	local _fstab
   1549   1.1       pk 
   1550   1.1       pk 	_fstab=$1
   1551   1.1       pk 
   1552   1.1       pk 	(
   1553   1.1       pk 		_devs=""
   1554   1.1       pk 		_mps=""
   1555   1.1       pk 		while read line; do
   1556   1.3       pk 			set -- $line
   1557   1.3       pk 			_devs="$1 ${_devs}"
   1558   1.3       pk 			_mps="$2 ${_mps}"
   1559   1.1       pk 		done
   1560   1.1       pk 
   1561   1.1       pk 		echo "Checking filesystem integrity..."
   1562   1.1       pk 		for _dev in ${_devs}; do
   1563   1.1       pk 			echo  "${_dev}"
   1564   1.1       pk 			fsck -f ${_dev}
   1565   1.1       pk 		done
   1566   1.1       pk 		echo "Done."
   1567   1.1       pk 	) < $_fstab
   1568   1.1       pk }
   1569