Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Dec 2011 06:24:59 +0000 (UTC)
From:      Sergey Kandaurov <pluknet@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228985 - head/sys/boot/forth
Message-ID:  <201112300624.pBU6OxO9098906@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pluknet
Date: Fri Dec 30 06:24:59 2011
New Revision: 228985
URL: http://svn.freebsd.org/changeset/base/228985

Log:
  Unset the environment variables associated with individual menu items
  before invoking the kernel.
  
  Quoting submitter:
  
  The issue is with the new boot loader menu. It adds many loader variables
  including ones that contain ANSI color escapes.
  
  Obviously, these ANSI codes don't play well with serial consoles when
  kenv(1) is executed without arguments (reports vary as to what happens,
  but it's never pretty).
  
  The net-effect is that kenv(1) no longer reports menu-related variables.
  
  In essence, kenv(1) output should now appear the same as on RELENG_8
  (which lacks the new boot loader and didn't use any such variables).
  Thus, restoring serial console glory.
  
  Submitted by:	Devin Teske <devin dott teske fisglobal.com>
  MFC after:	2 weeks

Modified:
  head/sys/boot/forth/loader.4th
  head/sys/boot/forth/menu.4th
  head/sys/boot/forth/menu.4th.8

Modified: head/sys/boot/forth/loader.4th
==============================================================================
--- head/sys/boot/forth/loader.4th	Fri Dec 30 04:00:31 2011	(r228984)
+++ head/sys/boot/forth/loader.4th	Fri Dec 30 06:24:59 2011	(r228985)
@@ -41,12 +41,15 @@ s" arch-i386" environment? [if] [if]
 
 include /boot/support.4th
 
-\ ***** boot-conf
-\
-\	Prepares to boot as specified by loaded configuration files.
-
 only forth also support-functions also builtins definitions
 
+: try-menu-unset
+  s" menu-unset"
+  ['] evaluate catch if
+    2drop
+  then
+;
+
 : boot
   0= if ( interpreted ) get_arguments then
 
@@ -57,24 +60,32 @@ only forth also support-functions also b
       0 1 unload drop
     else
       s" kernelname" getenv? if ( a kernel has been loaded )
+        try-menu-unset
         1 boot exit
       then
       load_kernel_and_modules
       ?dup if exit then
+      try-menu-unset
       0 1 boot exit
     then
   else
     s" kernelname" getenv? if ( a kernel has been loaded )
+      try-menu-unset
       1 boot exit
     then
     load_kernel_and_modules
     ?dup if exit then
+    try-menu-unset
     0 1 boot exit
   then
   load_kernel_and_modules
   ?dup 0= if 0 1 boot then
 ;
 
+\ ***** boot-conf
+\
+\	Prepares to boot as specified by loaded configuration files.
+
 : boot-conf
   0= if ( interpreted ) get_arguments then
   0 1 unload drop

Modified: head/sys/boot/forth/menu.4th
==============================================================================
--- head/sys/boot/forth/menu.4th	Fri Dec 30 04:00:31 2011	(r228984)
+++ head/sys/boot/forth/menu.4th	Fri Dec 30 06:24:59 2011	(r228985)
@@ -131,11 +131,11 @@ create init_text8 255 allot
 
 	\ Print the value of menuidx
 	loader_color? if
-		." "
+		." " (  )
 	then
 	menuidx @ .
 	loader_color? if
-		." "
+		." " (  )
 	then
 
 	\ Move the cursor forward 1 column
@@ -897,22 +897,60 @@ create init_text8 255 allot
 ;
 
 \ This function unsets all the possible environment variables associated with
-\ creating the interactive menu. Call this when you want to clear the menu
-\ area in preparation for another menu.
+\ creating the interactive menu.
 \ 
-: menu-clear ( -- )
+: menu-unset ( -- )
 
 	49 \ Iterator start (loop range 49 to 56; ASCII '1' to '8')
 	begin
-		\ basename for caption variable
-		loader_color? if
-			s" ansi_caption[x]"
-		else
-			s" menu_caption[x]"
-		then
+		\ Unset variables in-order of appearance in menu.4th(8)
+
+		s" menu_caption[x]"	\ basename for caption variable
 		-rot 2dup 13 + c! rot	\ replace 'x' with current iteration
 		unsetenv		\ not erroneous to unset unknown var
 
+		s" menu_command[x]"	\ command basename
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		unsetenv
+
+		s" menu_keycode[x]"	\ keycode basename
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		unsetenv
+
+		s" ansi_caption[x]"	\ ANSI caption basename
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		unsetenv
+
+		s" toggled_text[x]"	\ toggle_menuitem caption basename
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		unsetenv
+
+		s" toggled_ansi[x]"	\ toggle_menuitem ANSI caption basename
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		unsetenv
+
+		s" menu_caption[x][y]"	\ cycle_menuitem caption
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		49 -rot
+		begin
+			16 2over rot + c! \ replace 'y'
+			2dup unsetenv
+
+			rot 1+ dup 56 > 2swap rot
+		until
+		2drop drop
+
+		s" ansi_caption[x][y]"	\ cycle_menuitem ANSI caption
+		-rot 2dup 13 + c! rot	\ replace 'x'
+		49 -rot
+		begin
+			16 2over rot + c! \ replace 'y'
+			2dup unsetenv
+
+			rot 1+ dup 56 > 2swap rot
+		until
+		2drop drop
+
 		s" 0 menukeyN !"	\ basename for key association var
 		-rot 2dup 9 + c! rot	\ replace 'N' with current iteration
 		evaluate		\ assign zero (0) to key assoc. var
@@ -921,6 +959,9 @@ create init_text8 255 allot
 	until
 	drop \ iterator
 
+	\ unset the timeout command
+	s" menu_timeout_command" unsetenv
+
 	\ clear the "Reboot" menu option flag
 	s" menu_reboot" unsetenv
 	0 menureboot !
@@ -933,6 +974,13 @@ create init_text8 255 allot
 	s" menu_options" unsetenv
 	0 menuoptions !
 
+;
+
+\ This function both unsets menu variables and visually erases the menu area
+\ in-preparation for another menu.
+\ 
+: menu-clear ( -- )
+	menu-unset
 	menu-erase
 ;
 

Modified: head/sys/boot/forth/menu.4th.8
==============================================================================
--- head/sys/boot/forth/menu.4th.8	Fri Dec 30 04:00:31 2011	(r228984)
+++ head/sys/boot/forth/menu.4th.8	Fri Dec 30 06:24:59 2011	(r228985)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd Aug 29, 2011
+.Dd Dec 27, 2011
 .Dt MENU.4TH 8
 .Os
 .Sh NAME
@@ -69,9 +69,13 @@ Clears the screen area within the menu b
 Calls
 .Ic menu-erase
 and then redraws the menu.
+.It Ic menu-unset
+Unsets the environment variables associated with individual menu items,
+clearing the way for a new menu.
 .It Ic menu-clear
-Unsets all possible environment variables used
-to configure the menu and then calls
+Calls
+.Ic menu-unset
+and then
 .Ic menu-erase .
 .El
 .Pp



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112300624.pBU6OxO9098906>