2011-04-30 20:17:33 +00:00
|
|
|
#!/bin/rc
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-30 20:17:33 +00:00
|
|
|
bind -q '#p' /proc
|
|
|
|
|
|
|
|
bind -qa '#S' /dev
|
|
|
|
bind -qa '#f' /dev
|
|
|
|
bind -qa '#k' /dev
|
|
|
|
bind -qa '#æ' /dev
|
|
|
|
|
|
|
|
fn set {
|
|
|
|
a=$$1
|
|
|
|
$1=()
|
|
|
|
rm -f '#e'/$1 '#ec'/$1 /env/$1
|
|
|
|
if(! ~ $#a 0)
|
|
|
|
$1=$a
|
|
|
|
}
|
|
|
|
|
|
|
|
# convert plan9.ini variables
|
|
|
|
set init
|
|
|
|
set user
|
|
|
|
set nvram
|
|
|
|
set rootdir
|
|
|
|
set bootargs
|
|
|
|
set nobootprompt
|
|
|
|
set debugfactotum
|
|
|
|
set fs
|
|
|
|
set fsaddr
|
|
|
|
set auth
|
|
|
|
set authaddr
|
2011-04-16 20:42:16 +00:00
|
|
|
|
|
|
|
fn fatal {
|
|
|
|
echo $*
|
|
|
|
exit $"*
|
|
|
|
}
|
|
|
|
|
|
|
|
fn must {
|
|
|
|
$* || fatal $"*^': '^$status
|
|
|
|
}
|
|
|
|
|
2011-04-19 05:24:46 +00:00
|
|
|
fn ask {
|
|
|
|
echo -n $1
|
|
|
|
echo -n $2
|
2011-04-23 18:22:24 +00:00
|
|
|
if(! ~ $#3 0){
|
2011-04-19 05:24:46 +00:00
|
|
|
echo -n ' ['
|
|
|
|
echo -n $3
|
|
|
|
echo -n '] '
|
2011-04-16 20:42:16 +00:00
|
|
|
}
|
2011-04-19 05:24:46 +00:00
|
|
|
$1=`{read}
|
|
|
|
if(~ $#$1 0)
|
|
|
|
$1=$3
|
|
|
|
if(~ $"$1 '!rc'){
|
|
|
|
rc -i
|
|
|
|
$1=()
|
2011-04-16 20:42:16 +00:00
|
|
|
}
|
2011-04-19 05:24:46 +00:00
|
|
|
if(~ $#$1 0)
|
|
|
|
ask $*
|
2011-04-16 20:42:16 +00:00
|
|
|
}
|
|
|
|
|
2011-04-30 20:17:33 +00:00
|
|
|
mt=()
|
|
|
|
. /rc/lib/tcp.rc
|
|
|
|
. /rc/lib/local.rc
|
2011-04-30 14:52:50 +00:00
|
|
|
. /rc/lib/usb.rc
|
2011-04-30 20:17:33 +00:00
|
|
|
|
|
|
|
fn main{
|
2011-04-21 22:22:25 +00:00
|
|
|
mp=()
|
|
|
|
while(~ $#mp 0){
|
2011-04-19 05:24:46 +00:00
|
|
|
if(~ $#nobootprompt 0){
|
|
|
|
echo
|
|
|
|
showlocaldevs
|
2011-04-30 20:17:33 +00:00
|
|
|
ask bootargs ' is (tcp, local!device)' $bootargs
|
2011-04-19 05:24:46 +00:00
|
|
|
}
|
2011-04-30 20:17:33 +00:00
|
|
|
if not bootargs=$nobootprompt
|
2011-04-21 22:22:25 +00:00
|
|
|
mn=`{echo $bootargs | awk -F! '{print $1}'}
|
2011-05-01 07:07:32 +00:00
|
|
|
ma=`{echo $bootargs | sed 's/[^!]+!//'}
|
2011-04-21 22:22:25 +00:00
|
|
|
for(i in `{seq 1 $#mt}){
|
|
|
|
if(~ $mt($i) m^$mn)
|
|
|
|
mp=$$mt($i)
|
2011-04-16 20:42:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-21 22:22:25 +00:00
|
|
|
# config method
|
|
|
|
$mp(1) $ma
|
|
|
|
|
2011-04-18 05:58:04 +00:00
|
|
|
# authentication agent
|
2011-04-19 05:24:46 +00:00
|
|
|
if(! test -f /srv/factotum){
|
|
|
|
x=(/boot/factotum -sfactotum)
|
|
|
|
if(~ $cpuflag 1)
|
2011-05-01 03:25:02 +00:00
|
|
|
x=($x -S)
|
2011-04-19 05:24:46 +00:00
|
|
|
if not
|
|
|
|
x=($x -u)
|
|
|
|
if(! ~ $#authaddr 0)
|
|
|
|
x=($x -a $authaddr)
|
|
|
|
if(! ~ $#debugfactotum 0)
|
|
|
|
x=($x -p)
|
|
|
|
must $x
|
|
|
|
}
|
2011-04-30 20:17:33 +00:00
|
|
|
if not user=`{cat /dev/hostowner}
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-21 22:22:25 +00:00
|
|
|
# connect method
|
|
|
|
$mp(2) $ma
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-30 20:17:33 +00:00
|
|
|
# mount and change root in new enviroment and namespace
|
|
|
|
rfork ne
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-30 20:17:33 +00:00
|
|
|
# mount root filesystem
|
|
|
|
if(~ $#rootdir 0)
|
|
|
|
rootdir=/root
|
|
|
|
must mount -c /srv/boot $rootdir
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-21 22:22:25 +00:00
|
|
|
# remove enviroment variables
|
|
|
|
rm -f /env/^$mt /env/? /env/?? '/env/fn#'*
|
|
|
|
|
2011-04-18 05:58:04 +00:00
|
|
|
# remove part of our temporary root
|
2011-04-19 05:24:46 +00:00
|
|
|
/mnt/broot/$cputype/bin/unmount /$cputype/bin /bin
|
2011-04-18 05:58:04 +00:00
|
|
|
/mnt/broot/$cputype/bin/unmount /rc/bin /bin
|
|
|
|
/mnt/broot/$cputype/bin/unmount /
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-18 05:58:04 +00:00
|
|
|
# create the name space, mount the root fs
|
|
|
|
/mnt/broot/$cputype/bin/bind / /
|
|
|
|
/mnt/broot/$cputype/bin/mount -ac '#s/boot' /
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-18 05:58:04 +00:00
|
|
|
# remove the remaining temporary root
|
|
|
|
/mnt/broot/$cputype/bin/unmount /mnt/broot
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-04-18 05:58:04 +00:00
|
|
|
if(~ $#init 0){
|
|
|
|
init=/$cputype/init
|
|
|
|
if(~ $cpuflag 1)
|
|
|
|
init=($init -c)
|
|
|
|
if not
|
|
|
|
init=($init -t)
|
|
|
|
}
|
|
|
|
exec $init
|
2011-04-16 20:42:16 +00:00
|
|
|
}
|
|
|
|
|
2011-04-19 05:24:46 +00:00
|
|
|
if(test -e '#u'){
|
|
|
|
bind -a '#u' /dev
|
|
|
|
usb/usbd
|
|
|
|
}
|
|
|
|
|
|
|
|
if(! ~ $#kbmap 0){
|
|
|
|
bind -a '#κ' /dev
|
|
|
|
if(test -r $"kbmap)
|
|
|
|
cat $"kbmap >/dev/kbmap
|
|
|
|
}
|
2011-04-16 20:42:16 +00:00
|
|
|
|
2011-05-01 07:07:32 +00:00
|
|
|
# bind in an ip interface
|
|
|
|
for(i in I l`{seq 0 3})
|
|
|
|
bind -qa '#'$i /net
|
|
|
|
|
2011-04-30 14:52:50 +00:00
|
|
|
configusb # run partfs on usb disks
|
2011-04-18 06:33:38 +00:00
|
|
|
configlocal # add partitions and binds
|
|
|
|
|
2011-04-30 20:17:33 +00:00
|
|
|
while(){
|
|
|
|
@{main}
|
|
|
|
sleep 1
|
|
|
|
|
|
|
|
# cleanup so it can be restarted
|
|
|
|
nobootprompt=()
|
|
|
|
user=()
|
|
|
|
rm -f /srv/boot /srv/slashn /srv/cs /srv/dns
|
2011-04-18 05:58:04 +00:00
|
|
|
}
|