<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  
  <title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
<tt>With sincere apologies to all gPXE users, I got my To: list
crossed.&nbsp; This was meant for the developers' mailing list.&nbsp; - Shao<br>
<br>
Shao Miller wrote:</tt>
<blockquote type="cite" cite="mid:4B90911E.6050300@YRDSB.Edu.On.Ca">
  
  
  <title>[PATCH] [script] Allow for exiting scripts</title>
<!-- Converted from text/plain format -->
  <p><tt><font size="2">In staging:<br>
  <a href="http://git.etherboot.org/?p=gpxe-staging.git;a=commitdiff;h=963f18ec1127b55b42434002587ac565ce33cb3a" moz-do-not-send="true">http://git.etherboot.org/?p=gpxe-staging.git;a=commitdiff;h=963f18ec1127b55b42434002587ac565ce33cb3a</a><br>
  <br>
In tracking system:<br>
  <a href="http://support.etherboot.org/index.php?do=details&amp;task_id=73" moz-do-not-send="true">http://support.etherboot.org/index.php?do=details&amp;task_id=73</a><br>
  <br>
Also attached.<br>
  <br>
- Shao Miller<br>
-----<br>
  <br>
&nbsp;From 963f18ec1127b55b42434002587ac565ce33cb3a Mon Sep 17 00:00:00 2001<br>
From: Shao Miller <a href="mailto:shao.miller@yrdsb.edu.on.ca" class="moz-txt-link-rfc2396E">&lt;shao.miller@yrdsb.edu.on.ca&gt;</a><br>
Date: Thu, 4 Mar 2010 23:14:56 -0500<br>
Subject: [PATCH] [script] Allow for exiting scripts<br>
  <br>
This commit allows the 'exit' command to set a flag which the<br>
script parser will use to choose whether or not to terminate<br>
execution of a script.&nbsp; The flag is reset so that any calling<br>
script is not also terminated.<br>
  <br>
Previously, the 'exit' command in a script did nothing.&nbsp; This<br>
would suggest that adding it as a new feature should not<br>
negatively impact any gPXE scripts currently in existence.<br>
  <br>
For example,<br>
  <br>
&nbsp;#!gpxe<br>
&nbsp;# caller.gpxe<br>
&nbsp;echo Caller executing<br>
&nbsp;imgload callee.gpxe<br>
&nbsp;boot callee.gpxe<br>
&nbsp;echo Callee must have terminated<br>
&nbsp;exit<br>
&nbsp;echo Impossibility<br>
  <br>
&nbsp;#!gpxe<br>
&nbsp;# callee.gpxe<br>
&nbsp;echo Callee executing<br>
&nbsp;echo Pre-exit<br>
&nbsp;exit<br>
&nbsp;echo Post-exit<br>
  <br>
&nbsp;$ make EMBEDDED_IMAGE=caller.gpxe,callee.gpxe bin/gpxe.pdsk<br>
&nbsp;$ qemu -fda bin/gpxe.pdsk -boot a<br>
  <br>
Code size cost: 19 bytes uncompressed (!)<br>
---<br>
&nbsp;src/hci/shell.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 8 ++++----<br>
&nbsp;src/image/script.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 7 +++++++<br>
&nbsp;src/include/gpxe/shell.h |&nbsp;&nbsp;&nbsp; 1 +<br>
&nbsp;3 files changed, 12 insertions(+), 4 deletions(-)<br>
  <br>
diff --git a/src/hci/shell.c b/src/hci/shell.c<br>
index 5bedbdc..825dac3 100644<br>
--- a/src/hci/shell.c<br>
+++ b/src/hci/shell.c<br>
@@ -35,13 +35,13 @@ FILE_LICENCE ( GPL2_OR_LATER );<br>
&nbsp;static const char shell_prompt[] = "gPXE&gt; ";<br>
  <br>
&nbsp;/** Flag set in order to exit shell */<br>
-static int exit_flag = 0;<br>
+int shell_exit_flag = 0;<br>
  <br>
&nbsp;/** "exit" command body */<br>
&nbsp;static int exit_exec ( int argc, char **argv __unused ) {<br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp; if ( argc == 1 ) {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit_flag = 1;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell_exit_flag = 1;<br>
&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf ( "Usage: exit\n"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Exits the command shell\n" );<br>
@@ -91,8 +91,8 @@ struct command help_command __command = {<br>
&nbsp;void shell ( void ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp; char *line;<br>
  <br>
-&nbsp;&nbsp;&nbsp; exit_flag = 0;<br>
-&nbsp;&nbsp;&nbsp; while ( ! exit_flag ) {<br>
+&nbsp;&nbsp;&nbsp; shell_exit_flag = 0;<br>
+&nbsp;&nbsp;&nbsp; while ( ! shell_exit_flag ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line = readline ( shell_prompt );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( line ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system ( line );<br>
diff --git a/src/image/script.c b/src/image/script.c<br>
index 0835ecb..4073eb0 100644<br>
--- a/src/image/script.c<br>
+++ b/src/image/script.c<br>
@@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER );<br>
&nbsp;#include &lt;ctype.h&gt;<br>
&nbsp;#include &lt;errno.h&gt;<br>
&nbsp;#include &lt;gpxe/image.h&gt;<br>
+#include &lt;gpxe/shell.h&gt;<br>
  <br>
&nbsp;struct image_type script_image_type __image_type ( PROBE_NORMAL );<br>
  <br>
@@ -73,12 +74,18 @@ static int script_exec ( struct image *image ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( shell_exit_flag )<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* "exit" command should exit this script */<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto done;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Move to next line */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset += ( len + 1 );<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp; rc = 0;<br>
&nbsp; done:<br>
+&nbsp;&nbsp;&nbsp; /* Reset exit flag */<br>
+&nbsp;&nbsp;&nbsp; shell_exit_flag = 0;<br>
+<br>
&nbsp;&nbsp;&nbsp;&nbsp; /* Re-register image and return */<br>
&nbsp;&nbsp;&nbsp;&nbsp; register_image ( image );<br>
&nbsp;&nbsp;&nbsp;&nbsp; return rc;<br>
diff --git a/src/include/gpxe/shell.h b/src/include/gpxe/shell.h<br>
index a65a344..148ea83 100644<br>
--- a/src/include/gpxe/shell.h<br>
+++ b/src/include/gpxe/shell.h<br>
@@ -9,6 +9,7 @@<br>
  <br>
&nbsp;FILE_LICENCE ( GPL2_OR_LATER );<br>
  <br>
+extern int shell_exit_flag;<br>
&nbsp;extern void shell ( void );<br>
  <br>
&nbsp;#endif /* _GPXE_SHELL_H */<br>
--<br>
1.5.6.3<br>
  <br>
  </font></tt>
  </p>
</blockquote>
<tt><br>
</tt>
</body>
</html>