updating cwfs and moving installer in /rc/bin

This commit is contained in:
cinap_lenrek 2011-04-12 15:53:55 +00:00
parent 7208d528bd
commit 67e93d6a0a
96 changed files with 549 additions and 1170 deletions

47
rc/bin/inst/bootfloppy Executable file
View file

@ -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

55
rc/bin/inst/bootplan9 Executable file
View file

@ -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

125
rc/bin/inst/bootsetup Executable file
View file

@ -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
}
}

117
rc/bin/inst/bootwin9x Executable file
View file

@ -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 ''

47
rc/bin/inst/bootwinnt Executable file
View file

@ -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

40
rc/bin/inst/configarch Executable file
View file

@ -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
}
}

22
rc/bin/inst/configdist Executable file
View file

@ -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
}

53
rc/bin/inst/configether Executable file
View file

@ -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
}
}

23
rc/bin/inst/configfs Executable file
View file

@ -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
}

64
rc/bin/inst/configip Executable file
View file

@ -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
}

67
rc/bin/inst/confignet Executable file
View file

@ -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
}

63
rc/bin/inst/configppp Executable file
View file

@ -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
}
}

31
rc/bin/inst/copydist Executable file
View file

@ -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
}
}

162
rc/bin/inst/defs Executable file
View file

@ -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
}

56
rc/bin/inst/download Executable file
View file

@ -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
}
}

19
rc/bin/inst/finish Executable file
View file

@ -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
}

91
rc/bin/inst/fmtfossil Executable file
View file

@ -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.
}

190
rc/bin/inst/fmtventi Executable file
View file

@ -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!
}

7
rc/bin/inst/gui Executable file
View file

@ -0,0 +1,7 @@
#!/bin/rc
cd /bin/inst
echo blanktime 0 >/dev/vgactl
. defs
startwin 640 480

18
rc/bin/inst/halt Executable file
View file

@ -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

12
rc/bin/inst/hasmbr Executable file
View file

@ -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

7
rc/bin/inst/hdrs Executable file
View file

@ -0,0 +1,7 @@
#!/bin/rc
if(! ~ $#* 1) {
echo 'usage: hdrs file.9gz' >[1=2]
exit usage
}
gunzip < $1 | disk/mkext -h

12
rc/bin/inst/is9660 Executable file
View file

@ -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

11
rc/bin/inst/isext2 Executable file
View file

@ -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

22
rc/bin/inst/isfat Executable file
View file

@ -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

16
rc/bin/inst/isfossil Executable file
View file

@ -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

13
rc/bin/inst/isventi Executable file
View file

@ -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

13
rc/bin/inst/isventiarenas Executable file
View file

@ -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

13
rc/bin/inst/isventiisect Executable file
View file

@ -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

115
rc/bin/inst/main Executable file
View file

@ -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
}

23
rc/bin/inst/mainloop Executable file
View file

@ -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

59
rc/bin/inst/mkini.awk Executable file
View file

@ -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 ""
}
}
}

222
rc/bin/inst/mountdist Executable file
View file

@ -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
}

104
rc/bin/inst/mountfossil Executable file
View file

@ -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
}

14
rc/bin/inst/mountfs Executable file
View file

@ -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
}

72
rc/bin/inst/moveoldfs Executable file
View file

@ -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
}
}

73
rc/bin/inst/partdisk Executable file
View file

@ -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
}
}

63
rc/bin/inst/prepdisk Executable file
View file

@ -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
}

18
rc/bin/inst/replcfg Executable file
View file

@ -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)

30
rc/bin/inst/startether Executable file
View file

@ -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
}
}

30
rc/bin/inst/startppp Executable file
View file

@ -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
}
}

46
rc/bin/inst/startwin Executable file
View file

@ -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

50
rc/bin/inst/stop Executable file
View file

@ -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.'
}

20
rc/bin/inst/stopether Executable file
View file

@ -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
}

19
rc/bin/inst/stopppp Executable file
View file

@ -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
}

15
rc/bin/inst/textonly Executable file
View file

@ -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

17
rc/bin/inst/watchfd Executable file
View file

@ -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

9
rc/bin/inst/xxx Executable file
View file

@ -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