summaryrefslogtreecommitdiff
path: root/distrib/macppc/ramdisk
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2001-09-01 16:47:04 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2001-09-01 16:47:04 +0000
commit6045d5bb00b12a1d49c45cf8fc91d13b2ec1ab0d (patch)
tree15914a003f9e3260a244479c8057231d5f8456ba /distrib/macppc/ramdisk
parent5cd95bbee8e1e0fd211b3f68255c23edbc21b8e0 (diff)
Move the powerpc ramdisk building support from powerpc to macppc.
Diffstat (limited to 'distrib/macppc/ramdisk')
-rw-r--r--distrib/macppc/ramdisk/Makefile106
-rw-r--r--distrib/macppc/ramdisk/Makefile.inc4
-rw-r--r--distrib/macppc/ramdisk/dot.profile72
-rw-r--r--distrib/macppc/ramdisk/install.md439
-rw-r--r--distrib/macppc/ramdisk/install.sub2071
-rw-r--r--distrib/macppc/ramdisk/instbin.conf34
-rw-r--r--distrib/macppc/ramdisk/list105
-rw-r--r--distrib/macppc/ramdisk/mtree.conf90
8 files changed, 2921 insertions, 0 deletions
diff --git a/distrib/macppc/ramdisk/Makefile b/distrib/macppc/ramdisk/Makefile
new file mode 100644
index 00000000000..350993de8d2
--- /dev/null
+++ b/distrib/macppc/ramdisk/Makefile
@@ -0,0 +1,106 @@
+# $OpenBSD: Makefile,v 1.1 2001/09/01 16:47:03 drahn Exp $
+
+TOP= ${.CURDIR}/..
+
+.include "${TOP}/Makefile.inc"
+BSD_RD= bsd.rd
+IMAGE= mr.fs
+CBIN?= instbin
+LISTS= ${.CURDIR}/list
+UTILS?= ${.CURDIR}/../../miniroot
+
+MOUNT_POINT= /mnt
+MTREE= ${.CURDIR}/mtree.conf
+
+VND?= svnd0
+VND_DEV= /dev/${VND}a
+VND_RDEV= /dev/r${VND}a
+VND_CRDEV= /dev/r${VND}c
+PID!= echo $$$$
+
+
+DISKTYPE= rdroot
+NBLKS= 8192
+# minfree, opt, b/i trks, sects, cpg
+NEWFSARGS= -m 0 -o space -c 16 -i 4096
+
+.ifndef DESTDIR
+all ${IMAGE}:
+ @echo setenv DESTDIR before making a ramdisk!
+ @false
+.else
+
+# mix config is not needed.
+all: ${BSD_RD} cd
+
+${BSD_RD}: ${CBIN} ${IMAGE} bsd rdsetroot
+ cp bsd ${BSD_RD}
+ ${.OBJDIR}/rdsetroot ${BSD_RD} < ${IMAGE}
+
+cd: ${BSD_RD}
+ -rm -rf ${.OBJDIR}/cd-dir/
+ -@mkdir -p ${.OBJDIR}/cd-dir/${OSREV}/powerpc/
+ cp bsd.rd ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd
+ strip ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd
+ gzip -9 ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd
+ mv ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd.gz ${.OBJDIR}/cd-dir/${OSREV}/powerpc/bsd.rd
+ cp ${DESTDIR}/usr/mdec/ofwboot ${.OBJDIR}/cd-dir/
+ mkhybrid -r -part -hfs -o ${.OBJDIR}/cd${OSrev}.fs ${.OBJDIR}/cd-dir
+
+
+${IMAGE}: rd_setup do_files rd_teardown
+
+.endif
+
+bsd:
+ cd ${TOP}/../../sys/arch/powerpc/conf && config RAMDISK
+ cd ${TOP}/../../sys/arch/powerpc/compile/RAMDISK && \
+ make clean && make depend && make
+ cp ${TOP}/../../sys/arch/powerpc/compile/RAMDISK/bsd bsd
+
+rd_setup:
+ dd if=/dev/zero of=${IMAGE} bs=512 count=${NBLKS}
+ vnconfig -v -c ${VND} ${IMAGE}
+ disklabel -w -r ${VND} ${DISKTYPE}
+ newfs ${NEWFSARGS} ${VND_RDEV}
+ fsck ${VND_RDEV}
+ mount ${VND_DEV} ${MOUNT_POINT}
+
+rd_teardown:
+ @df -i ${MOUNT_POINT}
+ -umount ${MOUNT_POINT}
+ -vnconfig -u ${VND}
+
+rdsetroot: ${TOP}/common/rdsetroot.c
+ ${HOSTCC} -DDEBUG -o rdsetroot ${TOP}/common/rdsetroot.c
+
+unconfig:
+ -umount -f ${MOUNT_POINT}
+ -vnconfig -u ${VND}
+
+.PRECIOUS: ${IMAGE}
+
+install:
+ cp ${BSD_RD} cd${REV}.fs ${DESTDIR}/snapshot/
+
+${CBIN}.mk ${CBIN}.cache ${CBIN}.c: ${CBIN}.conf
+ crunchgen -E -D ${.CURDIR}/../../.. -L ${DESTDIR}/usr/lib ${.ALLSRC}
+
+${CBIN}: ${CBIN}.mk ${CBIN}.cache ${CBIN}.c
+ make -f ${CBIN}.mk all
+
+do_files:
+ mtree -def ${MTREE} -p ${MOUNT_POINT}/ -u
+ TOPDIR=${TOP} CURDIR=${.CURDIR} OBJDIR=${.OBJDIR} \
+ REV=${REV} TARGDIR=${MOUNT_POINT} sh ${TOP}/runlist.sh ${LISTS}
+
+clean cleandir:
+ /bin/rm -f core ${IMAGE} ${CBIN} ${CBIN}.mk ${CBIN}.cache \
+ *.o *.lo *.c bsd ${BSD_RD} \
+ rdsetroot
+
+beforeinstall:
+ cp ${BSD.RD} cd${REV}.fs ${DESTDIR}/snapshot
+
+.include <bsd.obj.mk>
+.include <bsd.subdir.mk>
diff --git a/distrib/macppc/ramdisk/Makefile.inc b/distrib/macppc/ramdisk/Makefile.inc
new file mode 100644
index 00000000000..1f0b7f4d374
--- /dev/null
+++ b/distrib/macppc/ramdisk/Makefile.inc
@@ -0,0 +1,4 @@
+# $OpenBSD: Makefile.inc,v 1.1 2001/09/01 16:47:03 drahn Exp $
+
+CRUNCHGENOPTS= -E
+
diff --git a/distrib/macppc/ramdisk/dot.profile b/distrib/macppc/ramdisk/dot.profile
new file mode 100644
index 00000000000..0a7a49c5dd0
--- /dev/null
+++ b/distrib/macppc/ramdisk/dot.profile
@@ -0,0 +1,72 @@
+# $OpenBSD: dot.profile,v 1.1 2001/09/01 16:47:03 drahn Exp $
+#
+# Copyright (c) 1994 Christopher G. Demetriou
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Christopher G. Demetriou.
+# 4. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+export PATH=/sbin:/bin:/usr/bin:/usr/sbin:/
+export HISTFILE=/.sh_history
+export HOME=/
+
+umask 022
+
+set -o emacs # emacs-style command line editing
+
+if [ "X${DONEPROFILE}" = "X" ]; then
+ DONEPROFILE=YES
+
+ mount_ffs -o update /dev/rd0a /
+
+ # set up some sane defaults
+ echo 'erase ^?, werase ^W, kill ^U, intr ^C, status ^T'
+ stty newcrt werase ^W intr ^C kill ^U erase ^? status ^T 9600
+
+
+ # Installing or upgrading?
+ _forceloop=""
+ while [ "X$_forceloop" = X"" ]; do
+ echo -n '(I)nstall, (U)pgrade or (S)hell? '
+ read _forceloop
+ case "$_forceloop" in
+ i*|I*)
+ /install
+ ;;
+
+ u*|U*)
+ /upgrade
+ ;;
+
+ s*|S*)
+ ;;
+
+ *)
+ _forceloop=""
+ ;;
+ esac
+ done
+fi
diff --git a/distrib/macppc/ramdisk/install.md b/distrib/macppc/ramdisk/install.md
new file mode 100644
index 00000000000..8901dd45602
--- /dev/null
+++ b/distrib/macppc/ramdisk/install.md
@@ -0,0 +1,439 @@
+# $OpenBSD: install.md,v 1.1 2001/09/01 16:47:03 drahn Exp $
+#
+#
+# Copyright rc) 1996 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Jason R. Thorpe.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by the NetBSD
+# Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+#
+# machine dependent section of installation/upgrade script.
+#
+
+# Machine-dependent install sets
+MDSETS="kernel"
+ARCH=ARCH
+
+md_set_term() {
+ test -n "$TERM" && return
+ echo -n "Specify terminal type [vt220]: "
+ getresp vt220
+ TERM=$resp
+ export TERM
+}
+
+md_get_diskdevs() {
+ # return available disk devices
+ bsort `dmesg | egrep -a "^[sw]d[0-9]+ " | cutword 1`
+}
+
+md_get_cddevs() {
+ # return available CDROM devices
+ bsort `dmesg | egrep -a "^cd[0-9]+ " | cutword 1`
+}
+
+md_get_partition_range() {
+ # return range of valid partition letters
+ echo [a-p]
+}
+
+md_questions() {
+ :
+}
+
+md_installboot() {
+ if [[ $disklabeltype = "HFS" ]]
+ then
+ echo "the 'ofwboot' program needs to be copied to the first HFS partition"
+ echo "of the disk to allow booting of OpenBSD"
+ elif [[ $disklabeltype = "MBR" ]]
+ then
+ echo "Installing boot in the msdos partition /dev/${1}i"
+ if mount -t msdos /dev/${1}i /mnt2 ; then
+ cp /usr/mdec/ofwboot /mnt2
+ umount /mnt2
+ else
+ echo "Failed, you will not be able to boot from /dev/${1}."
+ fi
+ fi
+}
+
+md_native_fstype() {
+ echo "msdos"
+}
+
+md_native_fsopts() {
+ echo "ro"
+}
+
+md_init_mbr() {
+ # $1 is the disk to init
+ echo
+ echo "You will now be asked if you want to initialize the disk with a 1Mb"
+ echo "MSDOS partition. This is the recomended setup and will allow you to"
+ echo "store the boot and other interesting things here."
+ echo
+ echo "If you want to have a different setup, exit 'install' now and do"
+ echo "the MBR initialization by hand using the 'fdisk' program."
+ echo
+ echo "If you choose to manually setup the MSDOS partition, "
+ echo "consult your PowerPC OpenFirmware manual -and- the"
+ echo "PowerPC OpenBSD Installation Guide for doing setup this way."
+ echo
+ echo -n "Do you want to init the MBR and the MSDOS partition? [y] "
+ getresp "y"
+ case "$resp" in
+ n*|N*)
+ exit 0;;
+ *)
+ echo
+ echo "An MBR record with an OpenBSD usable partition table will now be copied"
+ echo "to your disk. Unless you have special requirements you will not need"
+ echo "to edit this MBR. After the MBR is copied an empty 1Mb MSDOS partition"
+ echo "will be created on the disk. You *MUST* setup the OpenBSD disklabel"
+ echo "to have a partition include this MSDOS partition."
+ echo "You will have an opportunity to do this shortly."
+ echo
+ echo "You will probably see a few '...: no disk label' messages"
+ echo "It's completely normal. The disk has no label yet."
+ echo "This will take a minute or two..."
+ sleep 2
+ echo -n "Creating Master Boot Record (MBR)..."
+ fdisk -i -f /usr/mdec/mbr $1
+ echo "..done."
+ echo -n "Copying 1MB MSDOS partition to disk..."
+ gunzip < /usr/mdec/msdos1mb.gz | dd of=/dev/r$1c bs=512 seek=1 >/dev/null 2>&1
+ echo "..done."
+ ;;
+ esac
+}
+
+md_init_hfs() {
+ pdisk /dev/${1}c
+}
+md_checkfordisklabel() {
+ # $1 is the disk to check
+ local rval
+
+ echo
+ echo "Apple systems have two methods to label/partition a boot disk."
+ echo "Either the disk can be partitioned with Apple HFS partition"
+ echo "tools to contain an \"Unused\" partition, or without any"
+ echo "MacOS tools, the disk can be labled using an MBR partition table"
+ echo "If the HFS (DPME) partition table is used, after the disk is"
+ echo "partitioned with the Apple software, the \"Unused\" section"
+ echo "must be changed to type \"OpenBSD\" name \"OpenBSD\" using the"
+ echo "pdisk tool contained on this ramdisk. The disklabel can"
+ echo "then be edited normally"
+ echo "WARNING: the MBR partitioning code will HAPPILY overwrite/destroy"
+ echo "any HFS partitions on the disk, including the partition table."
+ echo "Choose the MBR option carefully, knowing this fact."
+
+ echo -n "Do you want to choose (H)FS labeling or (M)BR labeling [H] "
+ getresp "h"
+ case "$resp" in
+ m*|M*)
+ export disklabeltype=MBR
+ md_checkforMBRdisklabel $1
+ rval=$?
+ ;;
+ *)
+ export disklabeltype=HFS
+ md_init_hfs $1
+ rval=$?
+ ;;
+ esac
+ return $rval
+}
+md_checkforMBRdisklabel() {
+
+ echo "You have chosen to put a MBR disklabel on the disk."
+ echo -n "Is this correct? [n] "
+ getresp "n"
+ case "$resp" in
+ n*|N*)
+ echo "aborting install"
+ exit 0;;
+ *)
+ ;;
+ esac
+
+ echo -n "Have you initialized an MSDOS partition using OpenFirmware? [n] "
+ getresp "n"
+ case "$resp" in
+ n*|N*)
+ md_init_mbr $1;;
+ *)
+ echo
+ echo "You may keep your current setup if you want to be able to use any"
+ echo "already loaded OS. However you will be asked to prepare an empty"
+ echo "partition for OpenBSD later. There must also be at least ~0.5Mb free space"
+ echo "in the boot partition to hold the OpenBSD bootloader."
+ echo
+ echo "Also note that the boot partition must be included as partition"
+ echo "'i' in the OpenBSD disklabel."
+ echo
+ echo -n "Do you want to keep the current MSDOS partition setup? [y]"
+ getresp "y"
+ case "$resp" in
+ n*|N*)
+ md_init_mbr $1;;
+ *)
+ ;;
+ esac
+ ;;
+ esac
+
+ disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel
+ if grep "no disk label" /tmp/checkfordisklabel; then
+ rval=1
+ elif grep "disk label corrupted" /tmp/checkfordisklabel; then
+ rval=2
+ else
+ rval=0
+ fi
+
+ rm -f /tmp/checkfordisklabel
+ return $rval
+}
+
+md_prep_fdisk()
+{
+ local _disk
+ local _done
+
+ _disk=$1
+ echo
+ echo "This disk has not previously been used with OpenBSD. You may share"
+ echo "this disk with other operating systems. However, to be able to boot"
+ echo "the system you will need a small DOS partition in the beginning of"
+ echo "the disk to hold the kernel boot. OpenFirmware understands"
+ echo "how to read an MSDOS style format from the disk."
+ echo
+ echo "This DOS style partitioning has been taken care of if"
+ echo "you chose to do that initialization earlier in the install."
+ echo
+ echo "WARNING: Wrong information in the BIOS partition table might"
+ echo "render the disk unusable."
+
+ echo -n "Press [Enter] to continue "
+ getresp ""
+
+ echo
+ echo "Current partition information is:"
+ fdisk ${_disk}
+ echo -n "Press [Enter] to continue "
+ getresp ""
+
+ _done=0
+ while [ $_done = 0 ]; do
+ echo
+ cat << \__md_prep_fdisk_1
+
+An OpenBSD partition should have type (i.d.) of 166 (A6), and should be the
+only partition marked as active. Also make sure that the size of the partition
+to be used by OpenBSD is correct, otherwise OpenBSD disklabel installation
+will fail. Furthermore, the partitions must NOT overlap each others.
+
+The fdisk utility will be started update mode (interactive.)
+You will be able to add / modify this information as needed.
+If you make a mistake, simply exit fdisk without storing the new
+information, and you will be allowed to start over.
+__md_prep_fdisk_1
+ echo
+ echo -n "Press [Enter] to continue "
+ getresp ""
+
+ fdisk -e ${_disk}
+
+ echo
+ echo "The new partition information is:"
+ fdisk ${_disk}
+
+ echo
+ echo "(You will be permitted to edit this information again.)"
+ echo "-------------------------------------------------------"
+ echo -n "Is the above information correct? [n] "
+ getresp "n"
+
+ case "$resp" in
+ n*|N*) ;;
+ *) _done=1 ;;
+ esac
+ done
+
+ echo
+ echo "Please take note of the offset and size of the OpenBSD partition"
+ echo "*AND* the MSDOS partitions you may want to access from OpenBSD."
+ echo "At least the MSDOS partition used for booting must be accessible"
+ echo "by OpenBSD as partition 'i'. You may need this information to "
+ echo "fill in the OpenBSD disk label later."
+ echo -n "Press [Enter] to continue "
+ getresp ""
+}
+
+md_prep_disklabel()
+{
+ local _disk
+
+ _disk=$1
+ md_checkfordisklabel $_disk
+ case $? in
+ 0)
+ echo -n "Do you wish to edit the disklabel on $_disk? [y] "
+ ;;
+ 1)
+ md_prep_fdisk ${_disk}
+ echo "WARNING: Disk $_disk has no label"
+ echo -n "Do you want to create one with the disklabel editor? [y] "
+ ;;
+ 2)
+ echo "WARNING: Label on disk $_disk is corrupted"
+ echo -n "Do you want to try and repair the damage using the disklabel editor? [y] "
+ ;;
+
+ esac
+
+ getresp "y"
+ case "$resp" in
+ y*|Y*) ;;
+ *) return ;;
+ esac
+
+ # display example
+ cat << \__md_prep_disklabel_1
+
+Disk partition sizes and offsets are in sector (most likely 512 bytes) units.
+You may set these size/offset pairs on cylinder boundaries
+ (the number of sector per cylinder is given in )
+ (the `sectors/cylinder' entry, which is not shown here)
+Also, you *must* make sure that the 'i' partition points at the MSDOS
+partition that will be used for booting. The 'c' partition shall start
+at offset 0 and include the entire disk. This is most likely correct when
+you see the default label in the editor.
+
+Do not change any parameters except the partition layout and the label name.
+
+ [Here is an example of what the partition information may look like.]
+10 partitions:
+# size offset fstype [fsize bsize cpg]
+ a: 120832 10240 4.2BSD 1024 8192 16 # (Cyl. 11*- 142*)
+ b: 131072 131072 swap # (Cyl. 142*- 284*)
+ c: 6265200 0 unused 1024 8192 # (Cyl. 0 - 6809)
+ e: 781250 262144 4.2BSD 1024 8192 16 # (Cyl. 284*- 1134*)
+ f: 1205000 1043394 4.2BSD 1024 8192 16 # (Cyl. 1134*- 2443*)
+ g: 2008403 2248394 4.2BSD 1024 8192 16 # (Cyl. 2443*- 4626*)
+ h: 2008403 4256797 4.2BSD 1024 8192 16 # (Cyl. 4626*- 6809*)
+ i: 10208 32 MSDOS # (Cyl. 0*- 11*)
+[End of example]
+__md_prep_disklabel_1
+ echo -n "Press [Enter] to continue "
+ getresp ""
+ if [[ $disklabeltype = "HFS" ]]
+ then
+ disklabel -c -f /tmp/fstab.${_disk} -E ${_disk}
+ elif [[ $disklabeltype = "MBR" ]]
+ then
+ disklabel -W ${_disk}
+ disklabel ${_disk} >/tmp/label.$$
+ disklabel -r -R ${_disk} /tmp/label.$$
+ rm -f /tmp/label.$$
+ disklabel -f /tmp/fstab.${_disk} -E ${_disk}
+ else
+ echo "unknown disk label type"
+ fi
+}
+
+md_welcome_banner() {
+{
+ if [ "$MODE" = install ]; then
+ cat << __EOT
+Welcome to the OpenBSD/powerpc ${VERSION_MAJOR}.${VERSION_MINOR} installation program.
+
+This program is designed to help you put OpenBSD on your disk in a simple and
+rational way.
+__EOT
+
+ else
+ cat << __EOT
+Welcome to the OpenBSD/powerpc ${VERSION_MAJOR}.${VERSION_MINOR} upgrade program.
+
+This program is designed to help you upgrade your OpenBSD system in a simple
+and rational way. As a reminder, installing the 'etc' binary set is NOT
+recommended. Once the rest of your system has been upgraded, you should
+manually merge any changes to files in the 'etc' set into those files which
+already exist on your system.
+
+__EOT
+ fi
+
+cat << __EOT
+
+As with anything which modifies your disk's contents, this program can cause
+SIGNIFICANT data loss, and you are advised to make sure your data is backed
+up before beginning the installation process.
+
+Default answers are displayed in brackets after the questions. You can hit
+Control-C at any time to quit, but if you do so at a prompt, you may have
+to hit return. Also, quitting in the middle of installation may leave your
+system in an inconsistent state. If you hit Control-C and restart the
+install, the install program will remember many of your old answers.
+
+__EOT
+} | more
+}
+
+md_not_going_to_install() {
+ cat << __EOT
+
+OK, then. Enter 'reboot' at the prompt to reset the machine. Once the machine
+has rebooted, use Open Firmware to load the new boot code.
+
+__EOT
+}
+
+md_congrats() {
+ local what;
+ if [ "$MODE" = install ]; then
+ what=installed
+ else
+ what=upgraded
+ fi
+ cat << __EOT
+
+CONGRATULATIONS! You have successfully $what OpenBSD! To boot the
+installed system, enter reboot at the command prompt. Once the machine
+has rebooted, use Open Firmware to boot into OpenBSD.
+
+__EOT
+}
diff --git a/distrib/macppc/ramdisk/install.sub b/distrib/macppc/ramdisk/install.sub
new file mode 100644
index 00000000000..04bac194646
--- /dev/null
+++ b/distrib/macppc/ramdisk/install.sub
@@ -0,0 +1,2071 @@
+#!/bin/sh
+# $OpenBSD: install.sub,v 1.1 2001/09/01 16:47:03 drahn Exp $
+# $NetBSD: install.sub,v 1.5.2.8 1996/09/02 23:25:02 pk Exp $
+#
+# Copyright (c) 1997,1998 Todd Miller, Theo de Raadt
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Todd Miller and
+# Theo de Raadt
+# 4. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Copyright (c) 1996 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Jason R. Thorpe.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by the NetBSD
+# Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+# OpenBSD installation/upgrade script - common subroutines.
+
+ROOTDISK="" # filled in below
+VERSION=
+VERSION_MAJOR=$(( $VERSION / 10 ))
+VERSION_MINOR=$(( $VERSION % 10 ))
+export VERSION VERSION_MAJOR VERSION_MINOR
+
+ALLSETS="base etc misc comp man game xbase xshare xfont xserv" # install
+UPGRSETS="base misc comp man game xbase xshare xfont xserv" # upgrade
+SNAPSETS="bin dev etc games man misc sbin \
+ usr.bin usr.binutils usr.games usr.include \
+ usr.lib usr.libexec usr.misc usr.sbin usr.share var"
+THESETS= # one of the above
+
+local_sets_dir="" # Path searched for sets by install_sets
+ # on the local filesystems
+
+# decide upon an editor
+if [ X$EDITOR = X ]; then
+ if [ -x /usr/bin/vi ]; then
+ EDITOR=vi
+ else
+ EDITOR=ed
+ fi
+ export EDITOR
+fi
+
+# Please don't use the 1 of n form below, good idea, wrong implementation!
+# get a reponse with default[s]
+getresp() {
+ set -o noglob
+ valid="false"
+ while [ "X$valid" = "Xfalse" ]; do
+ read resp
+ if [ "X$resp" = "X" ]; then
+ resp=$1
+ fi
+ if [ $# -gt 1 ]; then
+ for i in $@; do
+ if [ "X$resp" = "X$i" ]; then
+ valid="true"
+ fi
+ done
+ else
+ valid="true"
+ fi
+ if [ "X$valid" = "Xfalse" ]; then
+ echo "Try again: Enter one of [$@] "
+ fi
+ done
+ set +o noglob
+}
+
+isin() {
+# test the first argument against the remaining ones, return succes on a match
+ local _a
+
+ _a=$1; shift
+ while [ $# != 0 ]; do
+ if [ "$_a" = "$1" ]; then return 0; fi
+ shift
+ done
+ return 1
+}
+
+addel() {
+# add first argument to list formed by the remaining arguments
+# adds to the tail if the element does not already exist
+ local _a
+ local _seen
+
+ _seen=""
+ _a=$1; shift
+ while [ $# != 0 ]; do
+ echo "$1"
+ if [ "$_a" = "$1" ]; then
+ _seen="yes"
+ fi
+ shift
+ done
+ if [ "X$_seen" = "X" ]; then
+ echo "$_a"
+ fi
+}
+
+rmel() {
+# remove first argument from list formed by the remaining arguments
+ local _a
+
+ _a=$1; shift
+ while [ $# != 0 ]; do
+ if [ "$_a" != "$1" ]; then
+ echo "$1"
+ fi
+ shift
+ done
+}
+
+cutword () {
+# read a line of data, return Nth element.
+ local _a
+ local _n
+ local _oifs
+
+ # optional field separator
+ _oifs="$IFS"
+ case "$1" in
+ -t?*) IFS=${1#-t}; shift;;
+ esac
+
+ _n=$1
+ read _a; set -- $_a
+ IFS="$_oifs"
+ if [ "$1" = "" ]; then return; fi
+ eval echo \$$_n
+}
+
+cutlast () {
+# read a line of data, return last element. Equiv. of awk '{print $NF}'.
+ local _a
+ local _oifs
+
+ # optional field separator
+ _oifs="$IFS"
+ case "$1" in
+ -t?*) IFS=${1#-t}; shift;;
+ esac
+
+ read _a; set -- $_a
+ IFS="$_oifs"
+ if [ "$1" = "" ]; then return; fi
+ while [ "$#" -gt 10 ]; do shift 10; done
+ eval echo \$$#
+}
+
+firstchar () {
+# return first character of argument
+ local _a
+ _a=$1
+ while [ ${#_a} != 1 ]; do
+ _a=${_a%?}
+ done
+ echo $_a
+}
+
+basename () {
+ local _oifs
+ if [ "$1" = "" ]; then return; fi
+ _oifs="$IFS"
+ IFS="/"
+ set -- $1
+ IFS="$_oifs"
+ while [ "$#" -gt 10 ]; do shift 10; done
+ eval echo \$$#
+}
+
+dir_has_sets() {
+ # return true when the directory $1 contains a set for $2...$n
+ local _dir
+ local _file
+
+ _dir=$1; shift
+ for _file in $*
+ do
+ if [ -f $_dir/${_file}${VERSION}.tar.gz ]; then
+ return 0
+ fi
+ # Try for stupid msdos convention
+ if [ -f $_dir/${_file}${VERSION}.tgz ]; then
+ return 0
+ fi
+ # Special check for kernel
+ if [ $_file = "kernel" -a -f $_dir/bsd ]; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+list_has_sets() {
+ # return true when the list $1 contains a set, given dir $2 for $3...$n
+ local _list
+ local _file
+
+ _list=$1; shift
+ for _file in $*
+ do
+ if isin ${_file}${VERSION}.tar.gz $_list; then
+ return 0
+ fi
+ # Try for stupid msdos convention
+ if isin ${_file}${VERSION}.tgz $_list; then
+ return 0
+ fi
+ # Special check for kernel
+ if test $_file = "kernel" && isin bsd $_list; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+ftp_list_files() {
+ # log in via ftp to host $1 as user $2 with password $3
+ # and return a list of all files in the directory $4 on stdout
+ local _host
+ local _user
+ local _pass
+ local _dir
+
+ _host=$1; shift
+ _user=$1; shift
+ _pass=$1; shift
+ _dir=$1; shift
+
+ ftp ${_ftp_active} -V -n $_host <<__ptf
+user $_user $_pass
+cd $_dir
+ls
+quit
+__ptf
+}
+
+twiddle() {
+# spin the propeller so we don't get bored
+ while : ; do
+ sleep 1; echo -n "/";
+ sleep 1; echo -n "-";
+ sleep 1; echo -n "\\";
+ sleep 1; echo -n "|";
+ done > /dev/tty & echo $!
+}
+
+get_localdir() {
+ # $1 is relative mountpoint
+ local _mp
+ local _dir
+
+ _mp=$1
+ _dir=
+ while : ; do
+ echo -n "Enter the pathname where the sets are stored [$_dir] "
+ getresp "$_dir"
+ _dir=$resp
+
+ # Allow break-out with empty response
+ if [ -z "$_dir" ]; then
+ echo -n "Are you sure you don't want to set the pathname? [n] "
+ getresp "n"
+ case "$resp" in
+ y*|Y*)
+ break
+ ;;
+ *)
+ continue
+ ;;
+ esac
+ fi
+
+ if dir_has_sets "$_mp/$_dir" $THESETS
+ then
+ local_sets_dir="$_mp/$_dir"
+ break
+ else
+ cat << __get_reldir_1
+The directory \"$local_sets_dir\" does not exist, or does not hold any of the
+upgrade sets.
+__get_reldir_1
+ echo -n "Re-enter pathname? [y] "
+ getresp "y"
+ case "$resp" in
+ y*|Y*)
+ ;;
+ *)
+ local_sets_dir=""
+ break
+ ;;
+ esac
+ fi
+ done
+}
+
+getanotherdisk() {
+ cat << \__getanotherdisk_1
+
+Now you can select another disk to initialize. (Do not re-select a disk
+you have already entered information for). Available disks are:
+
+__getanotherdisk_1
+ _DKDEVS=`md_get_diskdevs`
+ echo "$_DKDEVS"
+ echo ""
+ echo -n "Which one? [done] "
+ getresp ""
+ if [ "X${resp}" = "X" ]; then
+ DISK=done
+ elif isin $resp $_DKDEVS ; then
+ DISK="$resp"
+ else
+ echo ""
+ echo "The disk $resp does not exist."
+ DISK=""
+ fi
+}
+
+getrootdisk() {
+ cat << \__getrootdisk_1
+
+The installation program needs to know which disk to consider the root disk.
+Note the unit number may be different than the unit number you used in the
+boot program (especially on a PC with multiple disk controllers).
+Available disks are:
+
+__getrootdisk_1
+ local _defdsk;
+
+ _DKDEVS=`md_get_diskdevs`
+ _defdsk=`echo $_DKDEVS | cutlast`
+ if [ "${_defdsk}" != "${_DKDEVS}" ]; then
+ _defdsk=""
+ fi
+ echo "$_DKDEVS"
+ echo ""
+ echo -n "Which disk is the root disk [${_defdsk}]? "
+ getresp "${_defdsk}"
+ if isin $resp $_DKDEVS ; then
+ ROOTDISK="$resp"
+ else
+ echo ""
+ echo "The disk $resp does not exist."
+ ROOTDISK=""
+ fi
+}
+
+labelmoredisks() {
+ cat << \__labelmoredisks_1
+
+You may label the following disks:
+
+__labelmoredisks_1
+ echo "$_DKDEVS"
+ echo ""
+ echo -n "Label which disk? [done] "
+ getresp "done"
+ case "$resp" in
+ done)
+ ;;
+
+ *)
+ if isin $resp $_DKDEVS ; then
+ md_labeldisk $resp
+ else
+ echo ""
+ echo "The disk $resp does not exist."
+ fi
+ ;;
+ esac
+}
+
+addhostent() {
+ # $1 - IP address
+ # $2 - symbolic name
+
+ # Create an entry in the hosts table. If no host table
+ # exists, create one. If the IP address already exists,
+ # replace its entry.
+ if [ ! -f /tmp/hosts ]; then
+ echo "127.0.0.1 localhost" > /tmp/hosts
+ fi
+
+ sed "/^$1 /d" < /tmp/hosts > /tmp/hosts.new
+ mv /tmp/hosts.new /tmp/hosts
+
+ echo "$1 $2 $2.$FQDN" >> /tmp/hosts
+}
+
+addifconfig() {
+ # $1 - interface name
+ # $2 - interface symbolic name
+ # $3 - interface IP address
+ # $4 - interface netmask
+ # $5 - (optional) interface link-layer directives
+
+ # Create a hostname.* file for the interface.
+ echo "inet $2 $4 NONE $5" > /tmp/hostname.$1
+
+ addhostent $3 $2
+}
+
+configurenetwork() {
+ local _ifsdone
+ local _ifs
+ local _ouranswer
+ local _reprompt
+
+ _IFS=`md_get_ifdevs`
+ _ifsdone=""
+ _ouranswer=""
+ _reprompt=1
+ resp="" # force at least one iteration
+ while [ "X${resp}" != X"done" ]; do
+ if [ $_reprompt = 1 ]; then
+ cat << \__configurenetwork_1
+
+You may configure the following network interfaces (the interfaces
+marked with [X] have been succesfully configured):
+
+__configurenetwork_1
+
+ for _ifs in $_IFS; do
+ if [ "X${_ouranswer}" = "X" ]; then
+ _ouranswer=$_ifs
+ fi
+ if isin $_ifs $_ifsdone ; then
+ echo -n " [X] "
+ else
+ echo -n " [ ] "
+ fi
+ echo $_ifs
+ done
+ echo ""
+ fi
+ echo -n "Configure which interface? (or, enter 'done') [$_ouranswer] "
+ getresp "$_ouranswer"
+ case "$resp" in
+ "done")
+ ;;
+ "")
+ _reprompt=0
+ ;;
+ *)
+ _ifs=$resp
+ if isin $_ifs $_IFS ; then
+ if configure_ifs $_ifs ; then
+ _ifsdone="$_ifs $_ifsdone"
+ fi
+ else
+ echo "Invalid response: \"$resp\" is not in list"
+ fi
+ _ouranswer="done"
+ _reprompt=1
+ ;;
+ esac
+
+ done
+}
+
+configure_ifs() {
+
+ local _up
+ local _interface_name
+ local _interface_ip
+ local _interface_mask
+ local _interface_symname
+ local _interface_extra
+ local _hostname
+
+ _interface_name=$1
+
+ set -- `ifconfig $_interface_name | sed -n '
+ 1s/.*<UP,.*$/UP/p
+ 1s/.*<.*>*$/DOWN/p
+ 2s/inet//
+ 2s/--> [0-9.][0-9.]*//
+ 2s/netmask//
+ 2s/broadcast//
+ 2p'`
+
+ _up=$1
+ _interface_ip=$2
+ _interface_mask=$3
+
+ # Get IP address
+ resp="" # force one iteration
+ while [ "X${resp}" = X"" ]; do
+ echo -n "IP address? [$_interface_ip] "
+ getresp "$_interface_ip"
+ _interface_ip=$resp
+ done
+
+ # Get symbolic name
+ _hostname=`hostname`
+ resp="" # force one iteration
+ while [ "X${resp}" = X"" ]; do
+ echo -n "Symbolic (host) name? [$_hostname] "
+ getresp "$_hostname"
+ _interface_symname=$resp
+ done
+
+ # Get netmask
+ resp=""
+ if [ "X${_interface_mask}" = X"" ]; then
+ _interface_mask=255.255.255.0
+ fi
+ while [ "X${resp}" = X"" ]; do
+ echo -n "Netmask ? [$_interface_mask] "
+ getresp "$_interface_mask"
+ _interface_mask=$resp
+ done
+
+ echo "Your network interface might require additional link-layer"
+ echo "directives (like \`link0'). If this is the case you can enter"
+ echo "these at the next prompt. Values used by some drivers are:"
+ echo " -link0 BNC"
+ echo " link0 -link1 AUI"
+ echo " link0 link1 UTP"
+ echo "(But please keep in mind not all drivers use flags like this)."
+ echo -n "Additional link-layer arguments? [$_interface_extra] "
+ getresp "$_interface_extra"
+ if [ "X${resp}" != X"" ]; then
+ _interface_extra=$resp
+ fi
+
+ # Configure the interface. If it
+ # succeeds, add it to the permanent
+ # network configuration info.
+ if [ $_up != "UP" ]; then
+ ifconfig ${_interface_name} down
+ if ifconfig ${_interface_name} inet \
+ ${_interface_ip} \
+ netmask ${_interface_mask} ${_interface_extra} up ; then
+ addifconfig \
+ ${_interface_name} \
+ ${_interface_symname} \
+ ${_interface_ip} \
+ ${_interface_mask} "${_interface_extra}"
+ return 0
+ fi
+ else
+ echo "Interface ${_interface_name} is already active."
+ echo "Just saving configuration on new root filesystem."
+ addifconfig \
+ ${_interface_name} \
+ ${_interface_symname} \
+ ${_interface_ip} \
+ ${_interface_mask} "${_interface_extra}"
+ fi
+ return 1
+}
+
+# Much of this is gratuitously stolen from /etc/netstart.
+enable_network() {
+
+ # Set up the hostname.
+ if [ ! -f /mnt/etc/myname ]; then
+ echo "ERROR: no /etc/myname!"
+ return 1
+ fi
+ hostname=`cat /mnt/etc/myname`
+ hostname $hostname
+
+ # configure all the interfaces which we know about.
+(
+ tmp="$IFS"
+ IFS="$IFS."
+ set -- `echo /mnt/etc/hostname*`
+ IFS=$tmp
+ unset tmp
+
+ while [ $# -ge 2 ] ; do
+ shift # get rid of "hostname"
+ (
+ read af name mask bcaddr extras
+ read dt dtaddr
+
+ if [ ! -n "$name" ]; then
+ echo "/etc/hostname.$1: invalid network configuration file"
+ exit
+ fi
+
+ cmd="ifconfig $1 $af $name "
+ if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
+ if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
+ if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
+ cmd="$cmd broadcast $bcaddr";
+ fi
+ cmd="$cmd $extras"
+
+ $cmd
+ ) < /mnt/etc/hostname.$1
+ shift
+ done
+)
+
+ # set the address for the loopback interface
+ ifconfig lo0 inet localhost
+
+ # use loopback, not the wire
+ route add $hostname localhost
+
+ # /etc/mygate, if it exists, contains the name of my gateway host
+ # that name must be in /etc/hosts.
+ if [ -f /mnt/etc/mygate ]; then
+ route delete default > /dev/null 2>&1
+ route add default `cat /mnt/etc/mygate`
+ fi
+
+ # enable the resolver, if appropriate.
+ if [ -f /mnt/etc/resolv.conf ]; then
+ _resolver_enabled="TRUE"
+ cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
+ fi
+
+ # Display results...
+ echo "Network interface configuration:"
+ ifconfig -a
+
+ echo ""
+
+ if [ "X${_resolver_enabled}" = X"TRUE" ]; then
+ route show
+ echo ""
+ echo "Resolver enabled."
+ else
+ route -n show
+ echo ""
+ echo "Resolver not enabled."
+ fi
+
+ return 0
+}
+
+# Print the selector and get a response
+# The list of sets is passed in as $1, sets $resp
+get_selection() {
+ local _next
+ local _f
+ local _sets
+
+ _sets=$1
+ _next=""
+ for _f in $_sets ; do
+ if isin $_f $_setsdone ; then
+ echo -n " [X] "
+ _next=""
+ else
+ echo -n " [ ] "
+ if [ -z "$_next" ]; then
+ _next=$_f
+ fi
+ fi
+ echo $_f
+ done
+
+ # Get the name of the file.
+ echo -n "File name [$_next]? "
+ getresp "$_next"
+}
+
+install_url() {
+# Get several parameters from the user, and xfer
+# files from the server.
+# Note: _ftp_server_ip, _ftp_server_dir, _ftp_server_login,
+# _ftp_server_password, and _ftp_active must be global.
+
+local _sets
+local _kernel
+local _f
+local _file_list
+local _get_files
+local _failed_files
+local _osetsdone
+local _url_type
+local _url_base
+local _tfile
+local _matched
+local _action
+
+# Is this an ftp or http install?
+_url_type=$1; shift
+
+echo
+echo "This is an automated ${_url_type}-based installation process. You will be asked"
+echo "questions and then the files will be retrieved iteratively via ftp(1)."
+echo
+
+# Proxy the connections?
+if [ "X${_proxy_host}" = X"" ]; then
+ _proxy_host=none
+fi
+echo -n "HTTP/FTP proxy URL? (if you use a proxy) [${_proxy_host}] "
+getresp "${_proxy_host}"
+if [ "X${resp}" = X"none" ]; then
+ unset _proxy_host ftp_proxy http_proxy
+else
+ _proxy_host=$resp
+ export ftp_proxy=${_proxy_host}
+ export http_proxy=${_proxy_host}
+fi
+if [ "${_url_type}" = "ftp" -a "X$ftp_proxy" = "X" ]; then
+ # Use active mode ftp? (irrelevant if using a proxy)
+ case "${_ftp_active}" in
+ -A) resp=y ;;
+ *) resp=n ;;
+ esac
+ echo "By default, ftp will attempt a passive connection and fall back to a normal"
+ echo "(active) connection if that doesn't work. However, there are some very"
+ echo "old ftp servers that claim to support passive mode, but really do not."
+ echo "In this case, you should explicately request an active session."
+ echo -n "Do you want to use active ftp? [${resp}] "
+ getresp "${resp}"
+ case "$resp" in
+ y*|Y*) _ftp_active=-A ;;
+ *) unset _ftp_active ;;
+ esac
+fi
+
+# Provide a list of possible servers
+echo -n "Do you want a list of potential ${_url_type} servers? [y] "
+getresp "y"
+case "$resp" in
+n*|N*) ;;
+*)
+ ftp ${_ftp_active} -V -a -o - ftp://ftp.openbsd.org/pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/ftplist | grep "^${_url_type}:"
+ ;;
+esac
+
+# Get server IP address
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ eval echo -n "Server IP address or hostname? [\$_${_url_type}_server_ip]\ "
+ eval getresp "\$_${_url_type}_server_ip"
+ eval _${_url_type}_server_ip=$resp
+done
+
+# Get server directory
+if [ "${_url_type}" = "ftp" -a "X${_ftp_server_dir}" = X"" ]; then
+ # Default ftp dir
+ _ftp_server_dir="pub/OpenBSD/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}"
+fi
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ eval echo -n "Server directory? [\$_${_url_type}_server_dir]\ "
+ eval getresp "\$_${_url_type}_server_dir"
+ eval _${_url_type}_server_dir=$resp
+done
+
+if [ "${_url_type}" = "ftp" ]; then
+ # Need default values even if we proxy ftp...
+ if [ "X${_ftp_server_login}" = X"" ]; then
+ _ftp_server_login=anonymous
+ fi
+ if [ "X${_ftp_server_password}" = X"" ]; then
+ _ftp_server_password=root@`hostname`.${FQDN}
+ fi
+
+ # Get login name
+ resp="" # force one iteration
+ while [ "X${resp}" = X"" ]; do
+ echo -n "Login? [${_ftp_server_login}] "
+ getresp "${_ftp_server_login}"
+ _ftp_server_login=$resp
+ done
+
+ # Get password unless anonymous
+ if [ ${_ftp_server_login} != "anonymous" ]; then
+ resp="" # force one iteration
+ while [ "X${resp}" = X"" ]; do
+ echo -n "Password (will not echo): "
+ stty -echo
+ getresp "${_ftp_server_password}"
+ stty echo
+ echo ""
+ _ftp_server_password=$resp
+
+ echo -n "Password (again): "
+ stty -echo
+ getresp "${_ftp_server_password}"
+ stty echo
+ echo ""
+ if [ "${_ftp_server_password}" != "${resp}" ]; then
+ echo "Passwords do not match, try again."
+ resp=""
+ fi
+ done
+ else
+ # only used by ftp_list_files()
+ _ftp_server_password=root@`hostname`.${FQDN}
+ fi
+fi
+
+# Build up the base url since it is so nasty...
+if [ "${_url_type}" = "ftp" -a "${_ftp_server_login}" != "anonymous" ]; then
+ eval _url_base=${_url_type}://${_ftp_server_login}:${_ftp_server_password}@\$_${_url_type}_server_ip/\$_${_url_type}_server_dir
+else
+ eval _url_base=${_url_type}://\$_${_url_type}_server_ip/\$_${_url_type}_server_dir
+fi
+
+# Get list of files from the server.
+# XXX - check for nil $_file_list and deal
+if [ "${_url_type}" = "ftp" -a "X${ftp_proxy}" = X"" ]; then
+ _file_list=`ftp_list_files "$_ftp_server_ip" "$_ftp_server_login" "$_ftp_server_password" "$_ftp_server_dir"`
+else
+ # Assumes index file is "index.txt" for http (or proxy)
+ # We can't use index.html since the format is server-dependent
+ _file_list=`ftp -o - -V ${_url_base}/index.txt | sed 's/ //'`
+fi
+
+_sets=""
+if list_has_sets "$_file_list" $THESETS; then
+ for _f in $THESETS ; do
+ if [ "X${_f}" = "Xkernel" ]; then
+ if isin bsd $_file_list; then
+ _kernel=bsd
+ fi
+ elif isin ${_f}${VERSION}.tar.gz $_file_list; then
+ _sets="$_sets ${_f}${VERSION}.tar.gz"
+ elif isin ${_f}${VERSION}.tgz $_file_list; then
+ _sets="$_sets ${_f}${VERSION}.tgz"
+ fi
+ done
+else
+ eval echo "There are no OpenBSD install sets available in \"\$_${_url_type}_server_dir\"."
+ echo -n "Search for *.tar.gz and *.tgz files? [y] "
+ getresp "y"
+ case "$resp" in
+ n*|N*) return ;;
+ *) ;;
+ esac
+ # *.tar.gz and *.tgz are possible sets
+ _sets=""
+ _kernel=""
+ for _f in ${_file_list} ; do
+ case "$_f" in
+ *.tar.gz|*.tgz) _sets="$_sets ${_f}"
+ esac
+ done
+ if [ "X${_sets}" = X"" ]; then
+ echo "There are no *.tar.gz or *.tgz files in that dir."
+ echo -n "See a directory listing? [y] "
+ getresp "y"
+ case "$resp" in
+ n*|N*) return ;;
+ *) ;;
+ esac
+ echo ""
+ echo "${_file_list}"
+ echo ""
+ return
+ else
+ echo "Adding *.tar.gz and *.tgz files to selector."
+ fi
+fi
+
+# Yes, all those blackslashes really are necesary...
+eval echo "\\\\n"\
+"You will now be asked for files to extract. In addition to the\\\\n"\
+"files listed in the selector you may enter any file located at\\\\n"\
+"\$_${_url_type}_server_ip:\$_${_url_type}_server_dir. You can also enter\\\\n"\
+"'all' to install all the standard sets, or 'list' to list the\\\\n"\
+"files avilable at \$_${_url_type}_server_ip:\$_${_url_type}_server_dir.\\\\n"\
+"When you are done selecting files, enter 'done'.\\\\n"\
+"Some of these sets are required for your ${MODE} and some are optional --\\\\n"\
+"You will want at least the base and bsd sets.\\\\n"\
+"Consult the installation notes if you are not sure which sets are required!"
+_osetsdone="$_setsdone"
+# Set a minimal default
+for _f in $_sets $_kernel; do
+ case "$_f" in
+ base*.tar.gz|base*.tgz|etc*.tar.gz|etc*.tgz|bsd|bsdofw)
+ if ! isin ${_f} ${_setsdone}; then
+ _get_files=`addel ${_f} ${_get_files}`
+ _setsdone=`addel ${_f} ${_setsdone}`
+ fi
+ ;;
+ esac
+done
+
+# Allow the user to select/de-select additional sets
+while : ; do
+ echo ""
+ echo "The following sets are available for extraction."
+ echo "Enter filename, \`list', \`all', or \`done'."
+ echo "You may de-select a set by prepending a '-' to its name."
+ echo ""
+ get_selection "$_sets $_kernel"
+
+ if [ "X${resp}" = X"done" ]; then
+ break
+ elif [ "X${resp}" = X"list" ]; then
+ echo ""
+ eval echo "\$_${_url_type}_server_dir:"
+ echo "${_file_list}"
+ continue
+ elif [ "X${resp}" = X"all" ]; then
+ _get_files="$_sets $_kernel"
+ _setsdone="$_sets $_kernel"
+ break
+ fi
+
+ # Change +/- into add/remove
+ _action=add
+ case "$resp" in
+ +*) resp="${resp#?}"
+ ;;
+ -*) resp="${resp#?}"
+ _action=remove
+ ;;
+ esac
+
+ # Major hack to allow the user to select globbing patterns
+ set -o noglob
+ _tfile=/tmp/install_case.$$ # safe in single user mode
+ cat >$_tfile << OOF
+ case \$_f in
+ $resp) # Add/remove file to extraction list
+ if [ "\$_action" = "add" ]; then
+ _get_files=\`addel \${_f} \${_get_files}\`
+ _setsdone=\`addel \${_f} \${_setsdone}\`
+ elif [ "\$_action" = "remove" ]; then
+ _get_files=\`rmel \${_f} \${_get_files}\`
+ _setsdone=\`rmel \${_f} \${_setsdone}\`
+ else
+ echo "Unknown action: \$_action"
+ fi
+ _matched=\$(( \$_matched + 1 ))
+ ;;
+ esac
+OOF
+ set +o noglob
+
+ # Eww.
+ _matched=0
+ for _f in $_sets $_kernel; do
+ . $_tfile
+ done
+ rm -f $_tfile
+
+ if [ $_matched -eq 0 ]; then
+ eval echo "File \$_${_url_type}_server_dir/$resp does not exist. Check to make"
+ echo "sure you entered the information properly or enter 'list' for a file list."
+ fi
+done
+
+# User may have said "done" without selecting any files
+if [ "X${_get_files}" = X"" ]; then
+ return
+fi
+
+echo
+echo "Fetching files via ${_url_type} may take a long time, especially over a slow network"
+echo -n "connection. Ready to download files? [y] "
+getresp "y"
+case "$resp" in
+ y*|Y*)
+ ;;
+ *)
+ _setsdone="$_osetsdone"
+ return
+ ;;
+esac
+
+# Download the files one at a time and keep track of which ones failed
+while test -n "${_get_files}" ; do
+ _failed_files=""
+ for _f in $_get_files ; do
+ echo ""
+ if [ "X${_f}" = "X${_kernel}" ]; then
+ ( cd /mnt ; ftp ${_ftp_active} -V ${_url_base}/${_f} )
+ else
+ ( cd /mnt ; ftp ${_ftp_active} -o - -V ${_url_base}/${_f} | tar zxvpf - )
+ fi
+ if [ $? -ne 0 ]; then
+ # Mark xfer as having failed,.
+ _setsdone=`rmel $_f $_setsdone`
+ _failed_files="${_failed_files} ${_f}"
+ fi
+ done
+
+ # Give them the option of refetching failed files.
+ _get_files=""
+ while test -n "${_failed_files}" ; do
+ echo ""
+ echo "The following files failed to transfer and extract correctly:"
+ echo "Choose which one(s) to refetch or 'done' to exit selector."
+ echo "You may de-select a file by prepending a '-' to its name."
+ echo ""
+ get_selection "$_failed_files"
+
+ if [ "X${resp}" = X"done" ]; then
+ break
+ elif [ "X${resp}" = X"list" ]; then
+ echo ""
+ eval echo "\$_${_url_type}_server_dir:"
+ echo "${_file_list}"
+ echo ""
+ continue
+ fi
+
+ # Change +/- into add/remove
+ _action=add
+ case "$resp" in
+ +*) resp="${resp#?}"
+ ;;
+ -*) resp="${resp#?}"
+ _action=remove
+ ;;
+ esac
+
+ # Major hack to allow the user to select globbing patterns
+ set -o noglob
+ _tfile=/tmp/install_case.$$ # safe in single user mode
+ cat >$_tfile << OOF
+ case \$_f in
+ $resp) # Add/remove file to extraction list
+ if [ "\$_action" = "add" ]; then
+ _get_files=\`addel \${_f} \${_get_files}\`
+ _setsdone=\`addel \${_f} \${_setsdone}\`
+ elif [ "\$_action" = "remove" ]; then
+ _get_files=\`rmel \${_f} \${_get_files}\`
+ _setsdone=\`rmel \${_f} \${_setsdone}\`
+ else
+ echo "Unknown action: \$_action"
+ fi
+ _matched=\$(( \$_matched + 1 ))
+ ;;
+ esac
+OOF
+ set +o noglob
+
+ # Eww.
+ _matched=0
+ for _f in $_failed_files; do
+ . $_tfile
+ done
+ rm -f $_tfile
+
+ if [ $_matched -eq 0 ]; then
+ eval echo "File \$_${_url_type}_server_dir/$resp does not exist. Check to make"
+ echo "sure you entered the information properly or enter 'list' for a file list."
+ fi
+ done
+done
+}
+
+install_from_mounted_fs() {
+# $1 - directory containing installation sets
+local _sets
+local _kernel
+local _f
+local _get_files
+local _failed_files
+local _osetsdone
+local _tfile
+local _matched
+local _action
+
+if [ ! -d $1 ]; then
+ echo "No such directory: $1"
+ return
+fi
+
+_sets=""
+if dir_has_sets $1 $THESETS; then
+ for _f in $THESETS ; do
+ if [ "X${_f}" = "Xkernel" ]; then
+ if [ -f $1/bsd ]; then
+ _kernel=bsd
+ fi
+ elif [ -f $1/${_f}${VERSION}.tar.gz ]; then
+ _sets="$_sets ${_f}${VERSION}.tar.gz"
+ elif [ -f $1/${_f}${VERSION}.tgz ]; then
+ _sets="$_sets ${_f}${VERSION}.tgz"
+ fi
+ done
+else
+ echo "There are no OpenBSD install sets available in \"$1\"."
+ echo -n "Search for *.tar.gz and *.tgz files? [y] "
+ getresp "y"
+ case "$resp" in
+ n*|N*) return ;;
+ *) ;;
+ esac
+ # *.tar.gz and *.tgz are possible sets
+ _sets=""
+ _kernel=""
+ _sets=`cd $1 ; echo *.tar.gz *.tgz`
+ if [ "X${_sets}" = X'*.tar.gz *.tgz' ]; then
+ echo "There are no *.tar.gz or *.tgz files in that dir."
+ echo -n "See a directory listing? [y] "
+ getresp "y"
+ case "$resp" in
+ n*|N*) return ;;
+ *) ;;
+ esac
+ echo ""
+ ( cd $1 && ls )
+ echo ""
+ return
+ else
+ echo "Adding *.tar.gz and *.tgz files to selector."
+ fi
+fi
+
+echo "\n"\
+"You will now be asked for files to extract. In addition to the\n"\
+"files listed in the selector you may enter any file located in\n"\
+"$1. You can also enter 'all' to install all the standard\n"\
+"sets, or 'list' to list the files avilable in $1.\n"\
+"When you are done selecting files, enter 'done'.\n"\
+"Some of these sets are required for your ${MODE} and some are optional --\n"\
+"You will want at least the base and bsd sets.\n"\
+"Consult the intallation notes if you are not sure which sets are required!"
+_osetsdone="$_setsdone"
+# Set a minimal default
+for _f in $_sets $_kernel; do
+ case "$_f" in
+ base*.tar.gz|base*.tgz|etc*.tar.gz|etc*.tgz|bsd|bsdofw)
+ if ! isin ${_f} ${_setsdone}; then
+ _get_files=`addel ${_f} ${_get_files}`
+ _setsdone=`addel ${_f} ${_setsdone}`
+ fi
+ ;;
+ esac
+done
+
+# Allow the user to select/de-select additional sets
+while : ; do
+ echo ""
+ echo "The following sets are available for extraction."
+ echo "Enter filename, \`list', \`all', or \`done'."
+ echo "You may de-select a set by prepending a '-' to its name."
+ echo ""
+ get_selection "$_sets $_kernel"
+
+ if [ "X${resp}" = X"done" ]; then
+ break
+ elif [ "X${resp}" = X"list" ]; then
+ echo ""
+ echo "${1}:"
+ ( cd $1 && ls )
+ continue
+ elif [ "X${resp}" = X"all" ]; then
+ _get_files="$_sets $_kernel"
+ _setsdone="$_sets $_kernel"
+ break
+ fi
+
+ # Change +/- into add/remove
+ _action=add
+ case "$resp" in
+ +*) resp="${resp#?}"
+ ;;
+ -*) resp="${resp#?}"
+ _action=remove
+ ;;
+ esac
+
+ # Major hack to allow the user to select globbing patterns
+ set -o noglob
+ _tfile=/tmp/install_case.$$ # safe in single user mode
+ cat >$_tfile << OOF
+ case \$_f in
+ $resp) # Add/remove file to extraction list
+ if [ "\$_action" = "add" ]; then
+ _get_files=\`addel \${_f} \${_get_files}\`
+ _setsdone=\`addel \${_f} \${_setsdone}\`
+ elif [ "\$_action" = "remove" ]; then
+ _get_files=\`rmel \${_f} \${_get_files}\`
+ _setsdone=\`rmel \${_f} \${_setsdone}\`
+ else
+ echo "Unknown action: \$_action"
+ fi
+ _matched=\$(( \$_matched + 1 ))
+ ;;
+ esac
+OOF
+ set +o noglob
+
+ # Eww.
+ _matched=0
+ for _f in $_sets $_kernel; do
+ . $_tfile
+ done
+ rm -f $_tfile
+
+ if [ $_matched = 0 ]; then
+ echo "File $1/$resp does not exist. Check to make"
+ echo "sure you entered the information properly or enter 'list' for a file list."
+ fi
+done
+
+# User may have said "done" without selecting any files
+if [ "X${_get_files}" = X"" ]; then
+ return
+fi
+
+echo
+echo -n "Ready to extract selected file sets? [y] "
+getresp "y"
+case "$resp" in
+ y*|Y*)
+ ;;
+ *)
+ _setsdone="$_osetsdone"
+ return
+ ;;
+esac
+
+# Extract the files one at a time and keep track of which ones failed
+while test -n "${_get_files}" ; do
+ _failed_files=""
+ for _f in $_get_files ; do
+ echo ""
+ echo "$1/${_f}:"
+ if [ "X${_f}" = "X${_kernel}" ]; then
+ cp $1/$_f /mnt/$_f
+ else
+ cat $1/$_f | (cd /mnt; tar -zxvpf -)
+ fi
+ if [ $? -ne 0 ]; then
+ # Mark xfer as having failed,.
+ _setsdone=`rmel $_f $_setsdone`
+ _failed_files="${_failed_files} ${_f}"
+ fi
+ done
+
+ # Give them the option of retrying failed files.
+ _get_files=""
+ while test -n "${_failed_files}" ; do
+ echo ""
+ echo "The following files failed to extract correctly:"
+ echo "Choose which one(s) to retry or 'done' to exit selector."
+ echo "You may de-select a file by prepending a '-' to its name."
+ echo ""
+ get_selection "$_failed_files"
+
+ if [ "X${resp}" = X"done" ]; then
+ break
+ elif [ "X${resp}" = X"list" ]; then
+ echo ""
+ echo "${1}:"
+ ( cd $1 && ls )
+ echo ""
+ continue
+ fi
+
+ # Change +/- into add/remove
+ _action=add
+ case "$resp" in
+ +*) resp="${resp#?}"
+ ;;
+ -*) resp="${resp#?}"
+ _action=remove
+ ;;
+ esac
+
+ # Major hack to allow the user to select globbing patterns
+ set -o noglob
+ _tfile=/tmp/install_case.$$ # safe in single user mode
+ cat >$_tfile << OOF
+ case \$_f in
+ $resp) # Add/remove file to extraction list
+ if [ "\$_action" = "add" ]; then
+ _get_files=\`addel \${_f} \${_get_files}\`
+ _setsdone=\`addel \${_f} \${_setsdone}\`
+ elif [ "\$_action" = "remove" ]; then
+ _get_files=\`rmel \${_f} \${_get_files}\`
+ _setsdone=\`rmel \${_f} \${_setsdone}\`
+ else
+ echo "Unknown action: \$_action"
+ fi
+ _matched=\$(( \$_matched + 1 ))
+ ;;
+ esac
+OOF
+ set +o noglob
+
+ # Eww.
+ _matched=0
+ for _f in $_failed_files; do
+ . $_tfile
+ done
+ rm -f $_tfile
+
+ if [ $_matched = 0 ]; then
+ echo "File $1/$resp does not exist. Check to make"
+ echo "sure you entered the information properly or enter 'list' for a file list."
+ fi
+ done
+done
+}
+
+install_cdrom() {
+local _drive
+local _partition_range
+local _partition
+local _fstype
+local _directory
+
+# Get the cdrom device info
+cat << \__install_cdrom_1
+
+The following CD-ROM devices are installed on your system; please select
+the CD-ROM device containing the partition with the installation sets:
+
+__install_cdrom_1
+_CDDEVS=`md_get_cddevs`
+echo "$_CDDEVS"
+echo ""
+echo -n "Which is the CD-ROM with the installation media? [abort] "
+getresp "abort"
+case "$resp" in
+ abort)
+ echo "Aborting."
+ return
+ ;;
+
+ *)
+ if isin $resp $_CDDEVS ; then
+ _drive=$resp
+ else
+ echo ""
+ echo "The CD-ROM $resp does not exist."
+ echo "Aborting."
+ return
+ fi
+ ;;
+esac
+
+# Get partition
+_partition_range=`md_get_partition_range`
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Partition? [c] "
+ getresp "c"
+ case "$resp" in
+ $_partition_range)
+ _partition=$resp
+ ;;
+
+ *)
+ echo "Invalid response: $resp"
+ resp="" # force loop to repeat
+ ;;
+ esac
+done
+
+# Ask for filesystem type
+cat << \__install_cdrom_2
+
+There are two CD-ROM filesystem types currently supported by this program:
+cd9660 ISO-9660
+ffs Berkeley Fast Filesystem
+
+__install_cdrom_2
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Which filesystem type? [cd9660] "
+ getresp "cd9660"
+ case "$resp" in
+ cd9660|ffs)
+ _fstype=$resp
+ ;;
+
+ *)
+ echo "Invalid response: $resp"
+ resp="" # force loop to repeat
+ ;;
+ esac
+done
+
+# Mount the CD-ROM
+if ! mount -t ${_fstype} -o ro \
+ /dev/${_drive}${_partition} /mnt2 ; then
+ echo "Cannot mount CD-ROM drive. Aborting."
+ return
+fi
+
+# Get the directory where the file lives
+if [ "X${_directory}" = X"" ]; then
+ _directory="/${VERSION_MAJOR}.${VERSION_MINOR}/${ARCH}"
+fi
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo "Enter the directory relative to the mount point that"
+ echo -n "contains the file. [${_directory}] "
+ getresp "${_directory}"
+done
+_directory=$resp
+
+install_from_mounted_fs /mnt2/${_directory}
+umount -f /mnt2 > /dev/null 2>&1
+}
+
+mount_a_disk() {
+# Mount a disk on /mnt2. The set of disk devices to choose from
+# is $_DKDEVS.
+# returns 0 on failure.
+
+local _drive
+local _def_partition
+local _partition_range
+local _partition
+local _fstype
+local _fsopts
+local _directory
+local _md_fstype
+local _md_fsopts
+
+getresp "abort"
+case "$resp" in
+ abort)
+ echo "Aborting."
+ return 0
+ ;;
+
+ *)
+ if isin $resp $_DKDEVS ; then
+ _drive=$resp
+ else
+ echo ""
+ echo "The disk $resp does not exist."
+ echo "Aborting."
+ return 0
+ fi
+ ;;
+esac
+
+# Get partition
+cat <<__mount_a_disk_1
+
+The following partitions have been found on $_drive:
+
+__mount_a_disk_1
+disklabel $_drive 2>/dev/null | grep '^ .:'
+echo
+_likely_partition_range=`disklabel $_drive 2>/dev/null | \
+ sed -n -e '/swap/s/.*//' -e '/unused/s/.*//' \
+ -e '/^ .:/{s/^ \(.\).*/\1/;H;}' \
+ -e '${g;s/\n//g;s/^/[/;s/$/]/p;}'`
+_partition_range=`disklabel $_drive 2>/dev/null | \
+ sed -n -e '/^ .:/{s/^ \(.\).*/\1/;H;}' \
+ -e '${g;s/\n//g;s/^/[/;s/$/]/p;}'`
+_def_partition=`echo $_likely_partition_range | \
+ sed -n 's/^\[\(.\).*\]/\1/p'`
+if [ -z "$_def_partition" ]; then
+ _def_partition=`echo $_partition_range | \
+ sed -n 's/^\[\(.\).*\]/\1/p'`
+ if [ -z "$_def_partition" ]; then
+ echo "There are no usable partitions on that disk"
+ return 0
+ fi
+fi
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Partition? [$_def_partition] "
+ getresp "$_def_partition"
+ case "$resp" in
+ $_partition_range)
+ _partition=$resp
+ ;;
+
+ *)
+ echo "Invalid response: $resp"
+ resp="" # force loop to repeat
+ ;;
+ esac
+done
+
+# Ask for filesystem type
+cat << \__mount_a_disk_2
+
+The following filesystem types are supported:
+default (deduced from the disklabel)
+ffs
+__mount_a_disk_2
+_md_fstype=`md_native_fstype`
+_md_fsopts=`md_native_fsopts`
+if [ ! -z "$_md_fstype" ]; then
+ echo " $_md_fstype"
+else
+ _md_fstype="_undefined_"
+fi
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Which filesystem type? [default] "
+ getresp "default"
+ case "$resp" in
+ default)
+ _fstype=""
+ _fsopts="ro"
+ ;;
+ ffs)
+ _fstype="-t $resp"
+ _fsopts="ro"
+ ;;
+ $_md_fstype)
+ _fstype="-t $resp"
+ _fsopts=$_md_fsopts
+ ;;
+ *)
+ echo "Invalid response: $resp"
+ resp="" # force loop to repeat
+ ;;
+ esac
+done
+
+# Mount the disk
+if ! mount $_fstype -o $_fsopts /dev/${_drive}${_partition} /mnt2; then
+ echo "Cannot mount disk. Aborting."
+ return 0
+fi
+return 1
+}
+
+install_disk() {
+local _directory
+
+cat << \__install_disk_1
+
+The following disk devices are installed on your system; please select
+the disk device containing the partition with the installation sets:
+
+__install_disk_1
+_DKDEVS=`md_get_diskdevs`
+echo "$_DKDEVS"
+echo ""
+echo -n "Which is the disk with the installation sets? [abort] "
+
+if mount_a_disk ; then
+ return
+fi
+
+# Get the directory where the file lives
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo "Enter the directory relative to the mount point that"
+ echo -n "contains the file. [${_directory}] "
+ getresp "${_directory}"
+done
+_directory=$resp
+
+install_from_mounted_fs /mnt2/${_directory}
+umount -f /mnt2 > /dev/null 2>&1
+}
+
+install_nfs() {
+# Get the IP address of the server
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Server IP address or hostname? [${_nfs_server_ip}] "
+ getresp "${_nfs_server_ip}"
+done
+_nfs_server_ip=$resp
+
+# Get server path to mount
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
+ getresp "${_nfs_server_path}"
+done
+_nfs_server_path=$resp
+
+# Determine use of TCP
+echo -n "Use TCP transport (only works with capable NFS server)? [n] "
+getresp "n"
+case "$resp" in
+ y*|Y*)
+ _nfs_tcp="-T"
+ ;;
+
+ *)
+ _nfs_tcp=""
+ ;;
+esac
+
+# Mount the server
+mkdir /mnt2 > /dev/null 2>&1
+if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
+ /mnt2 ; then
+ echo "Cannot mount NFS server. Aborting."
+ return
+fi
+
+# Get the directory where the file lives
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo "Enter the directory relative to the mount point that"
+ echo -n "contains the file. [${_nfs_directory}] "
+ getresp "${_nfs_directory}"
+done
+_nfs_directory=$resp
+
+install_from_mounted_fs /mnt2/${_nfs_directory}
+umount -f /mnt2 > /dev/null 2>&1
+}
+
+install_tape() {
+local _xcmd
+
+# Get the name of the tape from the user.
+cat << \__install_tape_1
+
+The installation program needs to know which tape device to use. Make
+sure you use a "no rewind on close" device.
+
+__install_tape_1
+_tape=`basename $TAPE`
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Name of tape device? [${_tape}] "
+ getresp "${_tape}"
+done
+_tape=`basename $resp`
+TAPE="/dev/${_tape}"
+if [ ! -c $TAPE ]; then
+ echo "$TAPE does not exist or is not a character special file."
+ echo "Aborting."
+ return
+fi
+export TAPE
+
+# Rewind the tape device
+echo -n "Rewinding tape..."
+if ! mt rewind ; then
+ echo "$TAPE may not be attached to the system or may not be"
+ echo "a tape device. Aborting."
+ return
+fi
+echo "done."
+
+# Get the file number
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "File number? "
+ getresp ""
+ case "$resp" in
+ [1-9]*)
+ _nskip=`expr $resp - 1`
+ ;;
+
+ *)
+ echo "Invalid file number ${resp}."
+ resp="" # fore loop to repeat
+ ;;
+ esac
+done
+
+# Skip to correct file.
+echo -n "Skipping to source file..."
+if [ "X${_nskip}" != X"0" ]; then
+ if ! mt fsf $_nskip ; then
+ echo "Could not skip $_nskip files. Aborting."
+ return
+ fi
+fi
+echo "done."
+
+cat << \__install_tape_2
+
+There are 2 different ways the file can be stored on tape:
+
+1) an image of a gzipped tar file
+2) a standard tar image
+
+__install_tape_2
+resp="" # force one iteration
+while [ "X${resp}" = X"" ]; do
+ echo -n "Which way is it? [1] "
+ getresp "1"
+ case "$resp" in
+ 1)
+ _xcmd="tar -zxvpf -"
+ ;;
+
+ 2)
+ _xcmd="tar -xvpf -"
+ ;;
+
+ *)
+ echo "Invalid response: $resp."
+ resp="" # force loop to repeat
+ ;;
+ esac
+ ( cd /mnt; dd if=$TAPE | $_xcmd )
+done
+echo "Extraction complete."
+}
+
+get_timezone() {
+local _a
+local _zonepath
+
+#
+# If the zoneinfo is not on the installation medium or on the
+# installed filesystem, set TZ to GMT and return immediatly.
+#
+if [ ! -e /usr/share/zoneinfo -a ! -e /mnt/usr/share/zoneinfo ]; then
+ TZ=GMT
+ return
+fi
+if [ ! -d /usr/share/zoneinfo ]; then
+ _zonepath=/mnt
+else
+ _zonepath=""
+fi
+
+cat << \__get_timezone_1
+
+Select a time zone for your location. Timezones are represented on the
+system by a directory structure rooted in "/usr/share/timezone". Most
+timezones can be selected by entering a token like "CET" or "GMT-6".
+Other zones are grouped by continent, with detailed zone information
+separated by a slash ("/"), e.g. "US/Pacific" or "Canada/Mountain".
+
+To get a listing of what's available in /usr/share/zoneinfo, enter "?"
+at the prompts below.
+
+__get_timezone_1
+if [ X$TZ = X ]; then
+ TZ=`ls -l /mnt/etc/localtime 2>/dev/null | cutlast`
+ TZ=${TZ#/usr/share/zoneinfo/}
+fi
+while : ; do
+ echo -n "What timezone are you in [\`?' for list] [$TZ]? "
+ getresp "$TZ"
+ case "$resp" in
+ "")
+ echo "Timezone defaults to GMT"
+ TZ="GMT"
+ break;
+ ;;
+ "?")
+ ls -F ${_zonepath}/usr/share/zoneinfo
+ ;;
+ *)
+ _a=$resp
+ while [ -d ${_zonepath}/usr/share/zoneinfo/$_a ]; do
+ echo -n "There are several timezones available"
+ echo " within zone '$_a'"
+ echo -n "Select a sub-timezone [\`?' for list]: "
+ getresp ""
+ case "$resp" in
+ "?") ls -F ${_zonepath}/usr/share/zoneinfo/$_a ;;
+ *) _a=${_a}/${resp}
+ if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
+ break;
+ fi
+ ;;
+ esac
+ done
+ if [ -f ${_zonepath}/usr/share/zoneinfo/$_a ]; then
+ TZ="$_a"
+ echo "You have selected timezone \"$_a\"".
+ return
+ fi
+ echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
+ ;;
+ esac
+done
+}
+
+install_sets()
+{
+local _yup
+_yup="FALSE"
+
+# Ask the user which media to load the distribution from.
+cat << \__install_sets_1
+
+It is now time to extract the installation sets onto the hard disk. Make sure
+the sets are either on a local device (i.e. tape, CD-ROM) or on a network
+server. You will have the chance to repeat this step or to extract sets from
+several places, so you don't have to try to load all the sets in one try and
+can recover from some errors.
+
+__install_sets_1
+
+if [ "X$local_sets_dir" != "X" ]; then
+ install_from_mounted_fs ${local_sets_dir}
+ if [ X"$_setsdone" != X ]; then
+ _yup="TRUE"
+ fi
+fi
+
+# Go on prodding for alternate locations
+resp="" # force at least one iteration
+while [ X"${resp}" = X ]; do
+ # If _yup is not FALSE, it means that we extracted sets above.
+ # If that's the case, bypass the menu the first time.
+ if [ X"$_yup" = X"FALSE" ]; then
+ echo -n "Install from (f)tp, h(ttp), (t)ape, (C)D-ROM,"
+ echo -n " (N)FS or local (d)isk? "
+ getresp ""
+ case "$resp" in
+ d*|D*)
+ install_disk
+ resp=d
+ ;;
+ f*|F*)
+ install_url ftp
+ resp=f
+ ;;
+ h*|H*)
+ install_url http
+ resp=h
+ ;;
+ t*|T*)
+ install_tape
+ resp=t
+ ;;
+ c*|C*)
+ install_cdrom
+ resp=c
+ ;;
+ n*|N*)
+ install_nfs
+ resp=n
+ ;;
+ *)
+ echo "Invalid response: $resp"
+ resp=""
+ ;;
+ esac
+ else
+ _yup="FALSE" # So we'll ask next time
+ fi
+
+ if [ ! -f /mnt/bsd ]; then
+ cat << \__install_sets_2
+
+You still do not have a /bsd in your filesystem (ie. the kernel), which
+seems to indicate that you are still missing important distribution files.
+So please continue installing...
+__install_sets_2
+ resp=""
+ fi
+ if [ ! -f /mnt/bin/cat ]; then
+ cat << \__install_sets_3
+
+You still do not have a /bin/cat in your filesystem (ie. a sample random file
+which you probably want). This seems to indicate that you are still missing
+important distribution files. So please continue installing...
+__install_sets_3
+ resp=""
+ fi
+
+ # Give the user the opportunity to extract more sets. They
+ # don't necessarily have to come from the same media.
+ echo ""
+ echo -n "Extract more sets? [n] "
+ getresp "n"
+ case "$resp" in
+ y*|Y*)
+ # Force loop to repeat
+ resp=""
+ ;;
+
+ *)
+ ;;
+ esac
+done
+}
+
+munge_fstab()
+{
+local _fstab
+local _fstab_shadow
+local _dev
+local _mp
+local _fstype
+local _rest
+
+# Now that the 'real' fstab is configured, we munge it into a 'shadow'
+# fstab which we'll use for mounting and unmounting all of the target
+# filesystems relative to /mnt. Mount all filesystems.
+_fstab=$1
+_fstab_shadow=$2
+( while read _dev _mp _fstype _rest; do
+ # Skip comment lines
+ case "$_dev" in
+ \#*) continue;;
+ *) ;;
+ esac
+ # and some filesystem types (like there are swap,kernfs,...)
+ case "$_fstype" in
+ ffs|ufs|nfs) ;;
+ *) continue;;
+ esac
+ if [ "$_mp" = "/" ]; then
+ echo $_dev /mnt $_fstype $_rest
+ else
+ echo $_dev /mnt$_mp $_fstype $_rest
+ fi
+ done ) < $_fstab > $_fstab_shadow
+}
+
+mount_fs()
+{
+# Must mount filesystems manually, one at a time, so we can make
+# sure the mount points exist.
+# $1 is a file in fstab format
+local _fstab
+
+_fstab=$1
+
+( while read line; do
+ set -- $line
+ _dev=$1
+ _mp=$2
+ _fstype=$3
+ _opt=$4
+
+ # If not the root filesystem, make sure the mount
+ # point is present.
+ if [ "X{$_mp}" != X"/mnt" ]; then
+ mkdir -p $_mp
+ fi
+
+ # Mount the filesystem. If the mount fails, exit
+ # with an error condition to tell the outer
+ # later to bail.
+ if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
+ # error message displated by mount
+ exit 1
+ fi
+done ) < $_fstab
+
+if [ "X${?}" != X"0" ]; then
+ cat << \__mount_filesystems_1
+
+FATAL ERROR: Cannot mount filesystems. Double-check your configuration
+and restart the installation process.
+__mount_filesystems_1
+ exit
+fi
+}
+
+unmount_fs()
+{
+# Unmount all filesystems and check their integrity.
+# Usage: [-check] <fstab file>
+local _check
+local _fstab
+local _pid
+
+if [ "$1" = "-check" ]; then
+ _check=1
+ _fstab=$2
+else
+ _check=0
+ _fstab=$1
+fi
+
+if [ ! \( -f $_fstab -a -s $_fstab \) ]; then
+ echo "fstab empty" > /dev/tty
+ return
+fi
+
+(
+ _devs=""
+ _mps=""
+ # maintain reverse order
+ while read line; do
+ set -- $line
+ _devs="$1 ${_devs}"
+ _mps="$2 ${_mps}"
+ done
+ echo -n "Umounting filesystems... "
+ for _mp in ${_mps}; do
+ echo -n "${_mp} "
+ umount ${_mp}
+ done
+ echo "Done."
+
+ if [ $_check = 1 ]; then
+ echo "Checking filesystem integrity..."
+ for _dev in ${_devs}; do
+ echo "${_dev}"
+ fsck -f ${_dev}
+ done
+ fi
+ echo "Done."
+) < $_fstab
+}
+
+check_fs()
+{
+# Check filesystem integrity.
+# $1 is a file in fstab format
+local _fstab
+
+_fstab=$1
+
+(
+ _devs=""
+ _mps=""
+ while read line; do
+ set -- $line
+ _devs="$1 ${_devs}"
+ _mps="$2 ${_mps}"
+ done
+
+ echo "Checking filesystem integrity..."
+ for _dev in ${_devs}; do
+ echo "${_dev}"
+ fsck -f ${_dev}
+ done
+ echo "Done."
+) < $_fstab
+}
diff --git a/distrib/macppc/ramdisk/instbin.conf b/distrib/macppc/ramdisk/instbin.conf
new file mode 100644
index 00000000000..2c379a285f6
--- /dev/null
+++ b/distrib/macppc/ramdisk/instbin.conf
@@ -0,0 +1,34 @@
+# $OpenBSD: instbin.conf,v 1.1 2001/09/01 16:47:03 drahn Exp $
+#
+# instbin.conf - unified binary for the inst/upgr floppies
+#
+
+srcdirs distrib/special
+srcdirs usr.bin bin sbin usr.sbin gnu/usr.bin
+
+progs dd mount_cd9660 df dhclient mount mount_ext2fs sync restore newfs_msdos
+progs stty ln disklabel pax ping cat ifconfig dmesg ls
+progs less mount_nfs pdisk fdisk grep umount mount_msdos rsh fsck
+progs scsi mknod route ftp mount_ffs reboot ed
+progs cp gzip chmod fsck_ffs sort init newfs mount_kernfs
+progs tip rm mt mkdir sed ksh sleep
+progs mv expr test hostname
+progs wicontrol ancontrol
+progs mg
+
+ln mt eject
+ln chmod chgrp
+ln chmod chown
+ln pax tar
+ln pax cpio
+ln less more
+ln grep fgrep
+ln grep egrep
+ln reboot halt
+ln gzip gunzip
+ln gzip gzcat
+ln ksh sh
+ln ksh -sh
+ln test [
+
+libs -ledit -lutil -lcurses -ll -lm -lkvm -lz -lkrb -ldes
diff --git a/distrib/macppc/ramdisk/list b/distrib/macppc/ramdisk/list
new file mode 100644
index 00000000000..92f874b415c
--- /dev/null
+++ b/distrib/macppc/ramdisk/list
@@ -0,0 +1,105 @@
+# $OpenBSD: list,v 1.1 2001/09/01 16:47:03 drahn Exp $
+
+SRCDIRS distrib/special
+SRCDIRS usr.bin bin sbin usr.sbin gnu/usr.bin
+#SRCDIRS usr.bin/vi
+
+# copy the crunched binary, link to it, and kill it
+COPY ${OBJDIR}/instbin instbin
+LINK instbin bin/cat
+LINK instbin bin/chmod bin/chgrp sbin/chown
+LINK instbin bin/cp
+LINK instbin bin/dd
+LINK instbin bin/df
+LINK instbin bin/ed
+LINK instbin bin/expr
+LINK instbin bin/hostname
+LINK instbin bin/ln
+LINK instbin bin/ls
+LINK instbin bin/mkdir
+LINK instbin bin/mt bin/eject
+LINK instbin bin/mv
+LINK instbin bin/pax bin/tar bin/cpio
+LINK instbin bin/rm
+LINK instbin bin/ksh bin/sh
+ARGVLINK ksh -sh
+LINK instbin bin/sleep
+LINK instbin bin/stty
+LINK instbin bin/sync
+LINK instbin bin/test bin/[
+LINK instbin sbin/disklabel
+LINK instbin sbin/ancontrol
+LINK instbin sbin/pdisk
+LINK instbin sbin/fdisk
+LINK instbin sbin/fsck
+LINK instbin sbin/fsck_ffs
+LINK instbin sbin/reboot sbin/halt
+LINK instbin sbin/ifconfig
+LINK instbin sbin/init
+LINK instbin sbin/dhclient
+LINK instbin sbin/dmesg
+LINK instbin sbin/mknod
+LINK instbin sbin/mount
+LINK instbin sbin/mount_cd9660
+LINK instbin sbin/mount_ffs
+LINK instbin sbin/mount_msdos
+LINK instbin sbin/mount_nfs
+LINK instbin sbin/mount_kernfs
+LINK instbin sbin/mount_ext2fs
+LINK instbin sbin/newfs
+LINK instbin sbin/newfs_msdos
+LINK instbin sbin/ping
+LINK instbin sbin/restore
+LINK instbin sbin/route
+#LINK instbin sbin/slattach
+LINK instbin sbin/scsi
+LINK instbin sbin/umount
+LINK instbin sbin/wicontrol
+LINK instbin usr/bin/grep usr/bin/fgrep usr/bin/egrep
+LINK instbin usr/bin/mg
+LINK instbin usr/bin/ftp
+LINK instbin usr/bin/gzip usr/bin/gunzip usr/bin/gzcat
+LINK instbin usr/bin/less usr/bin/more
+LINK instbin usr/bin/rsh
+LINK instbin usr/bin/sed
+LINK instbin usr/bin/sort
+LINK instbin usr/bin/tip
+LINK instbin usr/sbin/chat
+#SYMLINK ../../instbin usr/bin/build usr/bin/vi
+
+# copy the MAKEDEV script and make some devices
+COPY ${DESTDIR}/dev/MAKEDEV dev/MAKEDEV
+SPECIAL cd dev; sh MAKEDEV ramdisk
+#SPECIAL /bin/rm dev/MAKEDEV
+
+# we need the contents of /usr/mdec
+COPY ${DESTDIR}/usr/mdec/ofwboot usr/mdec/ofwboot
+COPY ${DESTDIR}/usr/mdec/mbr usr/mdec/mbr
+COPY ${DESTDIR}/usr/mdec/msdos1mb.gz usr/mdec/msdos1mb.gz
+
+# various files that we need in /etc for the install
+COPY ${DESTDIR}/etc/group etc/group
+COPY ${DESTDIR}/etc/protocols etc/protocols
+COPY ${DESTDIR}/etc/services etc/services
+COPY ${DESTDIR}/etc/spwd.db etc/spwd.db
+COPY ${DESTDIR}/etc/disktab etc/disktab
+SYMLINK /tmp/disktab.shadow etc/disktab
+SYMLINK /tmp/fstab.shadow etc/fstab
+SYMLINK /tmp/resolv.conf.shadow etc/resolv.conf
+SYMLINK /tmp/hosts etc/hosts
+
+# dhcp things
+COPY ${DESTDIR}/sbin/dhclient-script sbin/dhclient-script
+
+# and the common installation tools
+COPY ${TOPDIR}/common/termcap.vt usr/share/misc/termcap
+#COPY ${DESTDIR}/usr/share/misc/scsi_modes usr/share/misc/scsi_modes
+
+# and the installation tools
+COPY dot.profile .profile
+SPECIAL sed -e '/^[ ]*#[ ].*$/d' -e '/^[ ]*#$/d' -e "s/^ARCH=ARCH$/ARCH=`arch -s`/" < ${CURDIR}/install.md > install.md
+COPY ${CURDIR}/../../miniroot/install.sh install
+COPY ${CURDIR}/../../miniroot/upgrade.sh upgrade
+#SPECIAL sed "/^VERSION=/s/=.*/=${REV}/" < ${CURDIR}/install.sub > install.sub
+SPECIAL sed "/^VERSION=/s/=.*/=${REV}/" < ${CURDIR}/../../miniroot/install.sub > install.sub
+SPECIAL chmod 755 install upgrade
diff --git a/distrib/macppc/ramdisk/mtree.conf b/distrib/macppc/ramdisk/mtree.conf
new file mode 100644
index 00000000000..443802bfb29
--- /dev/null
+++ b/distrib/macppc/ramdisk/mtree.conf
@@ -0,0 +1,90 @@
+# $OpenBSD: mtree.conf,v 1.1 2001/09/01 16:47:03 drahn Exp $
+
+/set type=dir uname=root gname=wheel mode=0755
+# .
+.
+
+# ./bin
+bin
+# ./bin
+..
+
+# ./dev
+dev
+# ./dev
+..
+
+# ./etc
+etc
+
+# ./etc
+..
+
+# ./mnt
+mnt
+# ./mnt
+..
+
+# ./mnt2
+mnt2
+# ./mnt2
+..
+
+# ./sbin
+sbin
+# ./sbin
+..
+
+# ./tmp
+tmp mode=01777
+# ./tmp
+..
+
+# ./usr
+usr
+
+# ./usr/bin
+bin
+# ./usr/bin
+..
+
+# ./usr/mdec
+mdec
+# ./usr/mdec
+..
+
+# ./usr/sbin
+sbin
+# ./usr/sbin
+..
+
+# ./usr/share
+share
+
+# ./usr/share/misc
+misc
+# ./usr/share/misc
+..
+
+# ./usr/share
+..
+
+# ./usr
+..
+
+# ./var
+var
+
+# ./var/tmp
+tmp mode=0177
+
+# ./var/tmp
+..
+
+# ./var/db
+db
+# ./var/db
+..
+
+# ./var
+..