summaryrefslogtreecommitdiff
path: root/rc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-04-12 15:53:55 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-04-12 15:53:55 +0000
commit67e93d6a0a4f15192638e131413b9d64c4269c76 (patch)
tree88fd1d17c4be283683a96ced44159e3ce6b6f2f7 /rc
parent7208d528bd42f981f2535403f72e4c0d7d8df643 (diff)
updating cwfs and moving installer in /rc/bin
Diffstat (limited to 'rc')
-rwxr-xr-xrc/bin/inst/bootfloppy47
-rwxr-xr-xrc/bin/inst/bootplan955
-rwxr-xr-xrc/bin/inst/bootsetup125
-rwxr-xr-xrc/bin/inst/bootwin9x117
-rwxr-xr-xrc/bin/inst/bootwinnt47
-rwxr-xr-xrc/bin/inst/configarch40
-rwxr-xr-xrc/bin/inst/configdist22
-rwxr-xr-xrc/bin/inst/configether53
-rwxr-xr-xrc/bin/inst/configfs23
-rwxr-xr-xrc/bin/inst/configip64
-rwxr-xr-xrc/bin/inst/confignet67
-rwxr-xr-xrc/bin/inst/configppp63
-rwxr-xr-xrc/bin/inst/copydist31
-rwxr-xr-xrc/bin/inst/defs162
-rwxr-xr-xrc/bin/inst/download56
-rwxr-xr-xrc/bin/inst/finish19
-rwxr-xr-xrc/bin/inst/fmtfossil91
-rwxr-xr-xrc/bin/inst/fmtventi190
-rwxr-xr-xrc/bin/inst/gui7
-rwxr-xr-xrc/bin/inst/halt18
-rwxr-xr-xrc/bin/inst/hasmbr12
-rwxr-xr-xrc/bin/inst/hdrs7
-rwxr-xr-xrc/bin/inst/is966012
-rwxr-xr-xrc/bin/inst/isext211
-rwxr-xr-xrc/bin/inst/isfat22
-rwxr-xr-xrc/bin/inst/isfossil16
-rwxr-xr-xrc/bin/inst/isventi13
-rwxr-xr-xrc/bin/inst/isventiarenas13
-rwxr-xr-xrc/bin/inst/isventiisect13
-rwxr-xr-xrc/bin/inst/main115
-rwxr-xr-xrc/bin/inst/mainloop23
-rwxr-xr-xrc/bin/inst/mkini.awk59
-rwxr-xr-xrc/bin/inst/mountdist222
-rwxr-xr-xrc/bin/inst/mountfossil104
-rwxr-xr-xrc/bin/inst/mountfs14
-rwxr-xr-xrc/bin/inst/moveoldfs72
-rwxr-xr-xrc/bin/inst/partdisk73
-rwxr-xr-xrc/bin/inst/prepdisk63
-rwxr-xr-xrc/bin/inst/replcfg18
-rwxr-xr-xrc/bin/inst/startether30
-rwxr-xr-xrc/bin/inst/startppp30
-rwxr-xr-xrc/bin/inst/startwin46
-rwxr-xr-xrc/bin/inst/stop50
-rwxr-xr-xrc/bin/inst/stopether20
-rwxr-xr-xrc/bin/inst/stopppp19
-rwxr-xr-xrc/bin/inst/textonly15
-rwxr-xr-xrc/bin/inst/watchfd17
-rwxr-xr-xrc/bin/inst/xxx9
48 files changed, 2415 insertions, 0 deletions
diff --git a/rc/bin/inst/bootfloppy b/rc/bin/inst/bootfloppy
new file mode 100755
index 000000000..c9aebbc51
--- /dev/null
+++ b/rc/bin/inst/bootfloppy
@@ -0,0 +1,47 @@
+#!/bin/rc
+
+rfork e
+
+echo
+echo 'Insert a disk other than your installation boot disk'
+echo 'into your floppy drive; it will be erased to create'
+echo 'the boot floppy.'
+echo
+echo -n 'Press enter when ready.'
+read >/dev/null >[2]/dev/null
+
+if(~ $#adisk 1)
+ ; # do nothing
+if not if(~ $#bootfile 0)
+ adisk=/dev/fd0disk
+if not {
+ switch($bootfile) {
+ case sd*
+ adisk=`{echo $bootfile | sed 's#(sd..).*#/dev/\1/data#'}
+ case fd*
+ adisk=`{echo $bootfile | sed 's#(fd.).*#/dev/\1disk#'}
+ case *
+ echo 'unknown bootfile '^$bootfile^'; mail 9trouble@plan9.bell-labs.com'
+ exit oops
+ }
+}
+
+if(! ~ `{ls -l $adisk | awk '{print $6}'} 1474560){
+ echo 'Will not format non-floppy disk '^$"adisk. >[1=2]
+ exit 'bad adisk'
+}
+
+log Formatting boot floppy
+if (test -e /n/newfs/386/9loadnousb)
+ bind /n/newfs/386/9loadnousb /n/newfs/386/9load # cater to old bioses
+disk/format -b /386/pbs \
+ -fd $adisk /n/newfs/386/9load /n/newfs/386/9pcdisk.gz \
+ /tmp/plan9ini.bak
+x=$status
+
+if(~ $x ''){
+ echo
+ echo 'Done!'
+ echo
+}
+exit $x
diff --git a/rc/bin/inst/bootplan9 b/rc/bin/inst/bootplan9
new file mode 100755
index 000000000..942c043b0
--- /dev/null
+++ b/rc/bin/inst/bootplan9
@@ -0,0 +1,55 @@
+#!/bin/rc
+
+first=`{ls -p '#S' | sed 1q}
+if(! ~ $first $disk) {
+ echo 'warning: The plan 9 partition is not on the boot disk,'
+ echo 'so making it the active partition will have no effect.'
+}
+
+p9offset=`{grep '^part 9fat ' /dev/$disk/ctl |awk '{print $3}'}
+if(! ~ $#p9offset 1) {
+ echo 'could not find plan 9 partition.'
+ echo 'cannot happen'
+ exit bad
+}
+
+if(test $p9offset -gt 4128695) { # 65536 * 63 - 10
+ echo
+ echo 'Your Plan 9 partition is more than 2GB into your disk,'
+ echo 'and the master boot records used by Windows 9x/ME'
+ echo 'cannot access it (and thus cannot boot it).'
+ echo
+ echo 'You can install the Plan 9 master boot record, which can load'
+ echo 'partitions far into the disk.'
+ echo
+}
+
+echo 'If you use the Windows NT/2000/XP master boot record'
+echo 'or a master boot record from a Unix clone (e.g., LILO or'
+echo 'FreeBSD bootmgr), it is probably safe to continue using'
+echo 'that boot record rather than install the Plan 9 boot record.'
+echo
+prompt 'Install the Plan 9 master boot record' y n
+switch($rd) {
+case n
+ ;
+case y
+ disk/mbr -m /386/mbr /dev/$disk/data
+}
+
+log Setting Plan 9 partition active.
+p9part=`{disk/fdisk /dev/$disk/data >[2]/dev/null </dev/null |
+ grep PLAN9 | sed 1q | sed 's/ *(p.) .*/\1/'}
+if(~ $#p9part 0){
+ echo 'You have no Plan 9 partitions (How could this happen?)' >[1=2]
+ exit 'no plan 9 partition found'
+}
+p9part=$p9part(1)
+{ echo 'A '^$p9part; echo w } | disk/fdisk /dev/$disk/data >[2]/dev/null >/dev/null
+x=$status
+if(~ $x '' '|'){
+ echo
+ echo 'The Plan 9 partition is now marked as active.'
+ exit ''
+}
+exit $x
diff --git a/rc/bin/inst/bootsetup b/rc/bin/inst/bootsetup
new file mode 100755
index 000000000..cc22fe6ee
--- /dev/null
+++ b/rc/bin/inst/bootsetup
@@ -0,0 +1,125 @@
+#!/bin/rc
+
+# desc: create a boot floppy or configure hard disk to boot plan 9
+# prereq: copydist
+
+switch($1) {
+case go
+ echo
+ echo 'Initializing Plan 9 FAT configuration partition (9fat)'
+ echo
+
+ fat=(/dev/sd*/9fat)
+ fat=$fat(1)
+ disk=`{echo $fat | sed 's:/dev/::;s:/9fat::'}
+ bootfs=`{echo $fs | sed 's:/dev/(sd..)/(.*):\1!\2:'}
+ bootfat=`{echo $fs | sed 's:/dev/(sd..)/(.*):\1!9fat:'}
+ if(! test -f /dev/$disk/9fat) {
+ echo 'You have no 9fat partition. Can''t setup booting.'
+ exit
+ }
+
+ if(! test -f /tmp/plan9.ini) {
+ {
+ sfs=`{echo $fs | sed 's;/dev;#S;'}
+ if(~ $fstype fossil fossil+venti){
+ echo bootfile'='$bootfat!9pcf
+ echo 'bootargs=local!'^$sfs
+ echo 'bootdisk=local!'^$sfs
+ }
+ if not {
+ echo bootfile'='$bootfs!/386/9pcdisk
+ echo 'bootdisk=local!'^$sfs
+ }
+ if(~ $fstype fossil+venti){
+ venti=`{echo $ventiarena | sed 's;/dev;#S;'}
+ echo venti'='^$venti
+ }
+ # sort -u avoids dups which could otherwise trigger
+ # pointless boot menus.
+ grep -v '(^\[)|menuitem|adisk|bootfile|bootdisk|bootargs|nobootprompt|mouseport|vgasize|monitor|cdboot' /tmp/plan9.orig |
+ sort -u
+ echo 'mouseport='^$mouseport
+ echo 'monitor='^$monitor
+ echo 'vgasize='^$vgasize
+ } >/tmp/plan9.ini
+ }
+ if(! test -f /tmp/plan9ini.bak)
+ cp /tmp/plan9.ini /tmp/plan9ini.bak
+
+ need9fatformat=no
+ if(! isfat /dev/$disk/9fat)
+ need9fatformat=yes
+ if not if(! mount -c /srv/dos /n/9fat /dev/$disk/9fat >[2]/dev/null)
+ need9fatformat=yes
+ if not if(! test -f /n/9fat/plan9.ini)
+ need9fatformat=yes
+
+ if (test -e /n/newfs/386/9loadnousb)
+ bind /n/newfs/386/9loadnousb /n/newfs/386/9load # cater to old bioses
+ if(~ $need9fatformat yes){
+ log Initializing Plan 9 FAT partition.
+ disk/format -r 2 -d -b /386/pbs \
+ /dev/$disk/9fat /n/newfs/386/9load
+ # silently install pbslba if the partition is way into the disk.
+ # it''s our only hope. only need this for >8.5GB into the disk.
+ # but...
+ # there are so few non-LBA bioses out
+ # there anymore that we'll do this even if we're only 2GB into
+ # the disk. it's just not worth the headaches of dealing with
+ # crappy bioses that don't address the whole 8.5GB properly
+
+ 9fatoffset=`{grep '^part 9fat ' /dev/$disk/ctl | awk '{print $4}'}
+ if(! ~ $#9fatoffset 1) {
+ echo 'could not find plan 9 partition.'
+ echo 'cannot happen'
+ exit bad
+ }
+ if(test $9fatoffset -gt 2097152) # 2GB
+ disk/format -b /386/pbslba /dev/$disk/9fat
+
+ mount -c /srv/dos /n/9fat /dev/$disk/9fat
+ }
+
+ if(! test -f /n/9fat/4e){
+ logprog cp /n/newfs/386/9load /n/9fat/9load
+ logprog cp /n/newfs/386/9pcf /n/9fat/9pcf
+ if(test -f /n/9fat/plan9.ini && ! test -f /n/9fat/plan9-3e.ini)
+ logprog mv /n/9fat/plan9.ini /n/9fat/plan9-3e.ini
+ if(test -f /n/9fat/9pcdisk && ! test -f /n/9fat/9pc3e)
+ logprog mv /n/9fat/9pcdisk /n/9fat/9pc3e
+
+ awk -f /bin/inst/mkini.awk >/n/9fat/plan9.ini
+ >/n/9fat/4e
+ }
+
+ echo
+ echo 'There are myriad ways to boot a Plan 9 system.'
+ echo 'You can use any of the following.'
+ echo
+ echo ' floppy - create a boot floppy'
+ echo ' plan9 - make the plan 9 disk partition the default for booting'
+ echo ' win9x - add a plan 9 option to windows 9x boot menu'
+ echo ' winnt - add a plan 9 option to windows nt/2000/xp boot manager'
+ echo
+ echo 'If you are upgrading an extant third edition installation and booting'
+ echo 'from something other than a floppy, you needn''t run anything here.'
+ echo 'Just type ctl-d.'
+
+ oldbootsetup=$didbootsetup
+ didbootsetup=1
+ export didbootsetup
+ prompt 'Enable boot method' floppy plan9 win9x winnt
+
+ if(! boot$rd){
+ didbootsetup=$oldbootsetup
+ export didbootsetup
+ }
+
+case checkdone
+ xxxfat=(/dev/sd*/9fat)
+ if(! isfat $xxxfat(1) || ! ~ $didbootsetup 1){
+ bootsetup=ready
+ export bootsetup
+ }
+}
diff --git a/rc/bin/inst/bootwin9x b/rc/bin/inst/bootwin9x
new file mode 100755
index 000000000..68c2d1923
--- /dev/null
+++ b/rc/bin/inst/bootwin9x
@@ -0,0 +1,117 @@
+#!/bin/rc
+
+dosdisk=`{ls /dev/sd??/dos >[2]/dev/null | sed 1q | sed 's!.*/(.*)/dos!\1!'}
+if(~ $#dosdisk 0 || ! c: || ! test -f /n/c:/autoexec.bat || ! test -f /n/c:/config.sys) {
+ echo 'Could not find autoexec.bat or config.sys on the first FAT disk.'
+ exit bad
+}
+
+for (i in autoexec config msdos)
+ if(test -f /n/c:/$i.p9) {
+ echo 'A Plan 9 backup already exists; will not edit system files again.'
+ exit bad
+ }
+
+for (i in autoexec.bat config.sys msdos.sys)
+ if(! cp /n/c:/$i /n/c:/^`{echo $i | sed 's/\.(bat|sys)$/.p9/'}) {
+ echo 'Could not back up '^$i^'; will not continue.'
+ exit bad
+ }
+
+if(! test -d /n/c:/plan9 && ! mkdir /n/c:/plan9) {
+ echo 'Could not create directory /n/c:/plan9.'
+ exit bad
+}
+
+if(! cp /n/newfs/386/^(9load ld.com 9pcdisk) /tmp/plan9ini.bak /n/c:/plan9) {
+ echo 'Could not copy Plan 9 boot files into /n/c:/plan9.'
+ exit bad
+}
+
+chmod +w /n/c:/autoexec.bat /n/c:/config.sys /n/c:/msdos.sys
+
+if(grep -si 'Plan ?9' /n/c:/config.sys || grep -si 'Plan ?9' /n/c:/autoexec.bat) {
+ echo 'Plan 9 entries already in config.sys or autoexec.bat.'
+ echo 'Not changing them; refer to Plan 9 install documentation'
+ echo 'to configure manually.'
+ exit bad
+}
+
+if(! grep -si '\[menu\]' /n/c:/config.sys) {
+ {
+ echo 1
+ echo i
+ echo '[menu] '
+ echo 'menuitem=windows, Windows '
+ echo 'menudefault=windows '
+ echo ' '
+ echo '[common] '
+ echo ' '
+ echo '[windows] '
+ echo .
+ echo w
+ echo q
+ } | ed /n/c:/config.sys >/dev/null >[2]/dev/null
+}
+
+{
+ echo 1
+ echo '/\[[Mm][Ee][Nn][Uu]\]'
+ echo '?^[Mm][Ee][Nn][Uu][Ii][Tt][Ee][Mm]='
+ echo a
+ echo 'menuitem=plan9, Plan 9 from Bell Labs '
+ echo .
+ echo '$'
+ echo a
+ echo ' '
+ echo '[plan9] '
+ echo ' '
+ echo .
+ echo w
+ echo q
+} | ed /n/c:/config.sys >/dev/null>[2]/dev/null
+
+{
+ echo 1
+ echo i
+ echo '@echo off '
+ echo 'if %config%==plan9 goto plan9 '
+ echo 'goto notplan9 '
+ echo ':plan9 '
+ echo 'plan9\ld '^$dosdisk^'!dos!plan9/9load '
+ echo ':notplan9 '
+ echo .
+ echo w
+ echo q
+} | ed /n/c:/autoexec.bat >/dev/null>[2]/dev/null
+
+fn zeroopt {
+ if(grep -s '^'^$1^'=1' /n/c:/msdos.sys) {
+ {
+ echo '/^'^$1^'=1/s/=1/=0/'
+ echo w
+ echo q
+ } | ed /n/c:/msdos.sys>/dev/null>[2]/dev/null
+ }
+ if not if (grep -s '^'^$1^'=0' /n/c:/msdos.sys)
+ ;
+ if not {
+ {
+ echo 1
+ echo i
+ echo '[Options] '
+ echo 'Logo=0 '
+ echo .
+ echo w
+ echo q
+ } | ed /n/c:/msdos.sys>/dev/null>[2]/dev/null
+ }
+}
+
+if(grep -si '^\[paths\]' /n/c:/msdos.sys){ # Windows 9x rather than DOS
+ zeroopt Logo
+# zeroopt BootGUI
+}
+
+echo 'Plan 9 added to Windows 9X boot menu.'
+exit ''
diff --git a/rc/bin/inst/bootwinnt b/rc/bin/inst/bootwinnt
new file mode 100755
index 000000000..ee92f5d76
--- /dev/null
+++ b/rc/bin/inst/bootwinnt
@@ -0,0 +1,47 @@
+#!/bin/rc
+
+if(! c: || ! test -f /n/c:/boot.ini) {
+ echo 'Could not find NT''s boot.ini on the first FAT disk.'
+ exit bad
+}
+
+if(test -f /n/c:/boot.p9) {
+ echo 'A Plan 9 backup already exists; will not edit boot.ini again.'
+ exit bad
+}
+
+if(! cp /n/c:/boot.ini /n/c:/boot.p9) {
+ echo 'Could not back up boot.ini; will not continue.'
+ exit bad
+}
+
+chmod +w /n/c:/boot.ini
+
+if(! grep -si '\[operating systems\]' /n/c:/boot.ini) {
+ echo 'Could not parse boot.ini.'
+ exit bad
+}
+
+if(grep -si 'Plan 9' /n/c:/boot.ini) {
+ p9file=`{grep 'Plan 9' /n/c:/boot.ini | sed 1q | sed 's/=.*//'}
+ if(! ~ $p9file [Cc]:'\'*) {
+ echo 'Unexpected Plan 9 entry in boot.ini already; not continuing.'
+ exit bad
+ }
+}
+
+if not {
+ p9file='c:\bootsect.p9'
+ echo 'c:\bootsect.p9 = "Plan 9 from Bell Labs" ' >>/n/c:/boot.ini
+}
+
+p9file=/n/^`{echo $p9file | sed 's!\\!/!g'}
+
+
+if(dd -if /dev/$disk/plan9 -bs 512 -count 1 -of $p9file >/dev/null >[2]/dev/null) {
+ echo 'Plan 9 added to Windows NT boot menu.'
+ exit ''
+}
+
+echo 'Error copying Plan 9 boot sector to file.'
+exit bad
diff --git a/rc/bin/inst/configarch b/rc/bin/inst/configarch
new file mode 100755
index 000000000..61912bfdb
--- /dev/null
+++ b/rc/bin/inst/configarch
@@ -0,0 +1,40 @@
+#!/bin/rc
+
+# desc: set source of distribution archives
+# prereq: mountfs
+
+switch($1) {
+case go
+ echo
+ echo 'Will you be using a distribution archive on local media or the internet?'
+ echo
+
+ prompt 'Distribution is from' local internet
+ archmedium=$rd
+ export archmedium
+
+ switch($archmedium) {
+ case local
+ exec configlocal go
+ case internet
+ exec configip go
+ }
+
+case checkdone
+ switch($#archmedium) {
+ case 1
+ switch($archmedium) {
+ case local
+ exec configlocal checkdone
+ case internet
+ exec configip checkdone
+ case *
+ configarch=notdone
+ export configarch
+ }
+ case *
+ configarch=notdone
+ export configarch
+ }
+}
+
diff --git a/rc/bin/inst/configdist b/rc/bin/inst/configdist
new file mode 100755
index 000000000..3e99bea0d
--- /dev/null
+++ b/rc/bin/inst/configdist
@@ -0,0 +1,22 @@
+#!/bin/rc
+
+# prereq: mountfs
+# desc: choose the source of the distribution archive
+
+switch($1){
+case checkdone
+ if(! ~ $distisfrom net local){
+ configdist=ready
+ export configdist
+ }
+
+case go
+ echo 'Are you going to download the distribution'
+ echo 'from the internet or do you have it on local media?'
+ echo
+ prompt -d local 'Distribution is from' local net
+ distisfrom=$rd
+ export distisfrom
+}
+
+
diff --git a/rc/bin/inst/configether b/rc/bin/inst/configether
new file mode 100755
index 000000000..0922ea339
--- /dev/null
+++ b/rc/bin/inst/configether
@@ -0,0 +1,53 @@
+#!/bin/rc
+
+# desc: configure your internet connection via an ethernet card
+
+switch($1) {
+case go
+ echo
+ echo 'Please choose a method for configuring your ethernet connection.'
+ echo
+ echo ' manual - specify IP address, network mask, gateway IP address'
+ echo ' dhcp - use DHCP to automatically configure'
+ echo
+
+ prompt 'Configuration method' manual dhcp
+ ethermethod=$rd
+ gwaddr=xxx
+ ipaddr=xxx
+ ipmask=xxx
+ switch($ethermethod){
+ case dhcp
+ echo
+ echo 'Some ISPs, notably @HOME, require a host name passed with DHCP'
+ echo 'requests. An example for @HOME would be "cc1018221-a". If your'
+ echo 'ISP supplied you such a name, enter it.'
+ echo
+ prompt -d none 'host name'; dhcphost=$rd
+ switch($dhcphost){
+ case none
+ dhcphost=();
+ case *
+ dhcphost=(-h $dhcphost)
+ }
+ export dhcphost
+ case manual
+ prompt 'ip address'; ipaddr=$rd
+ prompt 'network mask'; ipmask=$rd
+ prompt 'gateway address'; gwaddr=$rd
+ export ipaddr ipmask gwaddr
+ }
+
+ export ethermethod gwaddr ipaddr ipmask dhcphost
+ exec startether go
+
+case checkdone
+ if(! ~ $ethermethod manual dhcp) {
+ configether=notdone
+ export configether
+ }
+ if(~ $ethermethod manual && ~ 0 $#ipaddr $#ipmask $#gwaddr) {
+ configether=notdone
+ export configether
+ }
+}
diff --git a/rc/bin/inst/configfs b/rc/bin/inst/configfs
new file mode 100755
index 000000000..81f82897c
--- /dev/null
+++ b/rc/bin/inst/configfs
@@ -0,0 +1,23 @@
+#!/bin/rc
+
+# desc: choose the type of file system to install
+
+switch($1){
+case checkdone
+ if(! ~ $fstype fossil fossil+venti){
+ configfs=ready
+ export configfs
+ }
+
+case go
+ echo 'You can install the following types of file systems:'
+ echo
+ echo ' fossil the new Plan9 fileserver'
+ echo ' fossil+venti fossil + a archival dump server'
+ echo
+ prompt -d fossil 'File system' fossil fossil+venti
+ fstype=$rd
+ export fstype
+}
+
+
diff --git a/rc/bin/inst/configip b/rc/bin/inst/configip
new file mode 100755
index 000000000..a7873c9f1
--- /dev/null
+++ b/rc/bin/inst/configip
@@ -0,0 +1,64 @@
+#!/bin/rc
+
+switch($1) {
+case go
+
+ devs=''
+ if(test -d '#l/ether0' >[2]/dev/null)
+ devs=$devs^ether
+ if(test -f '#t'/eia? >[2]/dev/null)
+ devs=$devs^ppp
+
+ switch($devs){
+ case ''
+ echo
+ echo 'Could not find ethernet card nor serial port nor modem.'
+ echo 'Please use a local copy of the distribution archive.'
+ echo
+ ifc=none
+
+ case ppp
+ echo
+ echo 'No ethernet card was detected, but there is a serial port or modem.'
+ echo 'We will configure PPP.'
+ echo
+ ifc=ppp
+
+ case ether
+ echo
+ echo 'No serial port or modem detected, but there is an ethernet card.'
+ echo 'We will configure the ethernet.'
+ echo
+ ifc=ether
+
+ case etherppp
+ echo
+ echo 'You can connect to the internet via'
+ echo 'a local ethernet or a dial-up PPP connection.'
+ echo
+ prompt 'Interface to use' ether ppp
+ ifc=$rd
+ }
+
+ ipinterface=$ifc
+ export ipinterface
+
+ switch($ifc) {
+ case ether
+ exec configether go
+ case ppp
+ exec configppp go
+ }
+
+case checkdone
+ if(~ $#ipinterface 1)
+ switch($ipinterface) {
+ case ether
+ exec configether checkdone
+ case ppp
+ exec configppp checkdone
+ }
+ configarch=notdone
+ export configarch
+
+}
diff --git a/rc/bin/inst/confignet b/rc/bin/inst/confignet
new file mode 100755
index 000000000..182ed40cb
--- /dev/null
+++ b/rc/bin/inst/confignet
@@ -0,0 +1,67 @@
+#!/bin/rc
+
+# prereq: configdist
+# desc: configure the network to download the distribution
+
+switch($1){
+case checkready checkdone
+ if(! ~ $distisfrom net){
+ confignet=notdone
+ export confignet
+ exit
+ }
+ if(~ $distisfrom net && ~ $netisfrom ppp ether){
+ x=config$netisfrom
+ $x=done
+ config$netisfrom checkdone
+ confignet=$$x
+ export confignet
+ exit
+ }
+ confignet=ready
+ export confignet
+ exit
+
+case go
+ devs=''
+ if(test -d '#l/ether0' >[2]/dev/null)
+ devs=$devs^ether
+ if(test -f '#t'/eia? >[2]/dev/null)
+ devs=$devs^ppp
+
+ switch($devs){
+ case ''
+ echo
+ echo 'Could not find ethernet card nor serial port nor modem.'
+ echo 'Please use a local copy of the distribution archive.'
+ echo
+ netisfrom=none
+
+ case ppp
+ echo
+ echo 'No ethernet card was detected, but there is a serial port or modem.'
+ echo 'We will configure PPP.'
+ echo
+ netisfrom=ppp
+
+ case ether
+ echo
+ echo 'No serial port or modem detected, but there is an ethernet card.'
+ echo 'We will configure the ethernet.'
+ echo
+ netisfrom=ether
+
+ case etherppp
+ echo
+ echo 'You can connect to the internet via'
+ echo 'a local ethernet or a dial-up PPP connection.'
+ echo
+ prompt 'Interface to use' ether ppp
+ netisfrom=$rd
+ }
+
+ export netisfrom
+ if(~ $netisfrom ether ppp)
+ exec config$netisfrom go
+}
+
diff --git a/rc/bin/inst/configppp b/rc/bin/inst/configppp
new file mode 100755
index 000000000..6bbffc4f0
--- /dev/null
+++ b/rc/bin/inst/configppp
@@ -0,0 +1,63 @@
+#!/bin/rc
+
+# desc: configure your internet connection via ppp over a modem
+
+switch($1) {
+case go
+ devs=`{ls -p '#t/'eia? >[2]/dev/null}
+ if(~ $#devs 0) {
+ echo 'No serial port found; this can''t happen.' # because configip checks
+ exit
+ }
+
+ # not going to use the mouse for PPP
+ if(~ eia^$mouseport $devs)
+ devs=`{echo $devs | sed 's/eia'^$mouseport^'//'}
+
+ if(~ $#devs 0) {
+ echo 'The only serial port you have is your mouse.'
+ echo 'Cannot configure PPP.'
+ exit
+ }
+
+ echo
+ echo 'Please choose the serial port or modem to use to connect to your ISP.'
+ echo
+ for(i in $devs) {
+ n=`{echo $i | sed 's/eia//'}
+ n=`{hoc -e 1+$n}
+ echo ' '^$i^'(Windows'' COM'^$n^')'
+ }
+ echo
+ prompt 'Serial device' $devs
+ pppdev=$rd
+
+ echo
+ echo 'Pick a baud rate for the PPP connection.'
+ echo
+ prompt -d 115200 'Baud rate'
+ pppbaud=$rd
+
+ echo
+ echo 'You can specify your dialup phone number, username, and password,'
+ echo 'or you can log in manually by typing the modem commands yourself.'
+ echo
+ prompt 'Dialing method' auto manual
+ pppmethod=$rd
+
+ switch($pppmethod){
+ case auto
+ prompt 'PPP phone number'; pppphone=$rd
+ prompt 'PPP phone username'; pppuser=$rd
+ prompt 'PPP phone password'; ppppasswd=$rd
+ }
+
+ export pppdev pppmethod pppphone ppppasswd pppuser pppbaud
+ exec startppp go
+
+case checkdone
+ if(! ~ $#pppmethod 1 || ! test -f /dev/$pppdev){
+ configppp=notdone
+ export configppp
+ }
+}
diff --git a/rc/bin/inst/copydist b/rc/bin/inst/copydist
new file mode 100755
index 000000000..507d5602b
--- /dev/null
+++ b/rc/bin/inst/copydist
@@ -0,0 +1,31 @@
+#!/bin/rc
+
+# prereq: mountdist
+# desc: copy the distribution into the file system
+
+switch($1){
+case checkready
+ if(! test -d /n/dist/dist/replica){
+ copydist=notdone
+ export copydist
+ exit
+ }
+ if(test -f /n/newfs/dist/replica/didplan9){
+ copydist=done
+ export copydist
+ exit
+ }
+case go
+ inst/watchfd applylog 0 `{ls -l /n/dist/dist/replica/plan9.log | awk '{print $6}'} 'Installing file system' &
+ replica/pull -c / /rc/bin/inst/replcfg
+ if(~ $status '' *conflicts || test -f /n/newfs/dist/replica/didplan9witherrors)
+ >/n/newfs/dist/replica/didplan9
+ if not
+ >/n/newfs/dist/replica/didplan9witherrors
+
+case checkdone
+ if(! test -f /n/newfs/dist/replica/didplan9){
+ copydist=notdone
+ export copydist
+ }
+}
diff --git a/rc/bin/inst/defs b/rc/bin/inst/defs
new file mode 100755
index 000000000..f9c9454c0
--- /dev/null
+++ b/rc/bin/inst/defs
@@ -0,0 +1,162 @@
+nl='
+'
+tab=' '
+if(~ $#distname 0)
+ distname=plan9
+
+wctl=/dev/null
+if(test -w /dev/wctl)
+ wctl=/dev/wctl
+
+fn log {
+ echo $* >>/srv/log
+}
+
+fn logprog {
+ echo '% '^$"* >>/srv/log
+ $* >[2=1] >>/srv/log
+}
+
+fn sigint {
+ # nothing happens
+}
+
+fn prompt {
+ def=()
+ what=()
+ if(~ $1 -d && ! ~ $#* 1){
+ def=$2
+ shift
+ shift
+ }
+
+ optstr=()
+ if(~ $1 -w && ! ~ $#* 1){
+ optstr=$2
+ shift
+ shift
+ }
+
+ pr=$1
+ shift
+
+ opts=($*)
+ if(~ $#opts 0) {
+ suf=' '
+ }
+ if not if(! ~ $#optstr 0) {
+ if(~ $optstr '')
+ suf=' '
+ if not {
+ pr=$pr^' ('^$"optstr^')'
+ suf=''
+ }
+ }
+ if not {
+ pr=$pr^' ('^$1
+ shift
+ for(i)
+ pr=$pr^', '^$i
+ pr=$pr^')'
+ suf=''
+ }
+
+ if(~ $#def 1)
+ pr=$pr^$suf^'['^$def^']'
+ if not
+ pr=$pr^$suf^'[no default]'
+
+ pr=$pr^': '
+
+
+ okay=no
+ while(~ $okay no) {
+ echo -n current >$wctl
+ echo -n top >$wctl
+ echo -n $pr >[1=2]
+ ifs='' {rd=`{read}}
+ if(~ $#rd 0)
+ exit notdone
+ if(~ $rd !*){
+ ifs='' {rd=`{echo $rd | sed 's/!//'}}
+ echo $rd
+ rc -c $rd
+ echo !$status
+ }
+ if not{
+ rd=`{echo $rd}
+ if(~ $#rd 0 || ~ $rd '')
+ rd=$def
+
+ switch($#opts){
+ case 0
+ if(! ~ $rd '')
+ okay=yes
+ case *
+ if(~ $rd $opts)
+ okay=yes
+ }
+ }
+ }
+ echo -n $rd >/env/rd # just in case
+}
+
+fn desc {
+ echo -n ' '^$1^' - '
+ grep '^# desc: ' $1 | sed 's/# desc: //'
+}
+
+fn prereq {
+ grep '^# prereq:' $1 | sed 's/# prereq://'
+}
+
+fn mustdo {
+ echo You must `{grep '^# mustdo:' $1 | sed 's/# mustdo://'}
+}
+
+# there's no easy way to pass shell variables
+# up from children to parents; the parents have
+# to be coerced into noticing that the environment
+# changed, even when in the same environment group.
+#
+# instead, we explicitly export the variables we want
+# to percolate, and the parent calls coherence to reread
+# the variables.
+#
+# we just append to the vars file, so that later exports
+# override earlier ones; when we call coherence,
+# the duplicates are thrown out.
+
+fn export {
+ null=()
+ nonnull=()
+ for(i in $*){
+ if(~ $#$i 0)
+ null=($null $i)
+ if not
+ nonnull=($nonnull $i)
+ }
+ if(! ~ $#nonnull 0)
+ whatis $nonnull |grep -v '^\./' >>/tmp/vars >[2]/dev/null
+ for(i in $null)
+ echo $i^'=()' >>/tmp/vars
+}
+
+fn coherence {
+ if(test -f /tmp/vars) {
+ grep '^[a-z]*=' /tmp/vars >/tmp/vars2
+ v=`{sed 's/^([a-z]*)=.*/\1/' /tmp/vars2 | sort -u}
+ . /tmp/vars2
+ rm /tmp/vars2
+ rm /tmp/vars
+ export $v
+ }
+}
+
+# ip device stats
+
+fn isipdevup {
+ grep -s $1 /net/ipifc/*/status >[2]/dev/null
+}
+
+
diff --git a/rc/bin/inst/download b/rc/bin/inst/download
new file mode 100755
index 000000000..70d7f5ba7
--- /dev/null
+++ b/rc/bin/inst/download
@@ -0,0 +1,56 @@
+#!/bin/rc
+
+# prereq: mountfs
+# desc: download or continue to download the distribution archives
+
+switch($1) {
+case checkready
+ devs=(`{cat /net/ipifc/*/status >[2]/dev/null |
+ grep -v '127\.0\.0\.1' |
+ sed 's/ .*//'})
+ if(~ $#devs 0) {
+ download=notdone
+ export download
+ }
+ if(~ $mountdist done){
+ download=notdone
+ export download
+ }
+
+case go
+ if(! test -f /srv/cs) {
+ log starting cs, dns
+ logprog ndb/cs >>/srv/log >[2=1]
+ logprog ndb/dns -r >>/srv/log >[2=1]
+ }
+ if(! test -f /net/cs) {
+ logprog mount -a /srv/cs /net
+ logprog mount -a /srv/dns /net
+ }
+
+ # BUG make restartable
+ echo 'Downloading distribution package...'
+ baropt='-w 145,129,445,168'
+ if(~ $textinst 1)
+ baropt=-t
+ if(! hget -vo /n/newfs/dist/_plan9.iso.bz2 $installurl/plan9.iso.bz2 |[2] bargraph $baropt 'downloading '^plan9.iso.bz2)
+ exit
+ mv /n/newfs/dist/_plan9.iso.bz2 /n/newfs/dist/plan9.iso.bz2
+ if(~ $fstype fossil){
+ echo fsys main sync >>/srv/fscons
+ }
+
+ echo 'The distribution is downloaded.'
+
+ srvmedia=()
+ mountmedia=(mount /srv/fossil /n/distmedia)
+ distmediadir=/dist
+ export distmediadir mountmedia distmedia
+
+case checkdone
+ if(! test -f /n/newfs/dist/plan9.iso.bz2) {
+ download=notdone
+ export download
+ }
+}
+
diff --git a/rc/bin/inst/finish b/rc/bin/inst/finish
new file mode 100755
index 000000000..e616e64e1
--- /dev/null
+++ b/rc/bin/inst/finish
@@ -0,0 +1,19 @@
+#!/bin/rc
+
+# desc: finish the installation and reboot
+# prereq: bootsetup
+# mustdo:
+
+switch($1) {
+case checkdone
+ finish=ready
+ export finish
+
+case go
+ if(~ $cdboot yes){
+ echo 'Congratulations; you''ve completed the install.'
+ echo
+ halt
+ }
+ stop go finished
+}
diff --git a/rc/bin/inst/fmtfossil b/rc/bin/inst/fmtfossil
new file mode 100755
index 000000000..98bf33fc1
--- /dev/null
+++ b/rc/bin/inst/fmtfossil
@@ -0,0 +1,91 @@
+#!/bin/rc
+
+# desc: initialize disks for a fossil server
+# prereq: configfs
+
+switch($1){
+case checkready checkdone
+ if(! ~ $fstype fossil+venti fossil){
+ fmtfossil=notdone
+ export fmtfossil
+ exit
+ }
+ ff=`{ls /dev/sd*/fossil* /dev/fs/fossil* >[2]/dev/null}
+ if(~ $#ff 0){
+ fmtfossil=notdone
+ export fmtfossil
+ exit
+ }
+ gg=()
+ for(f in $ff)
+ if(isfossil $f)
+ gg=($gg $f)
+ if(~ $#gg 0){
+ fmtfossil=ready
+ export fmtfossil
+ exit
+ }
+ fmtfossil=done
+ export fmtfossil
+ exit
+
+case go
+ ff=`{ls /dev/sd*/fossil* /dev/fs/fossil* >[2]/dev/null}
+ if(~ $#ff 0){
+ echo 'You need to create a partition or partitions to hold the Fossil write cache.'
+ echo 'The partition name must begin with "fossil".'
+ echo
+ fmtfossil=notdone
+ export fmtfossil
+ exit
+ }
+ default=()
+ if(~ $#ff 1){
+ default=(-d $ff)
+ }
+ echo You have the following fossil partitions.
+ echo
+ prompt $default 'Fossil partition to format' $ff
+ f=$rd
+
+ do=yes
+ if(isfossil $f){
+ echo $f appears to already be formatted as Fossil file system.
+ echo Do you really want to reformat it?
+ echo
+ prompt -d no 'Reformat '$f yes no
+ do=$rd
+ }
+ if(~ $do yes){
+ fossil/flfmt -y $f
+ n=`{cat /dev/swap | grep ' user' | sed 's/^[0-9]+\/([0-9]+) .*/\1/'}
+ if(test $n -gt 32768)
+ m=3000 # if have at least 128 user MB, use 24MB for fossil
+ if not if(test $n -gt 16384)
+ m=1500 # 64 user MB => 12MB for fossil
+ if not if(test $n -gt 8192)
+ m=750 # 32 user MB => 6MB for fossil
+ if not
+ m=256 # 2MB for fossil (this will be slow)
+
+ # if we're using a venti in the back, take hourly snapshots
+ # that retire after three days, in addition to the daily dumps at 5am
+ if(~ $fstype fossil+venti){
+ v=''
+ snap='fsys main snaptime -s 60 -a 0500 -t 2880'
+ }
+ # otherwise, take the daily dumps but nothing else --
+ # we can't retire snapshots unless dumps are being archived
+ if not{
+ v='-V'
+ snap=''
+ }
+ echo \
+'fsys main config '^$f^'
+fsys main open '^$v^' -c '^$m^'
+'^$snap^'
+' | fossil/conf -w $f
+ }
+
+ echo Done.
+}
diff --git a/rc/bin/inst/fmtventi b/rc/bin/inst/fmtventi
new file mode 100755
index 000000000..db79440ac
--- /dev/null
+++ b/rc/bin/inst/fmtventi
@@ -0,0 +1,190 @@
+#!/bin/rc
+
+# desc: initialize disks for a venti server
+# prereq: mountdist
+
+switch($1){
+case checkready checkdone
+ if(! ~ $fstype fossil+venti){
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ if(! test -e /bin/venti/fmtarenas || ! test -e /bin/venti/fmtisect || ! test -e /bin/venti/fmtindex){
+ bind -a /n/dist/386/bin/venti /bin/venti
+ if(! test -e /bin/venti/fmtarenas || ! test -e /bin/venti/fmtisect || ! test -e /bin/venti/fmtindex){
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ }
+ ff=`{ls /dev/sd*/arenas* /dev/fs/arenas* >[2]/dev/null}
+ if(~ $#ff 0){
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ gg=()
+ for(f in $ff)
+ if(isventi $f)
+ gg=($gg $f)
+ if(~ $#gg 0){
+ fmtventi=ready
+ export fmtventi
+ exit
+ }
+
+ ventiarena=$gg(1)
+ export ventiarena
+
+ fmtventi=done
+ export fmtventi
+ exit
+
+case go
+ ff=`{ls /dev/sd*/arenas* /dev/fs/arenas* >[2]/dev/null}
+ if(~ $#ff 0){
+ echo 'You need to create a partition or partitions to hold the Venti arenas.'
+ echo 'The arena partition names must begin with "arenas".'
+ echo
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ default=(-d $"ff)
+ if(! ~ $#ventiarena 0){
+ default=(-d $"ventiarena)
+ }
+ echo You have the following Venti arena partitions.
+ ls -l $ff
+ echo
+
+ prompt $default 'Venti arena partitions to use'
+ aa=`{echo $rd}
+ bad=no
+ for(a in $aa){
+ if(! ~ $a $ff){
+ echo 'Bad venti arena partition' $a
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ }
+ ventiarena=$aa
+ export ventiarena
+
+ gg=`{ls /dev/sd*/isect* /dev/fs/isect* >[2]/dev/null}
+ if(~ $#gg 0){
+ echo 'You need to create a partition or partitions to hold the Venti indices.'
+ echo 'The index partition names must begin with "isect".'
+ echo
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ default=(-d $"gg)
+ if(! ~ $#ventiindex 0){
+ default=(-d $"ventiindex)
+ }
+
+ echo You have the following Venti index partitions.
+ ls -l $gg
+ echo
+
+ prompt $default 'Venti index partitions to use'
+ aa=`{echo $rd}
+ bad=no
+ for(a in $aa){
+ if(! ~ $a $gg){
+ echo 'Bad venti index partition' $a
+ fmtventi=notdone
+ export fmtventi
+ exit
+ }
+ }
+ ventiindex=$aa
+ export ventiindex
+
+ n=-1
+ fmta=()
+ for(a in $ventiarena){
+ do=yes
+ n=`{hoc -e 1+$n}
+ if(isventiarenas $a){
+ echo File $a is already formatted as a Venti arenas partition.
+ prompt -d no 'Reformat '$a yes no
+ do=$rd
+ }
+ if(~ $do yes)
+ fmta=($fmta arenas$n:$a)
+ }
+
+ n=-1
+ fmti=()
+ for(a in $ventiindex){
+ do=yes
+ n=`{hoc -e 1+$n}
+ if(isventiisect $a){
+ echo File $a is already formatted as a Venti index section.
+ prompt -d no 'Reformat '$a yes no
+ do=$rd
+ }
+ if(~ $do yes)
+ fmti=($fmti isect$n:$a)
+ }
+
+ echo Formatting Venti arenas and indices (this takes a while).
+ # do each disk in parallel
+ echo good >/tmp/fmt
+ dd=()
+ for(a in $fmta $fmti){
+ d=`{echo $a | sed 's!.*:(/.*/).*!\1!'}
+ if(! ~ $d $dd)
+ dd=($dd $d)
+ }
+ for(d in $dd){
+ {
+ for(a in $fmta){
+ i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
+ if(~ $i(2) $d){
+ echo $i(3) ...
+ venti/fmtarenas $i(1) $i(3) || echo bad >/tmp/fmt
+ echo done with $i(3)
+ }
+ }
+ for(a in $fmti){
+ i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
+ if(~ $i(2) $d){
+ echo $i(3) ...
+ venti/fmtisect $i(1) $i(3) || echo bad >/tmp/fmt
+ echo done with $i(3)
+ }
+ }
+ } &
+ }
+ wait
+ if(~ bad `{cat /tmp/fmt}){
+ echo There were errors formatting the indices and arenas.
+ fmtventi=ready
+ export fmtventi
+ exit errors
+ }
+
+ echo Done formatting Venti arenas and indices.
+
+ v=$ventiarena(1)
+ echo Storing Venti config on $v...
+ {
+ echo index main
+ for(i in $ventiindex)
+ echo isect $i
+ for(a in $ventiarena)
+ echo arenas $a
+ } | venti/conf -w $v
+
+ echo Initializing index...
+ venti/fmtindex $v
+
+ echo Done with Venti!
+}
+
diff --git a/rc/bin/inst/gui b/rc/bin/inst/gui
new file mode 100755
index 000000000..afb0981d0
--- /dev/null
+++ b/rc/bin/inst/gui
@@ -0,0 +1,7 @@
+#!/bin/rc
+
+cd /bin/inst
+echo blanktime 0 >/dev/vgactl
+. defs
+
+startwin 640 480
diff --git a/rc/bin/inst/halt b/rc/bin/inst/halt
new file mode 100755
index 000000000..4554359f0
--- /dev/null
+++ b/rc/bin/inst/halt
@@ -0,0 +1,18 @@
+#!/bin/rc
+
+echo -n 'Halting file systems...'
+
+if(ps | grep -s ' venti$')
+ venti/sync -h tcp!127.0.0.1!17034
+if(ps | grep -s ' fossil$'){
+ echo fsys all halt >>/srv/fscons
+ slay fossil|rc
+}
+
+echo done
+echo
+echo Remember to take the install disk out of the drive.
+echo Feel free to turn off your computer.
+while()
+ sleep 3600
+
diff --git a/rc/bin/inst/hasmbr b/rc/bin/inst/hasmbr
new file mode 100755
index 000000000..1adaa0a5b
--- /dev/null
+++ b/rc/bin/inst/hasmbr
@@ -0,0 +1,12 @@
+#!/bin/rc
+
+if(! ~ $#* 1) {
+ echo 'usage: hasmbr /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+x=`{xd -b $1 | sed -n '32p;32q'}
+if(~ $x(16) 55 && ~ $x(17) aa)
+ exit ''
+exit nope
+
diff --git a/rc/bin/inst/hdrs b/rc/bin/inst/hdrs
new file mode 100755
index 000000000..0b934999f
--- /dev/null
+++ b/rc/bin/inst/hdrs
@@ -0,0 +1,7 @@
+#!/bin/rc
+
+if(! ~ $#* 1) {
+ echo 'usage: hdrs file.9gz' >[1=2]
+ exit usage
+}
+gunzip < $1 | disk/mkext -h
diff --git a/rc/bin/inst/is9660 b/rc/bin/inst/is9660
new file mode 100755
index 000000000..1d138e55e
--- /dev/null
+++ b/rc/bin/inst/is9660
@@ -0,0 +1,12 @@
+#!/bin/rc
+
+# 0000000 01 C D 0 0 1 01 00 P L A N 9
+
+if(! ~ $#* 1) {
+ echo 'usage: is9660 /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+ifs=$nl {id=`{dd -if $1 -bs 2048 -skip 16>[2]/dev/null | xd -c | sed 1q | sed 's/.........(....................).*/\1/'}}
+~ $id '01 C D 0 0 1 01'
+exit $status
diff --git a/rc/bin/inst/isext2 b/rc/bin/inst/isext2
new file mode 100755
index 000000000..b79265f6a
--- /dev/null
+++ b/rc/bin/inst/isext2
@@ -0,0 +1,11 @@
+#!/bin/rc
+
+if(! ~ $#* 1) {
+ echo 'usage: isext2 /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+cmp -s <{dd -if $1 -bs 1 -count 2 -skip 1080 >[2]/dev/null | xd -b |sed 1q} \
+ <{echo '0000000 53 ef'}
+
+exit $status
diff --git a/rc/bin/inst/isfat b/rc/bin/inst/isfat
new file mode 100755
index 000000000..860278571
--- /dev/null
+++ b/rc/bin/inst/isfat
@@ -0,0 +1,22 @@
+#!/bin/rc
+
+rfork e
+
+# 0000000 eb 3c 90 P l a n 9 . 0 0 00 02 04 02 00
+# 0000010 02 00 02 02 P f8 14 00 ? 00 ff 00 ~ 04 } 00
+# 0000020 02 P 00 00 80 00 ) a8 04 } 00 C Y L I N
+# 0000030 D R I C A L F A T 1 6 fa 8c
+
+if(! ~ $#* 1) {
+ echo 'usage: isfat /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+arg=$1
+fn fat {
+ cmp -s <{dd -if $arg -bs 1 -count 3 -skip $1 >[2]/dev/null} <{echo -n FAT}
+}
+
+fat 54 || fat 82
+exit $status
+
diff --git a/rc/bin/inst/isfossil b/rc/bin/inst/isfossil
new file mode 100755
index 000000000..21c7d3e29
--- /dev/null
+++ b/rc/bin/inst/isfossil
@@ -0,0 +1,16 @@
+#!/bin/rc
+
+if(! ~ $#* 1){
+ echo 'usage: isfossil /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+arg=$1
+if(! cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 127 |
+ dd -quiet 1 -bs 14 -count 1} <{echo 'fossil config'})
+ exit noconfig
+if(! cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 128 |
+ dd -quiet 1 -bs 4 -count 1 | xd -b | sed 1q} <{echo '0000000 37 76 ae 89'})
+ exit notwritebuffer
+exit 0
+
diff --git a/rc/bin/inst/isventi b/rc/bin/inst/isventi
new file mode 100755
index 000000000..555c27a7f
--- /dev/null
+++ b/rc/bin/inst/isventi
@@ -0,0 +1,13 @@
+#!/bin/rc
+
+if(! ~ $#* 1){
+ echo 'usage: isventi /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+arg=$1
+if(! cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 248 |
+ dd -quiet 1 -bs 13 -count 1} <{echo 'venti config'})
+ exit noconfig
+exit 0
+
diff --git a/rc/bin/inst/isventiarenas b/rc/bin/inst/isventiarenas
new file mode 100755
index 000000000..dfce274de
--- /dev/null
+++ b/rc/bin/inst/isventiarenas
@@ -0,0 +1,13 @@
+#!/bin/rc
+
+if(! ~ $#* 1){
+ echo 'usage: isventiarenas /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+arg=$1
+if(! cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 256 |
+ dd -quiet 1 -bs 4 -count 1 | xd -b | sed 1q} <{echo '0000000 a9 e4 a5 e7'})
+ exit notarenas
+exit 0
+
diff --git a/rc/bin/inst/isventiisect b/rc/bin/inst/isventiisect
new file mode 100755
index 000000000..0b11c9c4e
--- /dev/null
+++ b/rc/bin/inst/isventiisect
@@ -0,0 +1,13 @@
+#!/bin/rc
+
+if(! ~ $#* 1){
+ echo 'usage: isventiisect /dev/sdC0/part' >[1=2]
+ exit usage
+}
+
+arg=$1
+if(! cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 256 |
+ dd -quiet 1 -bs 4 -count 1 | xd -b | sed 1q} <{echo '0000000 d1 5c 5e c7'})
+ exit notisect
+exit 0
+
diff --git a/rc/bin/inst/main b/rc/bin/inst/main
new file mode 100755
index 000000000..25ac0d168
--- /dev/null
+++ b/rc/bin/inst/main
@@ -0,0 +1,115 @@
+#!/bin/rc
+
+. defs
+
+while()
+{
+div=--------------------------------------
+echo
+echo $div
+echo
+echo -n 'Preparing menu...'
+
+# must be topologically sorted (by prereq)
+tasks=(\
+ configfs\
+ partdisk prepdisk\
+ fmtfossil\
+ mountfs\
+ configdist\
+ confignet\
+ mountdist\
+ fmtventi\
+ download\
+ copydist\
+ bootsetup finish stop\
+ stopether stopppp\
+)
+# startether startppp stopether stopppp download\
+
+# these don't show up in the menu but still matter
+pseudotasks=(configip havefiles etherup etherdown pppup pppdown)
+
+for(i in $tasks $pseudotasks)
+ $i=notdone
+
+coherence
+
+for(i in $tasks $pseudotasks)
+ if(~ $#$i 0)
+ $i=notdone
+
+#
+# we believe the environment about what is done
+# only if we've confirmed it. since the tasks list is sorted so that
+# prereqs of xxx come before xxx, it's okay to assume xxx
+# is done until proven otherwise -- either a prereq or checkdone
+# will say so.
+#
+
+done=()
+ready=()
+rm /env/done
+rm /env/ready
+for(i in $tasks) {
+ $i=done
+ for(j in `{prereq $i})
+ if(! ~ $$j done)
+ $i=notdone
+ if(~ $$i done) {
+ export $i
+ $i checkdone
+ $i=`{grep '^'$i^'=' /tmp/vars | sed -n '$p' | sed 's/.*=//'}
+ }
+
+ if(~ $$i notdone ready) {
+ okay=yes
+ for(j in `{prereq $i})
+ if(! ~ $$j done)
+ okay=no
+ switch($okay){
+ case yes
+ $i=ready
+ export $i
+ $i checkready
+ $i=`{grep '^'$i^'=' /tmp/vars | sed -n '$p' | sed 's/.*=//'}
+ case no
+ $i=notdone
+ }
+ }
+
+ if(~ $$i done ready)
+ $$i=($$$i $i) # rc can be just as complicated as perl!
+}
+
+export $tasks $pseudotasks done ready
+coherence
+echo
+
+if(! ~ $#done 0) {
+ echo 'The following tasks are done: '
+ for(i in $done)
+ desc $i
+ echo
+}
+
+echo 'The following unfinished tasks are ready to be done:'
+for(i in $ready)
+ desc $i
+echo
+
+if(~ $#ready 0) {
+ echo hey you finished everything! not supposed to happen.
+ sleep 100
+ exit
+}
+
+prompt -d $ready(1) -w '' 'Task to do' $done $ready
+
+echo
+echo $div
+
+$rd go
+$rd=done # if it's not, the check will figure that out
+export $rd
+}
diff --git a/rc/bin/inst/mainloop b/rc/bin/inst/mainloop
new file mode 100755
index 000000000..94d58efc4
--- /dev/null
+++ b/rc/bin/inst/mainloop
@@ -0,0 +1,23 @@
+#!/bin/rc
+
+sleep 86400 &
+cd /bin/inst
+. defs
+fn sigint { }
+
+coherence
+
+disks=`{ls /dev/sd*/data >[2]/dev/null | sed 's!/dev/(sd..)/data!\1!'}
+for (i in /dev/sd*/data)
+ if(test -f $i)
+ disk/fdisk -p $i>`{basename -d $i}^/ctl >[2]/dev/null
+for(i in /dev/sd*/plan9*)
+ if(test -f $i)
+ disk/prep -p $i >`{basename -d $i}^/ctl >[2]/dev/null
+
+# we run this while() here so that ctl-d won''t exit from us -- it''ll only exit main!
+# main contains a while() loop too, to avoid the hit of
+# continually reexecing from here.
+
+while()
+ main
diff --git a/rc/bin/inst/mkini.awk b/rc/bin/inst/mkini.awk
new file mode 100755
index 000000000..7ddf6a80f
--- /dev/null
+++ b/rc/bin/inst/mkini.awk
@@ -0,0 +1,59 @@
+BEGIN{
+ m = "common"
+ haveold = 0;
+ while(getline <"/n/9fat/plan9-3e.ini" > 0){
+ haveold = 1
+ if($0 ~ /\[.*\]/){
+ m = substr($0, 2, length($0)-2)
+ continue
+ }
+ if(m=="menu" && $0 ~ /^menuitem=4e,/)
+ continue
+ a[m] = a[m] $0 "\n"
+ }
+
+ a["4e"] = ""
+ while(getline <"/tmp/plan9.ini" > 0)
+ a["4e"] = a["4e"] $0 "\n"
+
+ if(a["menu"] == "" && haveold){
+ a["menu"] = "menuitem=3e, Plan 9 Third Edition\n"
+ a["3e"] = ""
+ }
+
+ if(a["common"] != ""){
+ for(i in a)
+ if(i != "4e" && i != "common" && i != "menu")
+ a[i] = a["common"] a[i]
+ delete a["common"]
+ }
+
+ bootdisk4e=ENVIRON["fs"]
+ gsub("/dev/", "boot(args|disk|file)=local!#S/", bootdisk4e)
+
+ if(!haveold)
+ print a["4e"]
+ else{
+ print "[menu]"
+ print "menuitem=4e, Plan 9 Fourth Edition"
+ print a["menu"]
+ print ""
+ delete a["menu"]
+
+ print "[4e]"
+ print a["4e"]
+ print ""
+ delete a["4e"]
+
+ for(i in a){
+ # BUG: if rootdir is already there we should rewrite it
+ # sometimes into /3e/whatwasthere
+ if(a[i] ~ bootdisk4e && !(a[i] ~ /rootdir=/))
+ a[i] = "rootdir=/root/3e\n" a[i]
+ print "[" i "]"
+ gsub(/9fat!9pcdisk/, "9fat!9pc3e", a[i])
+ print a[i]
+ print ""
+ }
+ }
+}
diff --git a/rc/bin/inst/mountdist b/rc/bin/inst/mountdist
new file mode 100755
index 000000000..8d171a1cc
--- /dev/null
+++ b/rc/bin/inst/mountdist
@@ -0,0 +1,222 @@
+#!/bin/rc
+
+# prereq: mountfs configdist
+# desc: locate and mount the distribution
+
+fn domount{
+ if(! test -e $mountmedia(2))
+ logprog $srvmedia
+ unmount /n/distmedia >[2]/dev/null
+ logprog $mountmedia
+}
+
+fn exitifdone{
+ if(test -f /n/dist/dist/replica/plan9.db)
+ exit
+}
+
+fn trycdimage{
+ if(test -f $1){
+ rm -f /srv/9660.dist
+ unmount /n/dist
+ 9660srv 9660.dist >[2]/dev/null
+ logprog mount /srv/9660.dist /n/dist $1
+ exitifdone
+ mountdist=notdone
+ export mountdist
+ exit notdone
+ }
+}
+
+fn trycdimagebz2 {
+ if(test -f $1){
+ echo -n 'bunzip2 < '^$1^' >/n/newfs/dist/plan9.iso'
+ bunzip2 < $1 >/n/newfs/dist/_plan9.iso &&
+ mv /n/newfs/dist/_plan9.iso /n/newfs/dist/plan9.iso
+ echo
+ trycdimage /n/newfs/dist/plan9.iso
+ mountdist=notdone
+ export mountdist
+ exit notdone
+ }
+}
+
+fn havedist {
+ test -f $1/dist/replica/plan9.db ||
+ test -f $1/plan9.iso ||
+ test -f $1/plan9.iso.bz2
+}
+
+switch($1){
+case checkready
+ if(! ~ $distisfrom local && ! ~ $download done){
+ mountdist=notdone
+ export mountdist
+ }
+ if(! ~ $#mountmedia 0 1){
+ if(domount){
+ mountdist=done
+ export mountdist
+ if(mountdist checkdone)
+ exit
+ }
+ srvmedia=()
+ mountmedia=()
+ mountdist=ready
+ export srvmedia mountmedia mountdist
+ }
+
+case go
+ fat=()
+ ext2=()
+ x9660=()
+ fossil=()
+
+ echo Please wait... Scanning storage devices...
+
+ parts=`{ls /dev/sd??/* >[2]/dev/null | grep -v '/(plan9.*|ctl|log|raw)$'}
+ for (i in $parts) {
+ echo -n ' '^$i
+ n=`{echo $i | sed 's;/;_;g'}
+ if(! test -f /tmp/localpart.$n)
+ dd -if $i -bs 2048 -count 32 -of /tmp/localpart.$n >[2]/dev/null
+ if(isfat /tmp/localpart.$n)
+ fat=($fat $i)
+ if(isext2 /tmp/localpart.$n)
+ ext2=($ext2 $i)
+ if(is9660 /tmp/localpart.$n)
+ x9660=($x9660 $i)
+ if(isfossil $i)
+ fossil=($fossil $i)
+ echo
+ }
+ echo
+ echo The following storage media were detected.
+ echo Choose the one containing the distribution.
+ echo
+ for(i in $parts){
+ switch($i){
+ case $fat
+ echo ' '^$i^' (microsoft fat)'
+ case $ext2
+ echo ' '^$i^' (linux ext2)'
+ case $x9660
+ echo ' '^$i^' (iso9660 cdrom)'
+ case $fossil
+ echo ' '^$i^' (plan9 fossil)'
+ }
+ }
+ echo
+
+ mountstatus=x
+ while(! ~ $mountstatus ''){
+ prompt -w '' 'Distribution disk' $fat $x9660 $fossil
+ disk=$rd
+
+ srvmedia=()
+ mountmedia=()
+ switch($disk){
+ case $fs
+ mountmedia=(bind /n/newfs /n/distmedia)
+ case $fat
+ srvmedia=(dossrv)
+ mountmedia=(mount /srv/dos /n/distmedia $disk)
+ case $ext2
+ srvmedia=(ext2srv -r)
+ mountmedia=(mount /srv/ext2 /n/distmedia $disk)
+ case $x9660
+ srvmedia=(9660srv)
+ mountmedia=(mount /srv/9660 /n/distmedia $disk)
+ case $fossil
+ echo 'srv fossil.mountdist' > /tmp/fossi.conf
+ echo 'fsys main config '^$disk >> /tmp/fossil.conf
+ echo 'fsys main open -AWVP' >> /tmp/fossil.conf
+ echo 'fsys main' >> /tmp/fossil.conf
+ srvmedia=(fossil/fossil -c '. /tmp/fossil.conf')
+ mountmedia=(mount /srv/fossil.mountdist /n/distmedia)
+ case *
+ echo Unknown disk type '(cannot happen)'
+ exit oops
+ }
+ export srvmedia mountmedia
+ domount
+ mountstatus=$status
+ }
+
+ first=yes
+ dir=/
+ while(~ $first yes || ! havedist /n/distmedia/$dir){
+ if(~ $first yes){
+ echo
+ echo Which directory contains the distribution?
+ echo 'Any of the following will suffice (in order of preference):'
+ echo ' - the root directory of the cd image'
+ echo ' - the directory containing plan9.iso'
+ echo ' - the directory containing plan9.iso.bz2'
+ echo 'Typing `browse'' will put you in a shell that you can use to'
+ echo 'look for the directory.'
+ echo
+ first=no
+ }
+
+ prompt -d browse 'Location of archives'
+ dir=$rd
+ if(~ $dir browse){
+ echo This is a simple shell. Commands are:
+ echo ' cd directory - change to directory'
+ echo ' lc - list contents of current directory'
+ echo ' exit - exit shell'
+ echo
+ echo 'Move to the directory containing the distribution'
+ echo 'and then exit.'
+ echo
+ oifs=$ifs
+ ifs=$nl
+ dir=`{cdsh -r /n/distmedia}
+ ifs=$oifs
+ }
+ if(~ $#dir 0)
+ dir=safdsfdsfdsf
+ if(! ~ $#dir 1)
+ dir=$"dir
+ if(! havedist /n/distmedia/$dir)
+ echo 'No distribution found in '^`{cleanname /$dir}
+ }
+
+ distmediadir=$dir
+ export distmediadir
+
+case checkdone
+ if(! ~ $#distmediadir 1){
+ mountdist=notdone
+ export mountdist
+ exit notdone
+ }
+ if(! havedist /n/distmedia/$distmediadir && ! havedist /n/newfs/dist){
+ mountdist=notdone
+ export mountdist
+ exit notdone
+ }
+
+ exitifdone
+
+ if(test -f /n/distmedia/$distmediadir/dist/replica/plan9.db){
+ bind /n/distmedia/$distmediadir /n/dist
+ bind -a /n/dist/386/bin /bin
+ bind -a /n/dist/rc/bin /bin
+ exitifdone
+ mountdist=notdone
+ export mountdist
+ exit notdone
+ }
+
+ trycdimage /n/distmedia/$distmediadir/plan9.iso
+ trycdimage /n/newfs/dist/plan9.iso
+
+ trycdimagebz2 /n/distmedia/$distmediadir/plan9.iso.bz2
+ trycdimagebz2 /n/newfs/dist/plan9.iso.bz2
+
+ mountdist=notdone
+ export mountdist
+ exit notdone
+}
diff --git a/rc/bin/inst/mountfossil b/rc/bin/inst/mountfossil
new file mode 100755
index 000000000..e98a3f48c
--- /dev/null
+++ b/rc/bin/inst/mountfossil
@@ -0,0 +1,104 @@
+#!/bin/rc
+
+switch($1){
+case checkready checkdone
+ if(! ~ $fmtfossil done){
+ mountfs=notdone
+ export mountfs
+ exit
+ }
+ if(! test -f /dev/sd*/fossil* && ! test -f /dev/fs/fossil*){
+ mountfs=notdone
+ export mountfs
+ exit
+ }
+ if(! ~ $#fossil 1 || ! test -f $fossil){
+ mountfs=ready
+ export mountfs
+ exit
+ }
+ if(! ps | grep -s ' fossil$'){
+ echo 'srv -p fscons' > /env/fossilconf
+ echo 'srv -AP fossil' >> /env/fossilconf
+ fossil/conf $fossil | sed 's/^fsys main open .*/& -AWVP/' |
+ sed 's/^fsys main snaptime .*//' >> /env/fossilconf
+ if(! logprog fossil/fossil -c .' /env/fossilconf'>>[2]/srv/log){
+ echo 'fossil: '^$status
+ mountfs=ready
+ export mountfs
+ exit oops
+ }
+ if(! test -f /srv/fossil){
+ echo 'fossil did not create /srv/fossil'
+ mountfs=ready
+ exit oops
+ }
+ cat /srv/fscons >>/srv/log &
+ if(! logprog mount -c /srv/fossil /n/newfs){
+ echo 'mount: '^$status
+ mountfs=ready
+ export mountfs
+ exit oops
+ }
+ fs=$fossil
+ export fs
+ }
+ if(! test -s /n/newfs/adm/users){
+ echo fsys main create /active/adm adm sys d775 >>/srv/fscons
+ echo fsys main create /active/adm/users adm sys 664 >>/srv/fscons
+ echo uname upas :upas >>/srv/fscons
+ echo users -w >>/srv/fscons
+ sleep 2
+ }
+ if(! test -s /n/newfs/adm/users){
+ echo 'could not create /adm/users'
+ mountfs=ready
+ export mountfs
+ exit oops
+ }
+ for(i in dist dist/replica dist/replica/client){
+ if(! test -d /n/newfs/$i)
+ echo fsys main create /active/$i sys sys d775 >>/srv/fscons
+ sleep 2
+ }
+ if(! test -d /n/newfs/dist/replica/client){
+ echo 'could not create /dist/replica/client'
+ mountfs=ready
+ export mountfs
+ exit oops
+ }
+ if(! test -e /n/newfs/dist/replica/client/plan9.db){
+ echo fsys main create /active/dist/replica/client/plan9.db sys sys 664 >>/srv/fscons
+ echo fsys main create /active/dist/replica/client/plan9.log sys sys a664 >>/srv/fscons
+ }
+ if(test -d /n/newfs/dist/replica/client && test -f /n/newfs/adm/users){
+ mountfs=done
+ export mountfs
+ exit
+ }
+ mountfs=ready
+ export mountfs
+ exit
+
+case go
+ echo 'The following partitions named fossil* were found.'
+ echo
+ echo 'Please choose one to use as the installation file system'
+ echo 'for your Plan 9 installation.'
+ echo
+ files=(`{ls /dev/sd*/fossil* /dev/fs/fossil* >[2]/dev/null})
+ ls -l $files
+ echo
+ if(~ $#fossil 1 && ~ $fossil $files)
+ default=(-d $fossil)
+ if not if(~ $#files 1)
+ default=(-d $files)
+ if not
+ default=()
+ prompt $default 'Fossil partition' $files
+ slay fossil|rc
+ fossil=$rd
+ export fossil
+}
+
+
diff --git a/rc/bin/inst/mountfs b/rc/bin/inst/mountfs
new file mode 100755
index 000000000..8aa9b16ff
--- /dev/null
+++ b/rc/bin/inst/mountfs
@@ -0,0 +1,14 @@
+#!/bin/rc
+
+# desc: choose and mount file system partition
+# prereq: configfs
+
+switch($fstype){
+case fossil fossil+venti
+ exec mountfossil $*
+case *
+ mountfs=notdone
+ export mountfs
+ exit
+}
+
diff --git a/rc/bin/inst/moveoldfs b/rc/bin/inst/moveoldfs
new file mode 100755
index 000000000..819beeb39
--- /dev/null
+++ b/rc/bin/inst/moveoldfs
@@ -0,0 +1,72 @@
+#!/bin/rc
+
+# desc: move an old third edition plan 9 file system out of the way
+# prereq: mountfs
+
+rootfiles=(\
+ 386\
+ 68000\
+ 68020\
+ LICENSE\
+ NOTICE\
+ acme\
+ adm\
+ alpha\
+ arm\
+ cron\
+ dist\
+ fd\
+ lib\
+ lp\
+ mail\
+ mips\
+ mnt\
+ n\
+ power\
+ rc\
+ sparc\
+ sys\
+ tmp\
+ usr/glenda\
+ wrap\
+)
+
+switch($1){
+case checkready
+ if(! test -d /n/kfs/wrap){
+ moveoldfs=done
+ export moveoldfs
+ }
+
+case go
+ if(test -d /n/kfs/wrap){
+ echo 'You have a Third Edition Plan 9 installation on '^$fs^'.'
+ echo 'We need to move the old file system out of the way (into /3e)'
+ echo 'in order to continue.'
+ echo
+ prompt 'Move old file system' y n
+ switch($rd){
+ case y
+ kname=`{kfsname $fs}
+ log Moving old Plan 9 installation into /3e on kfs
+ logprog disk/kfscmd -n$kname 'create /3e sys sys 555 d' >>[2]/srv/log
+ logprog disk/kfscmd -n$kname 'create /3e/usr sys sys 555 d' >>[2]/srv/log
+ for(i in $rootfiles)
+ if(test -e /n/kfs/$i)
+ logprog disk/kfscmd -n$kname 'rename /'^$i^' /3e/'^$i
+ # copy extant /adm/users in case there have been modifications
+ logprog disk/kfscmd -n$kname 'create /adm adm adm 555 d' >>[2]/srv/log
+ logprog cp /n/kfs/3e/adm/users /n/kfs/adm/users >>[2]/srv/log
+
+ case n
+ echo 'Okay, but we can''t continue.'
+ echo
+ }
+ }
+
+case checkdone
+ if(test -d /n/kfs/wrap){
+ moveoldfs=notdone
+ export moveoldfs
+ }
+}
diff --git a/rc/bin/inst/partdisk b/rc/bin/inst/partdisk
new file mode 100755
index 000000000..430d45f3f
--- /dev/null
+++ b/rc/bin/inst/partdisk
@@ -0,0 +1,73 @@
+#!/bin/rc
+
+# desc: edit partition tables (e.g., to create a plan 9 partition)
+# prereq: configfs
+
+switch($1){
+case go
+ disks=`{ls /dev/sd*/data >[2]/dev/null | sed 's!/dev/(sd..)/data!\1!'}
+ if(~ $#disks 0) {
+ echo 'No disk devices were found on your system.'
+ echo 'The installation process cannot continue.'
+ exit giveup
+ }
+
+ echo 'The following disk devices were found.'
+ echo
+ for(i in $disks) {
+ desc=`{cat /dev/$i/ctl | sed 1q | sed 's/inquiry //'}
+ echo $i '-' $desc
+ echo e | disk/fdisk -r /dev/$i/data >[2]/dev/null | grep -v '^ mbr'
+ echo
+ }
+
+ okay=no
+ defdisk=$disks(1)
+
+ if(~ $#disks 1)
+ default=(-d $disks)
+ if not
+ default=()
+ prompt $default 'Disk to partition' $disks
+ disk=$rd
+
+ if(! hasmbr /dev/$disk/data) {
+ echo 'The disk you selected HAS NO master boot record on its first sector.'
+ echo '(Perhaps it is a completely blank disk.)'
+ echo 'You need a master boot record to use the disk.'
+ echo 'Should we install a default master boot record?'
+ echo
+ prompt 'Install mbr' y n
+ switch($rd) {
+ case y
+ disk/mbr -m /386/mbr /dev/$disk/data
+ pickdisk=done
+ }
+ }
+ echo
+ echo 'This is disk/fdisk; use it to create a Plan 9 partition.'
+ echo 'If there is enough room, a Plan 9 partition will be'
+ echo 'suggested; you can probably just type ''w'' and then ''q''.'
+ echo
+ disk/fdisk -a /dev/$disk/data
+ disk/fdisk -p /dev/$disk/data >/dev/$disk/ctl >[2]/dev/null
+ for(i in /dev/sd*/plan9*){
+ if(test -f $i){
+ d=`{basename -d $i}
+ disk/prep -p $i >$d/ctl >[2]/dev/null
+ }
+ }
+
+case checkdone
+ # we want at least one disk with both an mbr and a plan9 partition
+ mbrandplan9=0
+ disks=`{ls /dev/sd*/plan9 >[2]/dev/null | sed 's!/dev/(sd..)/plan9!\1!'}
+ for(disk in $disks) {
+ if(hasmbr /dev/$disk/data)
+ mbrandplan9=1
+ }
+ if(~ $mbrandplan9 0){
+ partdisk=notdone
+ export partdisk
+ }
+}
diff --git a/rc/bin/inst/prepdisk b/rc/bin/inst/prepdisk
new file mode 100755
index 000000000..6ef4a92f8
--- /dev/null
+++ b/rc/bin/inst/prepdisk
@@ -0,0 +1,63 @@
+#!/bin/rc
+
+# desc: subdivide plan 9 disk partition
+# prereq: partdisk
+
+fn autotype {
+ if(~ $fstype fossil)
+ echo -a 9fat -a nvram -a fossil -a swap
+ if(~ $fstype fossil+venti)
+ echo -a 9fat -a nvram -a arenas -a isect -a fossil -a swap # -a other
+}
+
+switch($1) {
+case checkready
+ if(! test -f /dev/sd*/plan9*){
+ prepdisk=notdone
+ export prepdisk
+ }
+
+case go
+ echo 'The following Plan 9 disk partitions were found.'
+ echo
+ disks=(/dev/sd*/plan9*)
+ for (i in $disks){
+ echo $i
+ echo q | disk/prep -r $i >[2]/dev/null
+ echo
+ }
+ if(~ $#disks 1)
+ default=(-d $disks)
+ if not
+ default=()
+ prompt $default 'Plan 9 partition to subdivide' $disks
+ disk=$rd
+
+ echo 'This is disk/prep; use it to subdivide the Plan 9 partition.'
+ echo 'If it is not yet subdivided, a sensible layout will be suggested;'
+ echo 'you can probably just type ''w'' and then ''q''.'
+ echo
+ disk/prep `{autotype} $disk
+ disk/prep -p $disk >`{basename -d $disk}^/ctl >[2]/dev/null
+
+case checkdone
+ if(! test -f /dev/sd*/9fat)
+ prepdisk=ready
+
+ if(! ~ $prepdisk ready){
+ prepdisk=done
+ switch($fstype){
+ case fossil
+ if(! test -f /dev/sd*/fossil* && ! test -f /dev/fs/fossil*)
+ prepdisk=ready
+ case fossil+venti
+ if(! test -f /dev/sd*/fossil* && ! test -f /dev/fs/fossil*)
+ prepdisk=ready
+ if(! test -f /dev/sd*/arenas && ! test -f /dev/fs/arenas*)
+ prepdisk=ready
+ if(! test -f /dev/sd*/isect && ! test -f /dev/fs/isect*)
+ prepdisk=ready
+ }
+ }
+ export prepdisk
+}
diff --git a/rc/bin/inst/replcfg b/rc/bin/inst/replcfg
new file mode 100755
index 000000000..30aed8607
--- /dev/null
+++ b/rc/bin/inst/replcfg
@@ -0,0 +1,18 @@
+#!/bin/rc
+
+s=/n/dist/dist/replica
+serverroot=/n/dist
+serverlog=$s/plan9.log
+serverproto=$s/plan9.proto
+fn servermount { status='' }
+fn serverupdate { status='' }
+
+fn clientmount { status='' }
+c=/n/newfs/dist/replica
+clientroot=/n/newfs
+clientproto=$c/plan9.proto
+clientdb=$c/client/plan9.db
+clientexclude=(dist/replica/client)
+clientlog=$c/client/plan9.log
+
+applyopt=(-t -u -T$c/client/plan9.time)
diff --git a/rc/bin/inst/startether b/rc/bin/inst/startether
new file mode 100755
index 000000000..077504c1a
--- /dev/null
+++ b/rc/bin/inst/startether
@@ -0,0 +1,30 @@
+#!/bin/rc
+
+# desc: activate ethernet card
+# prereq: configether
+
+switch($1) {
+case checkready
+ if(isipdevup /net/ether0) {
+ startether=done
+ export startether
+ }
+
+case go
+ if(isipdevup /net/ether0)
+ exit
+
+ log starting ethernet $ethermethod config
+ switch($ethermethod) {
+ case manual
+ ip/ipconfig -g $gwaddr ether /net/ether0 $ipaddr $ipmask >>[2]/srv/log
+ case dhcp
+ ip/ipconfig $dhcphost -D >>/srv/log >[2=1]
+ }
+
+case checkdone
+ if(! isipdevup /net/ether0) {
+ startether=notdone
+ export startether
+ }
+}
diff --git a/rc/bin/inst/startppp b/rc/bin/inst/startppp
new file mode 100755
index 000000000..02bc090ef
--- /dev/null
+++ b/rc/bin/inst/startppp
@@ -0,0 +1,30 @@
+#!/bin/rc
+
+# desc: activate ppp connection
+# prereq: configppp
+
+switch($1) {
+case checkready checkdone
+ if (isipdevup '^pkt[0-9]')
+ startppp=done
+ export startppp
+
+case go
+ if(isipdevup '^pkt[0-9]')
+ exit
+
+ ctl=$pppdev^ctl
+ echo b115200 >$ctl
+
+ switch($pppmethod) {
+ case manual
+ echo
+ echo 'Please dial the modem, and type ctl-d when PPP has started.'
+ echo 'You may need to type ctl-m to send modem commands.'
+ echo
+ ip/ppp -f -u -b b^$pppbaud -p /dev/^$pppdev
+
+ case auto
+ ip/ppp -f -b b^$pppbaud -p /dev/^$pppdev -s $"pppuser:$"ppppasswd -t 'atdt'^$"pppphone
+ }
+}
diff --git a/rc/bin/inst/startwin b/rc/bin/inst/startwin
new file mode 100755
index 000000000..bcd542890
--- /dev/null
+++ b/rc/bin/inst/startwin
@@ -0,0 +1,46 @@
+#!/bin/rc
+
+fn time { date | sed 's/.........$//'}
+
+rm -f /srv/log
+
+if(~ $#* 2) {
+ wid=$1
+ ht=$2
+}
+if not {
+ scr=(`{cat /dev/draw/new >[2]/dev/null || status=''})
+ wid=$scr(7)
+ ht=$scr(8)
+}
+
+if(test $ht -gt 800)
+ ht=800
+
+if(test $wid -gt 800)
+ wid=800
+
+statwid=`{hoc -e $wid^'*.2'}
+if(test $statwid -lt 180)
+ statwid=180
+if(test $statwid -gt 300)
+ statwid=300
+
+logwid=`{hoc -e $wid^-$statwid}
+if(test $logwid -gt 1000)
+ logwid=1000
+
+loght=`{hoc -e $ht^'*.25'}
+if(test $loght -lt 130)
+ loght=130
+
+textht=`{hoc -e $ht^-$loght}
+
+window 0,$textht,$statwid,$ht stats -lmisce
+window $statwid,$textht,^`{hoc -e $logwid+$statwid}^,$ht tailfsrv
+window 0,0,^`{hoc -e $logwid+$statwid}^,$textht inst/mainloop
+
+while(! test -f /srv/log)
+ sleep 1
+
+log `{time} Installation process started
diff --git a/rc/bin/inst/stop b/rc/bin/inst/stop
new file mode 100755
index 000000000..a1d48694f
--- /dev/null
+++ b/rc/bin/inst/stop
@@ -0,0 +1,50 @@
+#!/bin/rc
+
+# desc: save the current installation state, to be resumed later
+# prereq:
+# mustdo:
+
+switch($1) {
+case checkdone
+ stop=notdone
+ export stop
+
+case checkready
+ if(~ $cdboot yes){
+ stop=notdone
+ export stop
+ }
+
+case go
+ coherence
+ switch($2){
+ case finished
+ echo 'We need to write the state of the current installation to the install floppy,'
+ echo 'so that you can pick up from here if, for example, you want to set up'
+ echo 'more boot methods.'
+ echo
+ case *
+ echo 'We need to write the state of the current installation to the install floppy.'
+ echo 'so that you can pick up from here when you wish to continue.'
+ echo
+ }
+ echo -n 'Please make sure the install floppy is in the floppy drive and press enter.'
+ read >/dev/null >[2]/dev/null
+
+ if(! a:) {
+ echo 'Couldn''t mount the floppy disk; sorry.'
+ exit
+ }
+
+ if(cp /tmp/vars /n/a:/9inst.cnf || cp /tmp/vars /n/a:/9inst.cnf) {
+ echo 'Your install state has been saved to the install floppy.'
+ if(~ $2 finished){
+ echo
+ echo 'Congratulations; you''ve completed the install.'
+ }
+ echo
+ halt
+ }
+
+ echo 'Couldn''t save the state to your install floppy. Sorry.'
+}
diff --git a/rc/bin/inst/stopether b/rc/bin/inst/stopether
new file mode 100755
index 000000000..59063f0e0
--- /dev/null
+++ b/rc/bin/inst/stopether
@@ -0,0 +1,20 @@
+#!/bin/rc
+
+# desc: shut down the ethernet connection
+# prereq:
+
+
+switch($1) {
+case checkready
+ if(! isipdevup /net/ether0) {
+ stopether=notdone
+ export stopether
+ }
+
+case go
+ ip/ipconfig ether /net/ether0 unbind
+
+case checkdone
+ stopether=notdone
+ export stopether
+}
diff --git a/rc/bin/inst/stopppp b/rc/bin/inst/stopppp
new file mode 100755
index 000000000..70b9ce1fe
--- /dev/null
+++ b/rc/bin/inst/stopppp
@@ -0,0 +1,19 @@
+#!/bin/rc
+
+# desc: shut down the ppp connection
+# prereq:
+
+switch($1) {
+case checkready
+ if(! ~ $#pppdev 1 || ! isipdevup '^pkt[0-9]') {
+ stopppp=notdone
+ export stopppp
+ }
+
+case go
+ kill ppp | rc
+
+case checkdone
+ stopppp=notdone
+ export stopppp
+}
diff --git a/rc/bin/inst/textonly b/rc/bin/inst/textonly
new file mode 100755
index 000000000..1c3922ce4
--- /dev/null
+++ b/rc/bin/inst/textonly
@@ -0,0 +1,15 @@
+#!/bin/rc
+
+# text-only install
+cd /bin/inst
+. defs
+
+textinst=1
+export textinst
+
+tailfsrv &
+while(! test -f /srv/log)
+ sleep 1
+log `{date} Installation process started
+inst/mainloop
+
diff --git a/rc/bin/inst/watchfd b/rc/bin/inst/watchfd
new file mode 100755
index 000000000..ca37294e3
--- /dev/null
+++ b/rc/bin/inst/watchfd
@@ -0,0 +1,17 @@
+#!/bin/rc
+
+p=`{ps | grep $1 | sed 's/[^ ]* +([^ ]+) .*/\1/' }
+while(! ~ $#p 1) {
+ sleep 1
+ p=`{ps | grep $1 | sed 's/[^ ]* +([^ ]+) .*/\1/'}
+}
+p=$p(1)
+
+baropt='-w 145,129,445,168'
+if(~ $textinst 1)
+ baropt=-t
+
+{
+ while(test -f /proc/$p/fd)
+ grep '^ *'^$2^' ' /proc/$p/fd >[2]/dev/null
+} | awk '{print $9 " '^$3^'"; fflush("/dev/stdout")}' | bargraph $baropt $4
diff --git a/rc/bin/inst/xxx b/rc/bin/inst/xxx
new file mode 100755
index 000000000..56b4eb23a
--- /dev/null
+++ b/rc/bin/inst/xxx
@@ -0,0 +1,9 @@
+#!/bin/rc
+
+ip/ipconfig
+echo ' auth=204.178.31.3
+ authdom=cs.bell-labs.com' >>/net/ndb
+ndb/cs
+auth/factotum
+bind -a /bin/auth /
+cpu -e clear -h tcp!204.178.31.2