Home | History | Annotate | Line # | Download | only in miniroot
install.sub revision 1.26
      1   1.1       pk #!/bin/sh
      2  1.26       is #	$NetBSD: install.sub,v 1.26 1999/04/26 10:50:44 is 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.13       pk 	    echo -n "Enter the pathname where the sets are stored [$_dir] "
    191  1.13       pk 	    getresp "$_dir"
    192  1.13       pk 	    _dir=$resp
    193  1.13       pk 
    194  1.13       pk 	    # Allow break-out with empty response
    195  1.13       pk 	    if [ -z "$_dir" ]; then
    196  1.13       pk 		echo -n "Are you sure you don't want to set the pathname? [n] "
    197  1.13       pk 		getresp "n"
    198  1.13       pk 		case "$resp" in
    199  1.13       pk 			y*|Y*)
    200  1.13       pk 				break
    201  1.13       pk 				;;
    202  1.13       pk 			*)
    203  1.13       pk 				continue
    204  1.13       pk 				;;
    205  1.13       pk 		esac
    206  1.13       pk 	    fi
    207  1.13       pk 
    208  1.13       pk 	    if dir_has_sets "$_mp/$_dir" $THESETS
    209  1.13       pk 	    then
    210  1.13       pk 		local_sets_dir="$_mp/$_dir"
    211  1.13       pk 		break
    212  1.13       pk 	    else
    213  1.13       pk 		cat << __get_reldir_1
    214  1.13       pk The directory \"$local_sets_dir\" does not exist, or does not hold any of the
    215  1.13       pk upgrade sets.
    216  1.13       pk __get_reldir_1
    217  1.13       pk 		echo -n "Re-enter pathname? [y] "
    218  1.13       pk 		getresp "y"
    219  1.13       pk 		case "$resp" in
    220  1.13       pk 			y*|Y*)
    221  1.13       pk 				;;
    222  1.13       pk 			*)
    223  1.13       pk 				local_sets_dir=""
    224  1.13       pk 				break
    225  1.13       pk 				;;
    226  1.13       pk 		esac
    227  1.13       pk 	    fi
    228  1.13       pk 	done
    229  1.13       pk }
    230  1.13       pk 
    231   1.1       pk getrootdisk() {
    232   1.1       pk 	cat << \__getrootdisk_1
    233   1.1       pk 
    234   1.1       pk The installation program needs to know which disk to consider
    235   1.1       pk the root disk.  Note the unit number may be different than
    236   1.1       pk the unit number you used in the standalone installation
    237   1.1       pk program.
    238   1.1       pk 
    239   1.1       pk Available disks are:
    240   1.1       pk 
    241   1.1       pk __getrootdisk_1
    242   1.1       pk 	_DKDEVS=`md_get_diskdevs`
    243   1.1       pk 	echo	"$_DKDEVS"
    244   1.1       pk 	echo	""
    245   1.1       pk 	echo -n	"Which disk is the root disk? "
    246   1.1       pk 	getresp ""
    247   1.1       pk 	if isin $resp $_DKDEVS ; then
    248   1.1       pk 		ROOTDISK="$resp"
    249   1.1       pk 	else
    250   1.1       pk 		echo ""
    251   1.1       pk 		echo "The disk $resp does not exist."
    252   1.1       pk 		ROOTDISK=""
    253   1.1       pk 	fi
    254   1.1       pk }
    255   1.1       pk 
    256   1.1       pk labelmoredisks() {
    257   1.1       pk 	cat << \__labelmoredisks_1
    258   1.1       pk 
    259   1.1       pk You may label the following disks:
    260   1.1       pk 
    261   1.1       pk __labelmoredisks_1
    262   1.1       pk 	echo "$_DKDEVS"
    263   1.1       pk 	echo	""
    264   1.1       pk 	echo -n	"Label which disk? [done] "
    265   1.1       pk 	getresp "done"
    266   1.1       pk 	case "$resp" in
    267   1.1       pk 		done)
    268   1.1       pk 			;;
    269   1.1       pk 
    270   1.1       pk 		*)
    271   1.5       pk 			if isin $resp $_DKDEVS ; then
    272   1.1       pk 				md_labeldisk $resp
    273   1.1       pk 			else
    274   1.1       pk 				echo ""
    275   1.1       pk 				echo "The disk $resp does not exist."
    276   1.1       pk 			fi
    277   1.1       pk 			;;
    278   1.1       pk 	esac
    279   1.1       pk }
    280   1.1       pk 
    281   1.1       pk addhostent() {
    282   1.1       pk 	# $1 - IP address
    283   1.1       pk 	# $2 - symbolic name
    284   1.1       pk 
    285   1.1       pk 	# Create an entry in the hosts table.  If no host table
    286   1.1       pk 	# exists, create one.  If the IP address already exists,
    287   1.1       pk 	# replace it's entry.
    288   1.1       pk 	if [ ! -f /tmp/hosts ]; then
    289   1.1       pk 		echo "127.0.0.1 localhost" > /tmp/hosts
    290   1.1       pk 	fi
    291   1.1       pk 
    292   1.3       pk 	sed "/^$1 /d" < /tmp/hosts > /tmp/hosts.new
    293   1.3       pk 	mv /tmp/hosts.new /tmp/hosts
    294   1.1       pk 
    295   1.1       pk 	echo "$1 $2 $2.$FQDN" >> /tmp/hosts
    296   1.1       pk }
    297   1.1       pk 
    298   1.1       pk addifconfig() {
    299   1.1       pk 	# $1 - interface name
    300   1.1       pk 	# $2 - interface symbolic name
    301   1.1       pk 	# $3 - interface IP address
    302   1.1       pk 	# $4 - interface netmask
    303  1.16       pk 	# $5 - (optional) interface link-layer medium
    304  1.16       pk 	# $6 - (optional) interface link-layer directives
    305  1.16       pk 	local _m
    306  1.16       pk 
    307  1.16       pk 	_m=""
    308  1.16       pk 	if [ "$5" != "" ]; then
    309  1.16       pk 		_m="media $5"
    310  1.16       pk 	fi
    311  1.16       pk 	# Create a ifconfig.* file for the interface.
    312  1.16       pk 	echo "inet $2 netmask $4 $_m $6" > /tmp/ifconfig.$1
    313   1.1       pk 
    314   1.1       pk 	addhostent $3 $2
    315   1.1       pk }
    316   1.1       pk 
    317   1.1       pk configurenetwork() {
    318   1.1       pk 	local _ifsdone
    319   1.1       pk 	local _ifs
    320   1.1       pk 
    321  1.16       pk #	_IFS=`md_get_ifdevs`
    322  1.16       pk 	_IFS=`ifconfig -l | sed '
    323  1.16       pk 		s/lo0//
    324  1.16       pk 		s/ppp[0-9]//g
    325  1.16       pk 		s/sl[0-9]//g
    326  1.16       pk 		s/tun[0-9]//g'`
    327  1.16       pk 
    328   1.1       pk 	_ifsdone=""
    329   1.1       pk 	resp=""		# force at least one iteration
    330   1.1       pk 	while [ "X${resp}" != X"done" ]; do
    331   1.1       pk 	cat << \__configurenetwork_1
    332   1.1       pk 
    333   1.1       pk You may configure the following network interfaces (the interfaces
    334   1.1       pk marked with [X] have been succesfully configured):
    335   1.1       pk 
    336   1.1       pk __configurenetwork_1
    337   1.1       pk 
    338   1.1       pk 		for _ifs in $_IFS; do
    339   1.1       pk 			if isin $_ifs $_ifsdone ; then
    340   1.1       pk 				echo -n "[X] "
    341   1.1       pk 			else
    342   1.1       pk 				echo -n "    "
    343   1.1       pk 			fi
    344   1.1       pk 			echo $_ifs
    345   1.1       pk 		done
    346   1.1       pk 		echo	""
    347   1.1       pk 		echo -n	"Configure which interface? [done] "
    348   1.1       pk 		getresp "done"
    349   1.1       pk 		case "$resp" in
    350   1.1       pk 		"done")
    351   1.1       pk 			;;
    352   1.1       pk 		*)
    353   1.1       pk 			_ifs=$resp
    354   1.1       pk 			if isin $_ifs $_IFS ; then
    355   1.1       pk 				if configure_ifs $_ifs ; then
    356   1.1       pk 					_ifsdone="$_ifs $_ifsdone"
    357   1.1       pk 				fi
    358   1.1       pk 			else
    359   1.1       pk 				echo "Invalid response: \"$resp\" is not in list"
    360   1.1       pk 			fi
    361   1.1       pk 			;;
    362   1.1       pk 		esac
    363   1.1       pk 	done
    364   1.1       pk }
    365   1.1       pk 
    366   1.1       pk configure_ifs() {
    367   1.1       pk 
    368   1.8       pk 	local _up
    369   1.8       pk 	local _interface_name
    370   1.8       pk 	local _interface_ip
    371   1.8       pk 	local _interface_mask
    372   1.8       pk 	local _interface_symname
    373  1.15      gwr 	local _interface_extra
    374  1.19       pk 	local _interface_mediumtype
    375  1.19       pk 	local _interface_supported_media
    376   1.8       pk 
    377   1.1       pk 	_interface_name=$1
    378  1.16       pk 	_up=DOWN
    379  1.16       pk 	if isin $_interface_name `ifconfig -l -u` ; then
    380  1.16       pk 		_up=UP
    381  1.16       pk 	fi
    382  1.16       pk 
    383  1.16       pk 	_interface_supported_media=`ifconfig -m $_interface_name | sed -n '
    384  1.16       pk 		3s/supported media: //p'`
    385   1.1       pk 
    386   1.8       pk 	set -- `ifconfig $_interface_name | sed -n '
    387  1.16       pk 		2s/media: \([^ ][^ ]*\).*/\1/p
    388  1.16       pk 		3s/inet//
    389  1.16       pk 		3s/--> [0-9.][0-9.]*//
    390  1.16       pk 		3s/netmask//
    391  1.16       pk 		3s/broadcast//
    392  1.16       pk 		3p'`
    393   1.8       pk 
    394  1.19       pk 	if [ "$1" != "manual" ]; then
    395  1.19       pk 		_interface_mediumtype=$1
    396  1.19       pk 	fi
    397   1.8       pk 	_interface_ip=$2
    398   1.8       pk 	_interface_mask=$3
    399   1.8       pk 
    400   1.1       pk 	# Get IP address
    401   1.1       pk 	resp=""		# force one iteration
    402   1.1       pk 	while [ "X${resp}" = X"" ]; do
    403   1.8       pk 		echo -n "IP address? [$_interface_ip] "
    404   1.8       pk 		getresp "$_interface_ip"
    405   1.1       pk 		_interface_ip=$resp
    406   1.1       pk 	done
    407   1.1       pk 
    408   1.1       pk 	# Get symbolic name
    409   1.1       pk 	resp=""		# force one iteration
    410   1.1       pk 	while [ "X${resp}" = X"" ]; do
    411   1.1       pk 		echo -n "Symbolic (host) name? "
    412   1.1       pk 		getresp ""
    413   1.1       pk 		_interface_symname=$resp
    414   1.1       pk 	done
    415   1.1       pk 
    416   1.1       pk 	# Get netmask
    417   1.1       pk 	resp=""		# force one iteration
    418   1.1       pk 	while [ "X${resp}" = X"" ]; do
    419   1.8       pk 		echo -n "Netmask? [$_interface_mask] "
    420   1.8       pk 		getresp "$_interface_mask"
    421   1.1       pk 		_interface_mask=$resp
    422   1.1       pk 	done
    423   1.1       pk 
    424  1.16       pk 	echo "Your network interface might require explicit selection"
    425  1.16       pk 	echo "of the type of network medium attached. Supported media:"
    426  1.16       pk 	echo " $_interface_supported_media."
    427  1.16       pk 	echo -n "Additional media type arguments? [$_interface_mediumtype] "
    428  1.16       pk 	getresp "$_interface_mediumtype"
    429  1.16       pk 	if [ "X${resp}" != X"" ]; then
    430  1.16       pk 		_interface_mediumtype=$resp
    431  1.16       pk 	fi
    432  1.16       pk 
    433  1.16       pk 
    434  1.15      gwr 	echo "Your network interface might require additional link-layer"
    435  1.15      gwr 	echo "directives (like \`link0'). If this is the case you can enter"
    436  1.15      gwr 	echo "these at the next prompt."
    437  1.15      gwr 	echo ""
    438  1.15      gwr 	echo -n "Additional link-layer arguments? [$_interface_extra] "
    439  1.15      gwr 	getresp "$_interface_extra"
    440  1.15      gwr 	if [ "X${resp}" != X"" ]; then
    441  1.15      gwr 		_interface_extra=$resp
    442  1.15      gwr 	fi
    443  1.15      gwr 
    444   1.1       pk 	# Configure the interface.  If it
    445   1.1       pk 	# succeeds, add it to the permanent
    446   1.1       pk 	# network configuration info.
    447   1.8       pk 	if [ $_up != "UP" ]; then
    448   1.8       pk 		ifconfig ${_interface_name} down
    449   1.8       pk 		if ifconfig ${_interface_name} inet \
    450   1.8       pk 		    ${_interface_ip} \
    451  1.15      gwr 		    netmask ${_interface_mask} ${_interface_extra} up ; then
    452   1.8       pk 			addifconfig \
    453   1.8       pk 			    ${_interface_name} \
    454   1.8       pk 			    ${_interface_symname} \
    455   1.8       pk 			    ${_interface_ip} \
    456  1.16       pk 			    ${_interface_mask} \
    457  1.16       pk 			    ${_interface_mediumtype} \
    458  1.16       pk 			    ${_interface_extra}
    459   1.8       pk 			return 0
    460   1.8       pk 		fi
    461   1.8       pk 	else
    462   1.8       pk 		echo "Interface ${_interface_name} is already active."
    463   1.8       pk 		echo "Just saving configuration on new root filesystem."
    464   1.1       pk 		addifconfig \
    465   1.1       pk 		    ${_interface_name} \
    466   1.1       pk 		    ${_interface_symname} \
    467   1.1       pk 		    ${_interface_ip} \
    468  1.16       pk 		    ${_interface_mask} \
    469  1.16       pk 		    ${_interface_mediumtype} \
    470  1.16       pk 		    ${_interface_extra}
    471   1.1       pk 	fi
    472   1.1       pk 	return 1
    473   1.1       pk }
    474   1.1       pk 
    475   1.1       pk # Much of this is gratuitously stolen from /etc/netstart.
    476   1.1       pk enable_network() {
    477   1.1       pk 
    478   1.1       pk 	# Set up the hostname.
    479   1.1       pk 	if [ ! -f /mnt/etc/myname ]; then
    480   1.1       pk 		echo "ERROR: no /etc/myname!"
    481   1.1       pk 		return 1
    482   1.1       pk 	fi
    483   1.1       pk 	hostname=`cat /mnt/etc/myname`
    484   1.1       pk 	hostname $hostname
    485   1.1       pk 
    486   1.1       pk 	# configure all the interfaces which we know about.
    487  1.16       pk if [ -f /mnt/etc/rc.conf ]; then
    488  1.16       pk (
    489  1.16       pk 	# assume network interface configuration style 1.2D and up
    490  1.16       pk 	. /mnt/etc/rc.conf
    491  1.16       pk 
    492  1.16       pk 	if [ "$net_interfaces" != NO ]; then
    493  1.24       pk 		if [ "$auto_ifconfig" = YES ]; then
    494  1.16       pk 			tmp="`ifconfig -l`"
    495  1.16       pk 		else
    496  1.16       pk 			tmp="$net_interfaces"
    497  1.16       pk 		fi
    498  1.16       pk 		echo -n "configuring network interfaces:"
    499  1.16       pk 		for i in $tmp; do
    500  1.16       pk 			eval `echo 'args=$ifconfig_'$i`
    501  1.16       pk 			if [ ! -z "$args" ]; then
    502  1.16       pk 				echo -n " $i"
    503  1.16       pk 				ifconfig $i $args
    504  1.16       pk 			elif [ -f /mnt/etc/ifconfig.$i ]; then
    505  1.16       pk 				echo -n " $i"
    506  1.16       pk 				(while read args; do
    507  1.16       pk 					ifconfig $i $args
    508  1.16       pk 				done) < /mnt/etc/ifconfig.$i
    509  1.24       pk 			elif [ "$auto_ifconfig" != YES ]; then
    510  1.16       pk 				echo
    511  1.16       pk 				echo -n "/mnt/etc/ifconfig.$i missing"
    512  1.16       pk 				echo -n "& ifconfig_$i not set"
    513  1.16       pk 				echo "; interface $i can't be configured"
    514  1.16       pk 			fi
    515  1.16       pk 		done
    516  1.16       pk 		echo "."
    517  1.16       pk 	fi
    518  1.16       pk )
    519  1.16       pk else
    520   1.1       pk (
    521   1.1       pk 	tmp="$IFS"
    522   1.1       pk 	IFS="$IFS."
    523   1.1       pk 	set -- `echo /mnt/etc/hostname*`
    524   1.1       pk 	IFS=$tmp
    525   1.1       pk 	unset tmp
    526   1.1       pk 
    527   1.1       pk 	while [ $# -ge 2 ] ; do
    528   1.1       pk 		shift		# get rid of "hostname"
    529   1.1       pk 		(
    530   1.1       pk 			read af name mask bcaddr extras
    531   1.1       pk 			read dt dtaddr
    532   1.1       pk 
    533   1.1       pk 			if [ ! -n "$name" ]; then
    534   1.1       pk 		    echo "/etc/hostname.$1: invalid network configuration file"
    535   1.1       pk 				exit
    536   1.1       pk 			fi
    537   1.1       pk 
    538   1.1       pk 			cmd="ifconfig $1 $af $name "
    539   1.1       pk 			if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
    540   1.1       pk 			if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
    541   1.1       pk 			if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
    542   1.1       pk 				cmd="$cmd broadcast $bcaddr";
    543   1.1       pk 			fi
    544   1.1       pk 			cmd="$cmd $extras"
    545   1.1       pk 
    546   1.1       pk 			$cmd
    547   1.1       pk 		) < /mnt/etc/hostname.$1
    548   1.1       pk 		shift
    549   1.1       pk 	done
    550   1.1       pk )
    551  1.16       pk fi
    552   1.1       pk 
    553   1.1       pk 	# set the address for the loopback interface
    554   1.1       pk 	ifconfig lo0 inet localhost
    555   1.1       pk 
    556   1.1       pk 	# use loopback, not the wire
    557   1.1       pk 	route add $hostname localhost
    558   1.1       pk 
    559   1.1       pk 	# /etc/mygate, if it exists, contains the name of my gateway host
    560   1.1       pk 	# that name must be in /etc/hosts.
    561   1.1       pk 	if [ -f /mnt/etc/mygate ]; then
    562   1.1       pk 		route delete default > /dev/null 2>&1
    563   1.1       pk 		route add default `cat /mnt/etc/mygate`
    564   1.1       pk 	fi
    565   1.1       pk 
    566   1.1       pk 	# enable the resolver, if appropriate.
    567   1.1       pk 	if [ -f /mnt/etc/resolv.conf ]; then
    568   1.1       pk 		_resolver_enabled="TRUE"
    569   1.1       pk 		cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
    570   1.1       pk 	fi
    571   1.1       pk 
    572   1.1       pk 	# Display results...
    573   1.1       pk 	echo	"Network interface configuration:"
    574   1.1       pk 	ifconfig -a
    575   1.1       pk 
    576   1.1       pk 	echo	""
    577   1.1       pk 
    578   1.1       pk 	if [ "X${_resolver_enabled}" = X"TRUE" ]; then
    579   1.1       pk 		netstat -r
    580   1.1       pk 		echo	""
    581   1.1       pk 		echo	"Resolver enabled."
    582   1.1       pk 	else
    583   1.1       pk 		netstat -rn
    584   1.1       pk 		echo	""
    585   1.1       pk 		echo	"Resolver not enabled."
    586   1.1       pk 	fi
    587   1.1       pk 
    588   1.1       pk 	return 0
    589   1.1       pk }
    590   1.1       pk 
    591   1.1       pk install_ftp() {
    592  1.21      leo 	local	_f
    593  1.21      leo 	local	_sets
    594  1.21      leo 	local	_next
    595  1.21      leo 
    596  1.21      leo 	# Build a script to extract valid files from a list
    597  1.21      leo 	# of filenames on stdin.
    598  1.21      leo 	# XXX : Can we use this on more places? Leo.
    599  1.21      leo 
    600  1.21      leo 	echo "#!/bin/sh" > /tmp/fname_filter.sh
    601  1.21      leo 	echo "while read line; do"	>> /tmp/fname_filter.sh
    602  1.21      leo 	echo "    case \$line in"	>> /tmp/fname_filter.sh
    603  1.21      leo 	for _f in $THESETS; do
    604  1.21      leo 		echo "    $_f.tar.gz|$_f.tgz|$_f.${VERSION}.aa)" \
    605  1.21      leo 					>> /tmp/fname_filter.sh
    606  1.21      leo 		echo '        echo -n "$line ";;' \
    607  1.21      leo 					>> /tmp/fname_filter.sh
    608  1.21      leo 	done
    609  1.21      leo 	echo "        *) ;;"		>> /tmp/fname_filter.sh
    610  1.21      leo 	echo "    esac"			>> /tmp/fname_filter.sh
    611  1.21      leo 	echo "done"			>> /tmp/fname_filter.sh
    612  1.21      leo 
    613   1.1       pk 	# Get several parameters from the user, and create
    614   1.1       pk 	# a shell script that directs the appropriate
    615   1.1       pk 	# commands into ftp.
    616   1.1       pk 	cat << \__install_ftp_1
    617   1.1       pk 
    618   1.1       pk This is an automated ftp-based installation process.  You will be asked
    619   1.1       pk several questions.  The correct set of commands will be placed in a script
    620   1.1       pk that will be fed to ftp(1).
    621   1.1       pk 
    622   1.1       pk __install_ftp_1
    623   1.1       pk 	# Get server IP address
    624   1.1       pk 	resp=""		# force one iteration
    625   1.1       pk 	while [ "X${resp}" = X"" ]; do
    626   1.1       pk 		echo -n "Server IP? [${_ftp_server_ip}] "
    627   1.1       pk 		getresp "${_ftp_server_ip}"
    628   1.1       pk 		_ftp_server_ip=$resp
    629   1.1       pk 	done
    630   1.1       pk 
    631   1.1       pk 	# Get login name
    632   1.1       pk 	resp=""		# force one iteration
    633   1.1       pk 	while [ "X${resp}" = X"" ]; do
    634   1.1       pk 		echo -n "Login? [${_ftp_server_login}] "
    635   1.1       pk 		getresp "${_ftp_server_login}"
    636   1.1       pk 		_ftp_server_login=$resp 
    637   1.1       pk 	done
    638   1.1       pk 
    639   1.1       pk 	# Get password
    640   1.1       pk 	resp=""		# force one iteration
    641   1.1       pk 	while [ "X${resp}" = X"" ]; do
    642  1.16       pk 		echo -n "Password? "
    643  1.16       pk 		stty -echo
    644  1.16       pk 		getresp ""
    645  1.16       pk 		echo ""
    646  1.16       pk 		stty echo
    647   1.1       pk 		_ftp_server_password=$resp
    648   1.1       pk 	done
    649   1.1       pk 
    650   1.1       pk 	cat << \__install_ftp_2
    651   1.1       pk 
    652  1.21      leo You will be asked to enter the name of the directory that contains the
    653  1.21      leo installation sets. When you enter a '?' you will see a listing of the
    654  1.21      leo current directory on the server.
    655  1.21      leo __install_ftp_2
    656  1.21      leo 	_sets=""
    657  1.21      leo 	while [ -z "$_sets" ]
    658  1.21      leo 	do
    659  1.21      leo 		resp=""		# force one iteration
    660  1.21      leo 		while [ "X${resp}" = X"" ]; do
    661  1.21      leo 			echo -n "Server directory? [${_ftp_server_dir}] "
    662  1.21      leo 		    getresp "${_ftp_server_dir}"
    663  1.21      leo 		    if [ "X$resp" = 'X?' -a -z "$_ftp_server_dir" ]; then
    664  1.21      leo 			resp=""
    665  1.21      leo 		    fi
    666  1.21      leo 		done
    667  1.21      leo 		if [ $resp != '?' ]; then
    668  1.21      leo 			_ftp_server_dir=$resp
    669  1.21      leo 		fi
    670  1.21      leo 
    671  1.21      leo 		# Build the basics of an ftp-script...
    672  1.21      leo 		echo "#!/bin/sh" > /tmp/ftp-script.sh
    673  1.21      leo 		echo "cd /mnt" >> /tmp/ftp-script.sh
    674  1.26       is 		echo "ftp -e -i -n $_ftp_server_ip << \__end_commands" >> \
    675  1.21      leo 		    /tmp/ftp-script.sh
    676  1.21      leo 		echo "user $_ftp_server_login $_ftp_server_password" >> \
    677  1.21      leo 		    /tmp/ftp-script.sh
    678  1.21      leo 		echo "bin" >> /tmp/ftp-script.sh
    679  1.21      leo 		echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
    680  1.21      leo 
    681  1.21      leo 		# Make a copy of this script that lists the directory
    682  1.21      leo 		# contents, and use that to determine the files to get.
    683  1.21      leo 		cat /tmp/ftp-script.sh	>  /tmp/ftp-dir.sh
    684  1.21      leo 		echo "ls"		>> /tmp/ftp-dir.sh
    685  1.21      leo 		echo "quit"		>> /tmp/ftp-dir.sh
    686  1.21      leo 		echo "__end_commands"	>> /tmp/ftp-dir.sh
    687  1.21      leo 
    688  1.21      leo 		if [ $resp = '?' ]; then
    689  1.21      leo 			sh /tmp/ftp-dir.sh
    690  1.21      leo 		else
    691  1.21      leo 			_sets=`sh /tmp/ftp-dir.sh | sh /tmp/fname_filter.sh`
    692  1.21      leo 		fi
    693  1.21      leo 	done
    694  1.21      leo 	rm -f /tmp/ftp-dir.sh /tmp/fname_filter.sh
    695  1.21      leo 
    696  1.21      leo 	while : ; do
    697  1.21      leo 		echo "The following sets are available for extraction:"
    698  1.21      leo 		echo "(marked sets have already been extracted)"
    699  1.21      leo 		echo ""
    700   1.1       pk 
    701  1.21      leo 		_next=""
    702  1.21      leo 		for _f in $_sets ; do
    703  1.21      leo 			if isin $_f $_setsdone; then
    704  1.21      leo 				echo -n "[X] "
    705  1.21      leo 				_next=""
    706  1.21      leo 			else
    707  1.21      leo 				echo -n "    "
    708  1.21      leo 				if [ -z "$_next" ]; then _next=$_f; fi
    709  1.21      leo 			fi
    710  1.21      leo 			echo $_f
    711  1.21      leo 		done
    712  1.21      leo 		echo ""
    713   1.1       pk 
    714  1.21      leo 		# Get name of the file and add extraction command
    715  1.21      leo 		# to the ftp-script.
    716  1.21      leo 		if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
    717  1.21      leo 		echo -n "Continue to add filenames [$resp]? "
    718  1.21      leo 		getresp "$resp"
    719  1.21      leo 		if [ "$resp" = "n" ]; then
    720   1.1       pk 			break
    721   1.1       pk 		fi
    722   1.1       pk 
    723  1.21      leo 		echo -n "File name [$_next]? "
    724  1.21      leo 		getresp "$_next"
    725  1.21      leo 		if isin $resp $_sets; then
    726  1.25  garbled 			echo "get $resp |\"pax -zrvpe\"" >> \
    727  1.21      leo 					/tmp/ftp-script.sh
    728  1.21      leo 			_setsdone="$resp $_setsdone"
    729  1.21      leo 		else
    730  1.21      leo 			echo "You entered an invalid filename."
    731  1.21      leo 			echo ""
    732  1.21      leo 		fi
    733   1.1       pk 	done
    734   1.1       pk 
    735   1.1       pk 	echo "quit" >> /tmp/ftp-script.sh
    736   1.1       pk 	echo "__end_commands" >> /tmp/ftp-script.sh
    737   1.1       pk 
    738   1.1       pk 	sh /tmp/ftp-script.sh
    739   1.1       pk 	rm -f /tmp/ftp-script.sh
    740   1.1       pk 	echo "Extraction complete."
    741   1.1       pk }
    742   1.1       pk 
    743  1.11       pk install_from_mounted_fs() {
    744  1.13       pk 	# $1 - directory containing installation sets
    745   1.1       pk 	local _filename
    746  1.13       pk 	local _sets
    747  1.12       pk 	local _next
    748   1.1       pk 	local _f
    749  1.18       is 	local _dirname
    750   1.1       pk 
    751  1.18       is 	_dirname=$1
    752  1.13       pk 	_sets=""
    753  1.20       is 
    754  1.20       is 	echo ""
    755  1.20       is 	echo "The directory at the mount point, \"${_dirname}\", contains: "
    756  1.20       is 	echo ""
    757  1.20       is 	ls -F ${_dirname}
    758  1.20       is 	echo ""
    759  1.20       is 	echo    "Enter the subdirectory relative to the mountpoint, that"
    760  1.20       is 	echo -n "contains the savesets: [try this directory] "
    761  1.20       is 	getresp ""
    762  1.20       is 	if [ "X${resp}" != "X" ]; then
    763  1.20       is 		_dirname=${_dirname}/$resp
    764  1.20       is 	fi
    765  1.20       is 
    766  1.18       is 	while ! dir_has_sets ${_dirname} $THESETS; do
    767  1.18       is 		echo ""
    768  1.18       is 		echo -n "There are no NetBSD install sets available in "
    769  1.18       is 		echo "\"${_dirname}\"."
    770  1.18       is 		echo "\"${_dirname}\" contains: "
    771  1.18       is 		echo ""
    772  1.18       is 		ls -F ${_dirname}
    773  1.18       is 		echo ""
    774  1.18       is 		echo -n "Enter subdirectory: [try other install media] "
    775  1.18       is 		getresp ""
    776  1.18       is 		if [ "X${resp}" = "X" ]; then
    777  1.18       is 			return
    778  1.18       is 		fi
    779  1.18       is 		if [ ! -d ${_dirname}/${resp} ]; then
    780  1.18       is 			echo "\"${resp}\" is no directory; try again."
    781  1.18       is 		else
    782  1.18       is 			_dirname=${_dirname}/$resp
    783  1.18       is 		fi
    784  1.18       is 	done
    785  1.18       is 
    786  1.18       is 	for _f in $THESETS ; do
    787  1.18       is 		if [ -f ${_dirname}/${_f}.tar.gz ]; then
    788  1.18       is 			_sets="$_sets ${_f}.tar.gz"
    789  1.18       is 		elif [ -f ${_dirname}/${_f}.tgz ]; then
    790  1.18       is 			_sets="$_sets ${_f}.tgz"
    791  1.18       is 		elif [ -f ${_dirname}/${_f}${VERSION}.aa ]; then
    792  1.18       is 			_sets="$_sets ${_f}${VERSION}"
    793  1.18       is 		fi
    794  1.18       is 	done
    795   1.1       pk 
    796   1.1       pk 	while : ; do
    797   1.1       pk 		echo "The following sets are available for extraction:"
    798   1.1       pk 		echo "(marked sets have already been extracted)"
    799   1.1       pk 		echo ""
    800   1.1       pk 
    801  1.12       pk 		_next=""
    802   1.1       pk 		for _f in $_sets ; do
    803   1.1       pk 			if isin $_f $_setsdone; then
    804   1.1       pk 				echo -n "[X] "
    805  1.12       pk 				_next=""
    806   1.1       pk 			else
    807   1.1       pk 				echo -n "    "
    808  1.12       pk 				if [ -z "$_next" ]; then _next=$_f; fi
    809   1.1       pk 			fi
    810   1.1       pk 			echo $_f
    811   1.1       pk 		done
    812   1.1       pk 		echo ""
    813   1.1       pk 
    814   1.1       pk 		# Get the name of the file.
    815  1.12       pk 		if [ "X$_next" = "X" ]; then resp=n; else resp=y; fi
    816   1.1       pk 		echo -n "Continue extraction [$resp]?"
    817   1.1       pk 		getresp "$resp"
    818   1.1       pk 		if [ "$resp" = "n" ]; then
    819   1.1       pk 			break
    820   1.1       pk 		fi
    821   1.1       pk 
    822  1.12       pk 		echo -n "File name [$_next]? "
    823  1.12       pk 		getresp "$_next"
    824   1.1       pk 		_f=$resp
    825  1.18       is 		_filename="/${_dirname}/$_f"
    826   1.1       pk 
    827   1.1       pk 		# Ensure file exists
    828   1.1       pk 		if [ ! -f $_filename ]; then
    829  1.18       is 			if [ -f ${_filename}.aa ]; then
    830  1.18       is 				_filename=${_filename}.\?\?
    831  1.18       is 			else
    832  1.18       is 			 echo "File $_filename does not exist.  Check to make"
    833  1.18       is 			 echo "sure you entered the information properly."
    834  1.18       is 			 continue
    835  1.18       is 			fi
    836   1.1       pk 		fi
    837   1.1       pk 
    838   1.1       pk 		# Extract file
    839  1.25  garbled 		cat $_filename | (cd /mnt; pax -zrvpe)
    840   1.1       pk 		echo "Extraction complete."
    841   1.1       pk 		_setsdone="$_f $_setsdone"
    842   1.1       pk 
    843   1.1       pk 	done
    844   1.1       pk }
    845   1.1       pk 
    846   1.1       pk install_cdrom() {
    847   1.5       pk 	local _drive
    848   1.6      leo 	local _partition_range
    849   1.5       pk 	local _partition
    850   1.5       pk 	local _fstype
    851   1.5       pk 	local _directory
    852   1.5       pk 
    853   1.1       pk 	# Get the cdrom device info
    854   1.1       pk 	cat << \__install_cdrom_1
    855   1.1       pk 
    856   1.1       pk The following CD-ROM devices are installed on your system; please select
    857   1.6      leo the CD-ROM device containing the partition with the installation sets:
    858   1.1       pk 
    859   1.1       pk __install_cdrom_1
    860   1.1       pk 	_CDDEVS=`md_get_cddevs`
    861   1.1       pk 	echo    "$_CDDEVS"
    862   1.1       pk 	echo	""
    863   1.1       pk 	echo -n	"Which is the CD-ROM with the installation media? [abort] "
    864   1.1       pk 	getresp "abort"
    865   1.1       pk 	case "$resp" in
    866   1.1       pk 		abort)
    867   1.1       pk 			echo "Aborting."
    868   1.1       pk 			return
    869   1.1       pk 			;;
    870   1.1       pk 
    871   1.1       pk 		*)
    872   1.1       pk 			if isin $resp $_CDDEVS ; then
    873   1.5       pk 				_drive=$resp
    874   1.1       pk 			else
    875   1.1       pk 				echo ""
    876   1.1       pk 				echo "The CD-ROM $resp does not exist."
    877   1.1       pk 				echo "Aborting."
    878   1.1       pk 				return
    879   1.1       pk 			fi
    880   1.1       pk 			;;
    881   1.1       pk 	esac
    882   1.1       pk 
    883   1.1       pk 	# Get partition
    884   1.6      leo 	_partition_range=`md_get_partition_range`
    885   1.1       pk 	resp=""		# force one iteration
    886   1.1       pk 	while [ "X${resp}" = X"" ]; do
    887  1.17       is 		echo -n "Partition? [a] "
    888  1.17       is 		getresp "a"
    889   1.1       pk 		case "$resp" in
    890   1.6      leo 			$_partition_range)
    891   1.5       pk 				_partition=$resp
    892   1.1       pk 				;;
    893   1.1       pk 
    894   1.1       pk 			*)
    895   1.1       pk 				echo "Invalid response: $resp"
    896   1.1       pk 				resp=""		# force loop to repeat
    897   1.1       pk 				;;
    898   1.1       pk 		esac
    899   1.1       pk 	done
    900   1.1       pk 
    901   1.1       pk 	# Ask for filesystem type
    902   1.1       pk 	cat << \__install_cdrom_2
    903   1.1       pk 
    904   1.1       pk There are two CD-ROM filesystem types currently supported by this program:
    905   1.1       pk 	1) ISO-9660 (cd9660)
    906   1.1       pk 	2) Berkeley Fast Filesystem (ffs)
    907   1.1       pk 
    908   1.1       pk __install_cdrom_2
    909   1.1       pk 	resp=""		# force one iteration
    910   1.1       pk 	while [ "X${resp}" = X"" ]; do
    911   1.1       pk 		echo -n "Which filesystem type? [cd9660] "
    912   1.1       pk 		getresp "cd9660"
    913   1.1       pk 		case "$resp" in
    914   1.1       pk 			cd9660|ffs)
    915   1.5       pk 				_fstype=$resp
    916   1.1       pk 				;;
    917   1.1       pk 
    918   1.1       pk 			*)
    919   1.1       pk 				echo "Invalid response: $resp"
    920   1.1       pk 				resp=""		# force loop to repeat
    921   1.1       pk 				;;
    922   1.1       pk 		esac
    923   1.1       pk 	done
    924   1.1       pk 
    925   1.1       pk 	# Mount the CD-ROM
    926  1.17       is 	if ! mount -t ${_fstype} -o ro \
    927   1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
    928   1.1       pk 		echo "Cannot mount CD-ROM drive.  Aborting."
    929   1.1       pk 		return
    930   1.1       pk 	fi
    931   1.1       pk 
    932  1.20       is 	install_from_mounted_fs /mnt2
    933   1.5       pk 	umount -f /mnt2 > /dev/null 2>&1
    934   1.5       pk }
    935   1.5       pk 
    936  1.14      leo mount_a_disk() {
    937  1.14      leo 	# Mount a disk on /mnt2. The set of disk devices to choose from
    938  1.14      leo 	# is $_DKDEVS.
    939  1.14      leo 	# returns 0 on failure.
    940  1.14      leo 
    941   1.5       pk 	local _drive
    942   1.6      leo 	local _partition_range
    943   1.5       pk 	local _partition
    944   1.5       pk 	local _fstype
    945   1.5       pk 	local _fsopts
    946   1.5       pk 	local _directory
    947   1.5       pk 	local _md_fstype
    948   1.5       pk 	local _md_fsopts
    949   1.5       pk 
    950   1.5       pk 	getresp "abort"
    951   1.5       pk 	case "$resp" in
    952   1.5       pk 		abort)
    953   1.5       pk 			echo "Aborting."
    954  1.14      leo 			return 0
    955   1.5       pk 			;;
    956   1.5       pk 
    957   1.5       pk 		*)
    958   1.5       pk 			if isin $resp $_DKDEVS ; then
    959   1.5       pk 				_drive=$resp
    960   1.5       pk 			else
    961   1.5       pk 				echo ""
    962   1.5       pk 				echo "The disk $resp does not exist."
    963   1.5       pk 				echo "Aborting."
    964  1.14      leo 				return 0
    965   1.5       pk 			fi
    966   1.5       pk 			;;
    967   1.5       pk 	esac
    968   1.5       pk 
    969   1.5       pk 	# Get partition
    970   1.6      leo 	_partition_range=`md_get_partition_range`
    971   1.5       pk 	resp=""		# force one iteration
    972   1.5       pk 	while [ "X${resp}" = X"" ]; do
    973   1.5       pk 		echo -n "Partition? [d] "
    974   1.5       pk 		getresp "d"
    975   1.5       pk 		case "$resp" in
    976   1.6      leo 			$_partition_range)
    977   1.5       pk 				_partition=$resp
    978   1.5       pk 				;;
    979   1.5       pk 
    980   1.5       pk 			*)
    981   1.5       pk 				echo "Invalid response: $resp"
    982   1.5       pk 				resp=""		# force loop to repeat
    983   1.5       pk 				;;
    984   1.5       pk 		esac
    985   1.5       pk 	done
    986   1.5       pk 
    987   1.5       pk 	# Ask for filesystem type
    988  1.14      leo 	cat << \__mount_a_disk_2
    989   1.5       pk 
    990   1.5       pk The following filesystem types are supported:
    991   1.5       pk 	1) ffs
    992  1.14      leo __mount_a_disk_2
    993   1.5       pk 	_md_fstype=`md_native_fstype`
    994   1.5       pk 	_md_fsopts=`md_native_fsopts`
    995   1.5       pk 	if [ ! -z "$_md_fstype" ]; then
    996   1.5       pk 		echo "	2) $_md_fstype"
    997   1.5       pk 	else
    998   1.5       pk 		_md_fstype="_undefined_"
    999   1.5       pk 	fi
   1000   1.5       pk 	resp=""		# force one iteration
   1001   1.5       pk 	while [ "X${resp}" = X"" ]; do
   1002   1.5       pk 		echo -n "Which filesystem type? [ffs] "
   1003   1.5       pk 		getresp "ffs"
   1004   1.5       pk 		case "$resp" in
   1005   1.5       pk 			ffs)
   1006   1.5       pk 				_fstype=$resp
   1007   1.5       pk 				_fsopts="ro"
   1008   1.5       pk 				;;
   1009   1.5       pk 			$_md_fstype)
   1010   1.5       pk 				_fstype=$resp
   1011   1.5       pk 				_fsopts=$_md_fsopts
   1012   1.5       pk 				;;
   1013   1.5       pk 			*)
   1014   1.5       pk 				echo "Invalid response: $resp"
   1015   1.5       pk 				resp=""		# force loop to repeat
   1016   1.5       pk 				;;
   1017   1.5       pk 		esac
   1018   1.5       pk 	done
   1019   1.5       pk 
   1020   1.5       pk 	# Mount the disk
   1021   1.5       pk 	if ! mount -t ${_fstype} -o $_fsopts \
   1022   1.5       pk 	    /dev/${_drive}${_partition} /mnt2 ; then
   1023   1.5       pk 		echo "Cannot mount disk.  Aborting."
   1024  1.14      leo 		return 0
   1025  1.14      leo 	fi
   1026  1.14      leo 	return 1
   1027  1.14      leo }
   1028  1.14      leo 
   1029  1.14      leo install_disk() {
   1030  1.14      leo 	local _directory
   1031  1.14      leo 
   1032  1.14      leo 	cat << \__install_disk_1
   1033  1.14      leo 
   1034  1.14      leo The following disk devices are installed on your system; please select
   1035  1.14      leo the disk device containing the partition with the installation sets:
   1036  1.14      leo 
   1037  1.14      leo __install_disk_1
   1038  1.14      leo 	_DKDEVS=`md_get_diskdevs`
   1039  1.14      leo 	echo    "$_DKDEVS"
   1040  1.14      leo 	echo	""
   1041  1.14      leo 	echo -n	"Which is the disk with the installation sets? [abort] "
   1042  1.14      leo 
   1043  1.14      leo 	if mount_a_disk ; then
   1044   1.5       pk 		return
   1045   1.5       pk 	fi
   1046   1.5       pk 
   1047  1.20       is 	install_from_mounted_fs /mnt2
   1048   1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
   1049   1.1       pk }
   1050   1.1       pk 
   1051   1.1       pk install_nfs() {
   1052   1.1       pk 	# Get the IP address of the server
   1053   1.1       pk 	resp=""		# force one iteration
   1054   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1055   1.1       pk 		echo -n "Server IP address? [${_nfs_server_ip}] "
   1056   1.1       pk 		getresp "${_nfs_server_ip}"
   1057   1.1       pk 	done
   1058   1.1       pk 	_nfs_server_ip=$resp
   1059   1.1       pk 
   1060   1.1       pk 	# Get server path to mount
   1061   1.1       pk 	resp=""		# force one iteration
   1062   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1063   1.1       pk 		echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
   1064   1.1       pk 		getresp "${_nfs_server_path}"
   1065   1.1       pk 	done
   1066   1.1       pk 	_nfs_server_path=$resp
   1067   1.1       pk 
   1068   1.1       pk 	# Determine use of TCP
   1069   1.1       pk 	echo -n "Use TCP transport (only works with capable NFS server)? [n] "
   1070   1.1       pk 	getresp "n"
   1071   1.1       pk 	case "$resp" in
   1072   1.1       pk 		y*|Y*)
   1073   1.1       pk 			_nfs_tcp="-T"
   1074   1.1       pk 			;;
   1075   1.1       pk 
   1076   1.1       pk 		*)
   1077   1.1       pk 			_nfs_tcp=""
   1078   1.1       pk 			;;
   1079   1.1       pk 	esac
   1080   1.1       pk 
   1081   1.1       pk 	# Mount the server
   1082   1.1       pk 	mkdir /mnt2 > /dev/null 2>&1
   1083   1.1       pk 	if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
   1084   1.1       pk 	    /mnt2 ; then
   1085   1.1       pk 		echo "Cannot mount NFS server.  Aborting."
   1086   1.1       pk 		return
   1087   1.1       pk 	fi
   1088   1.1       pk 
   1089  1.20       is 	install_from_mounted_fs /mnt2
   1090   1.1       pk 	umount -f /mnt2 > /dev/null 2>&1
   1091   1.1       pk }
   1092   1.1       pk 
   1093   1.1       pk install_tape() {
   1094  1.11       pk 	local _xcmd
   1095  1.11       pk 
   1096   1.1       pk 	# Get the name of the tape from the user.
   1097   1.1       pk 	cat << \__install_tape_1
   1098   1.1       pk 
   1099   1.1       pk The installation program needs to know which tape device to use.  Make
   1100   1.1       pk sure you use a "no rewind on close" device.
   1101   1.1       pk 
   1102   1.1       pk __install_tape_1
   1103   1.1       pk 	_tape=`basename $TAPE`
   1104   1.1       pk 	resp=""		# force one iteration
   1105   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1106   1.1       pk 		echo -n "Name of tape device? [${_tape}]"
   1107   1.1       pk 		getresp "${_tape}"
   1108   1.1       pk 	done
   1109   1.1       pk 	_tape=`basename $resp`
   1110   1.1       pk 	TAPE="/dev/${_tape}"
   1111   1.1       pk 	if [ ! -c $TAPE ]; then
   1112   1.1       pk 		echo "$TAPE does not exist or is not a character special file."
   1113   1.1       pk 		echo "Aborting."
   1114   1.1       pk 		return
   1115   1.1       pk 	fi
   1116   1.1       pk 	export TAPE
   1117   1.1       pk 
   1118   1.1       pk 	# Rewind the tape device
   1119   1.1       pk 	echo -n "Rewinding tape..."
   1120   1.1       pk 	if ! mt rewind ; then
   1121   1.1       pk 		echo "$TAPE may not be attached to the system or may not be"
   1122   1.1       pk 		echo "a tape device.  Aborting."
   1123   1.1       pk 		return
   1124   1.1       pk 	fi
   1125   1.1       pk 	echo "done."
   1126   1.1       pk 
   1127   1.1       pk 	# Get the file number
   1128   1.1       pk 	resp=""		# force one iteration
   1129   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1130   1.1       pk 		echo -n "File number? "
   1131   1.1       pk 		getresp ""
   1132   1.1       pk 		case "$resp" in
   1133   1.1       pk 			[1-9]*)
   1134   1.1       pk 				_nskip=`expr $resp - 1`
   1135   1.1       pk 				;;
   1136   1.1       pk 
   1137   1.1       pk 			*)
   1138   1.1       pk 				echo "Invalid file number ${resp}."
   1139   1.1       pk 				resp=""		# fore loop to repeat
   1140   1.1       pk 				;;
   1141   1.1       pk 		esac
   1142   1.1       pk 	done
   1143   1.1       pk 
   1144   1.1       pk 	# Skip to correct file.
   1145   1.1       pk 	echo -n "Skipping to source file..."
   1146   1.1       pk 	if [ "X${_nskip}" != X"0" ]; then
   1147   1.1       pk 		if ! mt fsf $_nskip ; then
   1148   1.1       pk 			echo "Could not skip $_nskip files.  Aborting."
   1149   1.1       pk 			return
   1150   1.1       pk 		fi
   1151   1.1       pk 	fi
   1152   1.1       pk 	echo "done."
   1153   1.1       pk 
   1154   1.1       pk 	cat << \__install_tape_2
   1155   1.1       pk 
   1156   1.1       pk There are 2 different ways the file can be stored on tape:
   1157   1.1       pk 
   1158   1.1       pk 	1) an image of a gzipped tar file
   1159   1.1       pk 	2) a standard tar image
   1160   1.1       pk 
   1161   1.1       pk __install_tape_2
   1162   1.1       pk 	resp=""		# force one iteration
   1163   1.1       pk 	while [ "X${resp}" = X"" ]; do
   1164   1.1       pk 		echo -n "Which way is it? [1] "
   1165   1.1       pk 		getresp "1"
   1166   1.1       pk 		case "$resp" in
   1167  1.11       pk 		1)
   1168  1.25  garbled 			_xcmd="pax -zrvpe"
   1169  1.11       pk 			;;
   1170   1.1       pk 
   1171  1.11       pk 		2)
   1172  1.25  garbled 			_xcmd="tar -rvpe"
   1173  1.11       pk 			;;
   1174   1.1       pk 
   1175  1.11       pk 		*)
   1176  1.11       pk 			echo "Invalid response: $resp."
   1177  1.11       pk 			resp=""		# force loop to repeat
   1178  1.11       pk 			;;
   1179   1.1       pk 		esac
   1180  1.11       pk 		( cd /mnt; dd if=$TAPE | $_xcmd )
   1181   1.1       pk 	done
   1182   1.1       pk 	echo "Extraction complete."
   1183   1.1       pk }
   1184   1.1       pk 
   1185   1.1       pk get_timezone() {
   1186   1.1       pk 	local _a
   1187   1.6      leo 	local _zonepath
   1188   1.6      leo 
   1189   1.6      leo 	#
   1190   1.6      leo 	# If the zoneinfo is not on the installation medium or on the
   1191   1.6      leo 	# installed filesystem, set TZ to GMT and return immediatly.
   1192   1.6      leo 	#
   1193   1.9       pk 	if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
   1194   1.6      leo 		TZ=GMT
   1195   1.6      leo 		return
   1196   1.6      leo 	fi
   1197   1.6      leo 	if [ ! -d /usr/share/zoneinfo ]; then
   1198   1.6      leo 		_zonepath=/mnt
   1199   1.6      leo 	else
   1200   1.6      leo 		_zonepath=""
   1201   1.6      leo 	fi
   1202   1.6      leo 		
   1203   1.1       pk cat << \__get_timezone_1
   1204   1.1       pk 
   1205   1.1       pk Select a time zone for your location. Timezones are represented on the
   1206   1.1       pk system by a directory structure rooted in "/usr/share/timezone". Most
   1207   1.1       pk timezones can be selected by entering a token like "MET" or "GMT-6".
   1208   1.1       pk Other zones are grouped by continent, with detailed zone information
   1209   1.1       pk separated by a slash ("/"), e.g. "US/Pacific".
   1210   1.1       pk 
   1211   1.1       pk To get a listing of what's available in /usr/share/zoneinfo, enter "?"
   1212   1.1       pk at the prompts below.
   1213   1.1       pk 
   1214   1.1       pk __get_timezone_1
   1215   1.1       pk 	if [ X$TZ = X ]; then
   1216  1.13       pk 		TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast`
   1217   1.3       pk 		TZ=${TZ#/usr/share/zoneinfo/}
   1218   1.1       pk 	fi
   1219   1.1       pk 	while :; do
   1220   1.1       pk 		echo -n	"What timezone are you in [\`?' for list] [$TZ]? "
   1221   1.1       pk 		getresp "$TZ"
   1222   1.1       pk 		case "$resp" in
   1223   1.1       pk 		"")
   1224   1.1       pk 			echo "Timezone defaults to GMT"
   1225   1.1       pk 			TZ="GMT"
   1226   1.1       pk 			break;
   1227   1.1       pk 			;;
   1228   1.1       pk 		"?")
   1229   1.6      leo 			ls ${_zonepath}/usr/share/zoneinfo
   1230   1.1       pk 			;;
   1231   1.1       pk 		*)
   1232   1.1       pk 			_a=$resp
   1233   1.6      leo 			while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
   1234   1.1       pk 				echo -n "There are several timezones available"
   1235   1.1       pk 				echo " within zone '$_a'"
   1236   1.1       pk 				echo -n "Select a sub-timezone [\`?' for list]: "
   1237   1.1       pk 				getresp ""
   1238   1.1       pk 				case "$resp" in
   1239   1.6      leo 				"?") ls ${_zonepath}/usr/share/zoneinfo/$_a ;;
   1240   1.1       pk 				*)	_a=${_a}/${resp}
   1241   1.6      leo 					if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1242   1.1       pk 						break;
   1243   1.1       pk 					fi
   1244   1.1       pk 					;;
   1245   1.1       pk 				esac
   1246   1.1       pk 			done
   1247   1.6      leo 			if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
   1248   1.1       pk 				TZ="$_a"
   1249   1.1       pk 				echo "You have selected timezone \"$_a\"".
   1250   1.1       pk 				break 2
   1251   1.1       pk 			fi
   1252   1.1       pk 			echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
   1253   1.1       pk 			;;
   1254   1.1       pk 		esac
   1255   1.1       pk 	done
   1256   1.1       pk }
   1257   1.1       pk 
   1258   1.1       pk install_sets()
   1259   1.1       pk {
   1260  1.13       pk 	local _yup
   1261  1.13       pk 	_yup="FALSE"
   1262  1.13       pk 
   1263  1.13       pk 	# Ask the user which media to load the distribution from.
   1264  1.13       pk 	cat << \__install_sets_1
   1265   1.1       pk 
   1266   1.1       pk It is now time to extract the installation sets onto the hard disk.
   1267  1.10  thorpej Make sure the sets are either on a local device (i.e. tape, CD-ROM) or on a
   1268   1.1       pk network server.
   1269   1.1       pk 
   1270   1.1       pk __install_sets_1
   1271  1.13       pk 
   1272  1.13       pk 	if [ "X$local_sets_dir" != "X" ]; then
   1273  1.13       pk 		install_from_mounted_fs ${local_sets_dir}
   1274  1.13       pk 		if [ X"$_setsdone" != X ]; then
   1275  1.13       pk 			_yup="TRUE"
   1276  1.13       pk 		fi
   1277  1.13       pk 	fi
   1278  1.13       pk 
   1279  1.13       pk 	# Go on prodding for alternate locations
   1280  1.13       pk 	resp=""		# force at least one iteration
   1281  1.13       pk 	while [ X"${resp}" = X ]; do
   1282  1.13       pk 		# If _yup is not FALSE, it means that we extracted sets above.
   1283  1.13       pk 		# If that's the case, bypass the menu the first time.
   1284  1.13       pk 		if [ X"$_yup" = X"FALSE" ]; then
   1285  1.13       pk 			echo -n	"Install from (f)tp, (t)ape, (C)D-ROM, (N)FS"
   1286  1.13       pk 			echo -n " or local (d)isk? "
   1287  1.13       pk 			getresp ""
   1288   1.1       pk 			case "$resp" in
   1289  1.13       pk 			d*|D*)
   1290  1.13       pk 				install_disk
   1291  1.13       pk 				;;
   1292  1.13       pk 			f*|F*)
   1293  1.13       pk 				install_ftp
   1294  1.13       pk 				;;
   1295  1.13       pk 			t*|T*)
   1296  1.13       pk 				install_tape
   1297  1.13       pk 				;;
   1298  1.13       pk 			c*|C*)
   1299  1.13       pk 				install_cdrom
   1300  1.13       pk 				;;
   1301  1.13       pk 			n*|N*)
   1302  1.13       pk 				install_nfs
   1303   1.1       pk 				;;
   1304   1.1       pk 			*)
   1305  1.13       pk 				echo "Invalid response: $resp"
   1306  1.13       pk 				resp=""
   1307   1.1       pk 				;;
   1308   1.1       pk 			esac
   1309  1.13       pk 		else
   1310  1.13       pk 			_yup="FALSE"	# So we'll ask next time
   1311  1.13       pk 		fi
   1312   1.1       pk 
   1313  1.13       pk 		# Give the user the opportunity to extract more sets. They
   1314  1.13       pk 		# don't necessarily have to come from the same media.
   1315  1.13       pk 		echo	""
   1316  1.13       pk 		echo -n	"Extract more sets? [n] "
   1317  1.13       pk 		getresp "n"
   1318   1.1       pk 		case "$resp" in
   1319  1.13       pk 		y*|Y*)
   1320  1.13       pk 			# Force loop to repeat
   1321  1.13       pk 			resp=""
   1322   1.1       pk 			;;
   1323   1.1       pk 
   1324   1.1       pk 		*)
   1325   1.1       pk 			;;
   1326   1.1       pk 		esac
   1327  1.13       pk 	done
   1328   1.1       pk }
   1329   1.1       pk 
   1330   1.1       pk munge_fstab()
   1331   1.1       pk {
   1332   1.1       pk 	local _fstab
   1333   1.1       pk 	local _fstab_shadow
   1334   1.5       pk 	local _dev
   1335   1.5       pk 	local _mp
   1336   1.7      leo 	local _fstype
   1337   1.5       pk 	local _rest
   1338   1.6      leo 
   1339   1.1       pk 	# Now that the 'real' fstab is configured, we munge it into a 'shadow'
   1340   1.1       pk 	# fstab which we'll use for mounting and unmounting all of the target
   1341   1.1       pk 	# filesystems relative to /mnt.  Mount all filesystems.
   1342   1.1       pk 	_fstab=$1
   1343   1.1       pk 	_fstab_shadow=$2
   1344   1.7      leo 	( while read _dev _mp _fstype _rest; do
   1345   1.7      leo 		# Skip comment lines
   1346   1.7      leo 		case "$_dev" in
   1347   1.7      leo 			\#*)	continue;;
   1348   1.7      leo 			*)	;;
   1349   1.7      leo 		esac
   1350   1.7      leo 		# and some filesystem types (like there are swap,kernfs,...)
   1351   1.7      leo 		case "$_fstype" in
   1352   1.7      leo 			ffs|ufs|nfs)	;;
   1353   1.7      leo 			*)	continue;;
   1354   1.7      leo 		esac
   1355   1.3       pk 		if [ "$_mp" = "/" ]; then
   1356   1.8       pk 			echo $_dev /mnt $_fstype $_rest
   1357   1.1       pk 		else
   1358   1.8       pk 			echo $_dev /mnt$_mp $_fstype $_rest
   1359   1.3       pk 		fi
   1360   1.6      leo 	    done ) < $_fstab > $_fstab_shadow
   1361   1.1       pk }
   1362   1.1       pk 
   1363   1.1       pk mount_fs()
   1364   1.1       pk {
   1365   1.1       pk 	# Must mount filesystems manually, one at a time, so we can make
   1366   1.1       pk 	# sure the mount points exist.
   1367   1.1       pk 	# $1 is a file in fstab format
   1368   1.1       pk 	local _fstab
   1369   1.1       pk 
   1370   1.1       pk 	_fstab=$1
   1371   1.1       pk 
   1372   1.1       pk 	( while read line; do
   1373   1.4       pk 		set -- $line
   1374   1.4       pk 		_dev=$1
   1375   1.4       pk 		_mp=$2
   1376   1.4       pk 		_fstype=$3
   1377   1.4       pk 		_opt=$4
   1378   1.1       pk 
   1379   1.1       pk 		# If not the root filesystem, make sure the mount
   1380   1.1       pk 		# point is present.
   1381   1.1       pk 		if [ "X{$_mp}" != X"/mnt" ]; then
   1382   1.1       pk 			mkdir -p $_mp
   1383   1.1       pk 		fi
   1384   1.1       pk 
   1385   1.1       pk 		# Mount the filesystem.  If the mount fails, exit
   1386   1.1       pk 		# with an error condition to tell the outer
   1387   1.1       pk 		# later to bail.
   1388   1.1       pk 		if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
   1389   1.1       pk 			# error message displated by mount
   1390   1.1       pk 			exit 1
   1391   1.1       pk 		fi
   1392   1.1       pk 	done ) < $_fstab
   1393   1.1       pk 
   1394   1.1       pk 	if [ "X${?}" != X"0" ]; then
   1395   1.1       pk 		cat << \__mount_filesystems_1
   1396   1.1       pk 
   1397   1.1       pk FATAL ERROR:  Cannot mount filesystems.  Double-check your configuration
   1398   1.1       pk and restart the installation process.
   1399   1.1       pk __mount_filesystems_1
   1400   1.1       pk 		exit
   1401   1.1       pk 	fi
   1402   1.1       pk }
   1403   1.1       pk 
   1404   1.1       pk unmount_fs()
   1405   1.1       pk {
   1406   1.1       pk 	# Unmount all filesystems and check their integrity.
   1407  1.13       pk 	# Usage: [-fast] <fstab file>
   1408  1.13       pk 	local _fast
   1409   1.1       pk 	local _fstab
   1410  1.13       pk 	local _pid
   1411  1.13       pk 
   1412  1.13       pk 	if [ "$1" = "-fast" ]; then
   1413  1.13       pk 		_fast=1
   1414  1.13       pk 		_fstab=$2
   1415  1.13       pk 	else
   1416  1.13       pk 		_fast=0
   1417  1.13       pk 		_fstab=$1
   1418  1.13       pk 	fi
   1419   1.1       pk 
   1420  1.13       pk 	if [ ! \( -f $_fstab -a -s $_fstab \) ]; then
   1421  1.13       pk 		echo "fstab empty" > /dev/tty
   1422  1.13       pk 		return
   1423  1.13       pk 	fi
   1424   1.1       pk 
   1425  1.13       pk 	if [ $_fast = 0 ]; then
   1426  1.13       pk 		echo -n	"Syncing disks..."
   1427  1.13       pk 		_pid=`twiddle`
   1428  1.13       pk 		sync; sleep 4; sync; sleep 2; sync; sleep 2
   1429  1.13       pk 		kill $_pid
   1430  1.13       pk 		echo	"done."
   1431  1.13       pk 	fi
   1432   1.1       pk 
   1433   1.1       pk 	(
   1434   1.1       pk 		_devs=""
   1435   1.1       pk 		_mps=""
   1436   1.1       pk 		# maintain reverse order
   1437   1.1       pk 		while read line; do
   1438   1.3       pk 			set -- $line
   1439   1.3       pk 			_devs="$1 ${_devs}"
   1440   1.3       pk 			_mps="$2 ${_mps}"
   1441   1.1       pk 		done
   1442   1.1       pk 		echo -n "Umounting filesystems... "
   1443   1.1       pk 		for _mp in ${_mps}; do
   1444   1.1       pk 			echo -n "${_mp} "
   1445   1.1       pk 			umount ${_mp}
   1446   1.1       pk 		done
   1447   1.1       pk 		echo "Done."
   1448   1.1       pk 
   1449  1.13       pk 		if [ $_fast = 0 ]; then
   1450  1.13       pk 			exit
   1451  1.13       pk 		fi
   1452   1.1       pk 		echo "Checking filesystem integrity..."
   1453   1.1       pk 		for _dev in ${_devs}; do
   1454   1.1       pk 			echo  "${_dev}"
   1455   1.1       pk 			fsck -f ${_dev}
   1456   1.1       pk 		done
   1457   1.1       pk 		echo "Done."
   1458   1.1       pk 	) < $_fstab
   1459   1.1       pk }
   1460   1.1       pk 
   1461   1.1       pk check_fs()
   1462   1.1       pk {
   1463   1.1       pk 	# Check filesystem integrity.
   1464   1.1       pk 	# $1 is a file in fstab format
   1465   1.1       pk 	local _fstab
   1466   1.1       pk 
   1467   1.1       pk 	_fstab=$1
   1468   1.1       pk 
   1469   1.1       pk 	(
   1470   1.1       pk 		_devs=""
   1471   1.1       pk 		_mps=""
   1472   1.1       pk 		while read line; do
   1473   1.3       pk 			set -- $line
   1474   1.3       pk 			_devs="$1 ${_devs}"
   1475   1.3       pk 			_mps="$2 ${_mps}"
   1476   1.1       pk 		done
   1477   1.1       pk 
   1478   1.1       pk 		echo "Checking filesystem integrity..."
   1479   1.1       pk 		for _dev in ${_devs}; do
   1480   1.1       pk 			echo  "${_dev}"
   1481   1.1       pk 			fsck -f ${_dev}
   1482   1.1       pk 		done
   1483   1.1       pk 		echo "Done."
   1484   1.1       pk 	) < $_fstab
   1485   1.1       pk }
   1486