184 lines
2.8 KiB
Plaintext
184 lines
2.8 KiB
Plaintext
|
# TODO
|
||
|
# settime
|
||
|
# handle rootspec
|
||
|
# handle rootdir
|
||
|
# clean rc environment before running init(8)
|
||
|
# kfs
|
||
|
# caching
|
||
|
|
||
|
rfork e
|
||
|
# boot methods
|
||
|
mlocal = (configlocal connectlocal)
|
||
|
mtcp = (configtcp connecttcp)
|
||
|
mtab = (mlocal mtcp)
|
||
|
config=1
|
||
|
connect=2
|
||
|
bootargs=()
|
||
|
|
||
|
. /rc/lib/conf.rc
|
||
|
. /rc/lib/menu.rc
|
||
|
. /rc/lib/local.rc
|
||
|
. /rc/lib/tcp.rc
|
||
|
|
||
|
cputype=`{cat '#e'/cputype}
|
||
|
|
||
|
fn fatal {
|
||
|
echo $*
|
||
|
exit $"*
|
||
|
}
|
||
|
|
||
|
fn must {
|
||
|
$* || fatal $"*^': '^$status
|
||
|
}
|
||
|
|
||
|
|
||
|
fn usbinit{
|
||
|
if(test -f '#u'){
|
||
|
bind -a '#u' /dev
|
||
|
# TODO: check access to /dev/usb
|
||
|
must usbd
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn kbmap{
|
||
|
if(! ~ $#kbmap 0){
|
||
|
bind -a '#κ' /dev
|
||
|
cat $kbmap > /dev/kbmap
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn readmethod{
|
||
|
resp=()
|
||
|
timeo=5
|
||
|
found=0
|
||
|
|
||
|
echo
|
||
|
echo Storage devices
|
||
|
for(i in /dev/sd??){
|
||
|
echo -n local!^$i' '
|
||
|
echo `{sed 's/inquiry[ ]+//g; q' $i/ctl}\
|
||
|
partitions: `{cat $i/ctl | grep part | awk '{print $2}'}
|
||
|
}
|
||
|
|
||
|
while(~ $found 0){
|
||
|
if(~ $#pcload 0)
|
||
|
echo -n 'root is from: '
|
||
|
if not
|
||
|
echo -n 'kernel is at: '
|
||
|
|
||
|
while(~ $#resp 0){
|
||
|
resp=`{tread $timeo}
|
||
|
if(! ~ $status ''){
|
||
|
bootconf # set configuration from file
|
||
|
if(! ~ $#nobootprompt 0)
|
||
|
bootargs=$nobootprompt
|
||
|
resp=$bootargs
|
||
|
}
|
||
|
if(~ $resp !rc)
|
||
|
rc
|
||
|
timeo=0
|
||
|
}
|
||
|
|
||
|
method=`{echo $resp | awk -F! '{print $1}'}
|
||
|
NF=`{echo $resp | awk -F! '{print NF}'}
|
||
|
|
||
|
for(i in `{seq 1 $#mtab}){
|
||
|
if(~ $mtab($i) m^$method)
|
||
|
found = $i
|
||
|
}
|
||
|
|
||
|
if(~ $found 0){
|
||
|
echo method $method not found
|
||
|
resp=()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
methodarg = `{echo $resp | sed 's/^[A-Za-z]+!(.*)$/\1/'}
|
||
|
mp = $$mtab($found)
|
||
|
}
|
||
|
|
||
|
fn authentication{
|
||
|
# in pcload we only need to read the kernel
|
||
|
if(~ $pcload 1)
|
||
|
user=none
|
||
|
|
||
|
if(! test -x /boot/factotum){
|
||
|
if(~ $#user 0)
|
||
|
user=glenda
|
||
|
echo -n $user > '#c'/hostowner
|
||
|
}
|
||
|
|
||
|
if not{
|
||
|
x=(/boot/factotum -u -sfactotum)
|
||
|
if(~ $cpuflag 1)
|
||
|
x=($x -S)
|
||
|
if(! ~ $#authaddr 0)
|
||
|
x=($x -a $authaddr)
|
||
|
if(! ~ $#debugfactotum 0)
|
||
|
x=($x -p)
|
||
|
|
||
|
must $x
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn swapproc{
|
||
|
if(test -x '#c'/swap)
|
||
|
echo -n start > '#c'/swap
|
||
|
}
|
||
|
|
||
|
usbinit # set up usb keyboard, mouse, and disk, if any
|
||
|
kbmap
|
||
|
|
||
|
configlocal # add partitions and binds
|
||
|
|
||
|
readmethod
|
||
|
$mp($config)
|
||
|
|
||
|
switch($method){
|
||
|
case local
|
||
|
islocal=1
|
||
|
case hybrid
|
||
|
ishybrid=1
|
||
|
}
|
||
|
|
||
|
# authentication agent
|
||
|
authentication
|
||
|
|
||
|
# connect to the root file system
|
||
|
$mp($connect)
|
||
|
|
||
|
swapproc
|
||
|
|
||
|
mount -c '#s/boot' /root
|
||
|
|
||
|
# remove part of our temporary root
|
||
|
unmount /$cputype/bin /bin
|
||
|
/mnt/broot/$cputype/bin/unmount /rc/bin /bin
|
||
|
/mnt/broot/$cputype/bin/unmount /boot /bin
|
||
|
/mnt/broot/$cputype/bin/unmount /
|
||
|
|
||
|
if(~ $pcload 1)
|
||
|
/boot/echo reboot /root/$kern >/dev/reboot
|
||
|
|
||
|
# create the name space, mount the root fs
|
||
|
/mnt/broot/$cputype/bin/bind / /
|
||
|
/mnt/broot/$cputype/bin/mount -ac '#s/boot' /
|
||
|
|
||
|
# remove the remaining temporary root
|
||
|
/mnt/broot/$cputype/bin/unmount /mnt/broot
|
||
|
|
||
|
rootdir=/root
|
||
|
|
||
|
if(~ $#init 0){
|
||
|
init=/$cputype/init
|
||
|
if(~ $cpuflag 1)
|
||
|
init=($init -c)
|
||
|
if not
|
||
|
init=($init -t)
|
||
|
# TODO handle mflag
|
||
|
}
|
||
|
|
||
|
$init
|
||
|
|
||
|
|