#!/bin/rc
-mntgen -s slash /mnt
+# mount points
+mntgen -s slashn /n && chmod 666 /srv/slashn
+mntgen -s slashmnt /mnt && chmod 666 /srv/slashmnt
+mntgen -s mntexport /mnt/exportfs && chmod 666 /srv/mntexport
+
bind /root /mnt/broot
unmount /root
+bind -q '#d' /fd
bind -q '#p' /proc
-for(i in S f k æ t m)
- bind -a '#'^$i /dev >/dev/null >[2=1]
-
-# make variables settable by copying them from #ec
-for(i in init service sysname user nvram rootdir cfs bootdisk bootargs \
- nobootprompt debugfactotum fs fsaddr auth authaddr){
- a=$$i
- $i=()
- rm -f '#e'/$i '#ec'/$i /env/$i
- if(! ~ $#a 0)
- $i=$a
+for(i in S f k æ t b m)
+ bind -qa '#'^$i /dev
+
+# bind in an ip interface
+for(i in I l^(0 1 2 3))
+ bind -qa '#'$i /net
+
+# usualy better than 1970
+cat '#r/rtc' >/dev/time >[2]/dev/null
+
+# reparse variables
+for(i in `{ls -Qp /env}){
+ switch($i){
+ case '*'* 'fn#'* e820 apm0 apid ifs path pid prompt status ?
+ # ignore these
+ case *
+ $i=`{echo $$i}
+ }
+}
+
+fn sigint {
+ status=interrupted
}
fn fatal {
echo -n $1
echo -n $2
if(! ~ $#3 0){
- echo -n ' ['
+ echo -n '['
echo -n $3
echo -n '] '
}
}
mt=()
-. /rc/lib/tcp.rc
-. /rc/lib/local.rc
fn main{
mp=()
if(~ $#nobootprompt 0){
echo
showlocaldevs
- ask bootargs ' is (tcp, local!device)' $bootargs
+ ask bootargs ' is (tcp, tls, il, local!device)' $"bootargs
}
if not bootargs=$nobootprompt
nobootprompt=()
- mn=`{echo $bootargs | awk -F! '{print $1}'}
- ma=`{echo $bootargs | sed 's/[^!]*!?//'}
+ mn=`{echo $bootargs | sed 's,!, ,'}
+ ma=$mn(2-)
+ mn=$mn(1)
switch(m$"mn){
case $mt
mp=m$mn
}
}
- # config method
- $mp(1) $ma
-
# authentication agent
if(! test -f /srv/factotum){
- x=(/boot/factotum -sfactotum)
+ x=(/boot/factotum -n -sfactotum)
if(~ $service cpu){
x=($x -S)
if(~ -k $ff)
}
if not
x=($x -u)
- if(! ~ $#authaddr 0)
- x=($x -a $authaddr)
if(! ~ $#debugfactotum 0)
x=($x -p)
must $x
}
- if not user=`{cat /dev/hostowner}
+
+ # config method
+ $mp(1) $ma
+
+ # load keys from secstore if $auth or $secstore is not empty
+ x=secstore
+ if(~ $#$x 0) x=auth
+ if(! ~ $#$x 0 && test -x /bin/auth/secstore && test -f /mnt/factotum/ctl){
+ x=(auth/secstore -G factotum -s^$$x)
+ if(~ $service cpu)
+ $x -n >/mnt/factotum/ctl
+ if(~ $status *readnvram* || ! ~ $service cpu)
+ $x >/mnt/factotum/ctl
+ }
# connect method
$mp(2) $ma
}
# remove enviroment variables
- rm -f /env/^$mt /env/? /env/?? '/env/fn#'*
+ rm -f '#e/'^$mt '#e/'? '#e/'?? '#e/fn#'*
# remove part of our temporary root
/mnt/broot/$cputype/bin/unmount /$cputype/bin /bin
exec $init
}
-if(test -e '#b' && test -x /bin/aux/kbdfs){
- bind -a '#b' /dev
+# keyboard and serial console
+if(test -x /bin/aux/kbdfs){
a=$console(1)
if(! ~ $#a 0)
a=/dev/eia^$a
- aux/kbdfs -s cons $a
+ aux/kbdfs -q -s cons $a
}
-if(test -e '#u' && test -x /bin/usb/usbd){
- bind -a '#u' /dev
- usb/usbd
+# usb devices
+if(test -x /bin/nusbrc && ! test -e /env/nousbrc)
+ nusbrc
+
+# load boot methods
+fn showlocaldevs {}
+fn configlocal {}
+for(i in /rc/lib/*.rc){
+ . $i
}
-# bind in an ip interface
-for(i in I l^(0 1 2 3))
- bind -qa '#'$i /net
# add partitions and binds
configlocal
while(){
@{main}
+ # subshell doesnt wait on interrupts
+ while(~ $status interrupted){wait}
+
# cleanup so it can be restarted
nobootprompt=()
- user=()
- rm -f /srv/cfs /srv/boot /srv/slashn /srv/cs /srv/dns
-} </dev/cons >/dev/cons >[2]/dev/cons
+ rm -f /srv/^(cfs boot cs dns)
+} </dev/cons