shithub: riscv

Download patch

ref: 15656fc79d5e348dddbde615a84e7288b580b35e
parent: 06db9d4d681e552e0d4803e76becace707a72f12
author: cinap_lenrek <cinap_lenrek@localhost>
date: Sat Apr 30 16:17:33 EDT 2011

boot(8): fix boot restarting

--- a/sys/lib/dist/pc/plan9.ini.cd
+++ b/sys/lib/dist/pc/plan9.ini.cd
@@ -1,8 +1,6 @@
 # config for initial cd booting
-*nodumpstack=1
+*nomp=1
 mouseport=ask
 monitor=ask
 vgasize=ask
-cdboot=yes
 bootfile=/386/9pcf
-*nomp=1
--- a/sys/src/9/boot/bootrc
+++ b/sys/src/9/boot/bootrc
@@ -1,9 +1,33 @@
-rfork e
+#!/bin/rc
 
-mt=()
-. /rc/lib/tcp.rc
-. /rc/lib/local.rc
+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
+
 fn fatal {
 	echo $*
 	exit $"*
@@ -32,18 +56,19 @@
 		ask $*
 }
 
-fn getmethod{
+mt=()
+. /rc/lib/tcp.rc
+. /rc/lib/local.rc
+
+fn main{
 	mp=()
 	while(~ $#mp 0){
 		if(~ $#nobootprompt 0){
 			echo
 			showlocaldevs
-			ask bootargs ' are? (tcp, local!device)' $bootargs
+			ask bootargs ' is (tcp, local!device)' $bootargs
 		}
-		if not {
-			bootargs=$nobootprompt
-			nobootprompt=()
-		}
+		if not bootargs=$nobootprompt
 		mn=`{echo $bootargs | awk -F! '{print $1}'}
 		ma=`{echo $bootargs | awk -F! '{print $2}'}
 		for(i in `{seq 1 $#mt}){
@@ -51,13 +76,7 @@
 				mp=$$mt($i)
 		}
 	}
-}
 
-fn main{
-	rm -f /srv/boot
-
-	getmethod
-
 	switch($mn){
 	case local
 		islocal=1
@@ -81,17 +100,19 @@
 			x=($x -p)
 		must $x
 	}
+	if not user=`{cat /dev/hostowner}
 
 	# connect method
 	$mp(2) $ma
 
+	# mount and change root in new enviroment and namespace
+	rfork ne
+
 	# mount root filesystem
-	must mount -c /srv/boot /root
+	if(~ $#rootdir 0)
+		rootdir=/root
+	must mount -c /srv/boot $rootdir
 
-	# start pager
-	if(test -x /dev/swap)
-		echo -n start >/dev/swap
-
 	# remove enviroment variables
 	rm -f /env/^$mt /env/? /env/?? '/env/fn#'* 
 
@@ -107,8 +128,6 @@
 	# remove the remaining temporary root
 	/mnt/broot/$cputype/bin/unmount /mnt/broot
 
-	rootdir=/root
-
 	if(~ $#init 0){
 		init=/$cputype/init
 		if(~ $cpuflag 1)
@@ -115,18 +134,10 @@
 			init=($init -c)
 		if not
 			init=($init -t)
-		# TODO handle mflag
 	}
 	exec $init
 }
 
-bind -q '#p' /proc
-
-bind -qa '#S' /dev
-bind -qa '#f' /dev
-bind -qa '#k' /dev
-bind -qa '#æ' /dev
-
 if(test -e '#u'){
 	bind -a '#u' /dev
 	usb/usbd
@@ -140,7 +151,12 @@
 
 configlocal	# add partitions and binds
 
-while()@{
-	rfork ne
-	main
+while(){
+	@{main}
+	sleep 1
+
+	# cleanup so it can be restarted
+	nobootprompt=()
+	user=()
+	rm -f /srv/boot /srv/slashn /srv/cs /srv/dns
 }
--- a/sys/src/9/port/devsrv.c
+++ b/sys/src/9/port/devsrv.c
@@ -205,11 +205,8 @@
 
 	/*
 	 * Only eve can remove system services.
-	 * No one can remove #s/boot.
 	 */
 	if(strcmp(sp->owner, eve) == 0 && !iseve())
-		error(Eperm);
-	if(strcmp(sp->name, "boot") == 0)
 		error(Eperm);
 
 	/*