<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  
  <title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
<tt>Michael Brown wrote:</tt>
<blockquote type="cite" cite="mid:201003051553.49780.mbrown@fensystems.co.uk">
  
  
  <title>Re: [gPXE-devel] Minor Scripting Improvements</title>
<!-- Converted from text/plain format -->
  <p><tt><font size="2">"Exit just the currently executing script"
feels cleanest to me.<br>
  <br>
Maybe "loopif" rather than "loop", to make it more intuitively obvious
that<br>
the argument is required?<br>
  <br>
In the bazaar spirit, 69 bytes seems worth it to me.</font></tt></p>
</blockquote>
<tt><br>
Thanks for your feedback, Michael.&nbsp; Attached are both features as one
patch.&nbsp; Of course, 'loopif' now brings the cost to 71 bytes, versus the
69 for 'loop'.&nbsp; ;)&nbsp; I agree that 'loopif' makes more sense to the user.<br>
<br>
I'll tear down the 'loop' staging branch shortly and put a 'loopif'
version there, instead.<br>
<br>
</tt><tt>I value further feedback from anyone interested.&nbsp; </tt><br>
<tt><br>
- Shao Miller<br>
-----<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>
&nbsp;<br>
&nbsp;/** Flag set in order to exit shell */<br>
-static int exit_flag = 0;<br>
+int shell_exit_flag = 0;<br>
&nbsp;<br>
&nbsp;/** "exit" command body */<br>
&nbsp;static int exit_exec ( int argc, char **argv __unused ) {<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; if ( argc == 1 ) {<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit_flag = 1;<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; shell_exit_flag = 1;<br>
&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf ( "Usage: exit\n"<br>
&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>
&nbsp;<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; line = readline ( shell_prompt );<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ( line ) {<br>
&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..0597228 100644<br>
--- a/src/image/script.c<br>
+++ b/src/image/script.c<br>
@@ -29,7 +29,9 @@ FILE_LICENCE ( GPL2_OR_LATER );<br>
&nbsp;#include &lt;stdlib.h&gt;<br>
&nbsp;#include &lt;ctype.h&gt;<br>
&nbsp;#include &lt;errno.h&gt;<br>
+#include &lt;gpxe/command.h&gt;<br>
&nbsp;#include &lt;gpxe/image.h&gt;<br>
+#include &lt;gpxe/shell.h&gt;<br>
&nbsp;<br>
&nbsp;struct image_type script_image_type __image_type ( PROBE_NORMAL );<br>
&nbsp;<br>
@@ -40,7 +42,7 @@ struct image_type script_image_type __image_type (
PROBE_NORMAL );<br>
&nbsp; * @ret rc&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Return status code<br>
&nbsp; */<br>
&nbsp;static int script_exec ( struct image *image ) {<br>
-&nbsp;&nbsp;&nbsp; size_t offset = 0;<br>
+&nbsp;&nbsp;&nbsp; size_t offset;<br>
&nbsp;&nbsp;&nbsp;&nbsp; off_t eol;<br>
&nbsp;&nbsp;&nbsp;&nbsp; size_t len;<br>
&nbsp;&nbsp;&nbsp;&nbsp; int rc;<br>
@@ -50,6 +52,8 @@ static int script_exec ( struct image *image ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/<br>
&nbsp;&nbsp;&nbsp;&nbsp; unregister_image ( image );<br>
&nbsp;<br>
+ start_script:<br>
+&nbsp;&nbsp;&nbsp; offset = 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp; while ( offset &lt; image-&gt;len ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Find length of next line, excluding any terminating '\n' */<br>
@@ -73,12 +77,24 @@ static int script_exec ( struct image *image ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ( shell_exit_flag )<br>
+&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; goto done;<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Move to next line */<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; offset += ( len + 1 );<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;<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; /* Check if we should loop.&nbsp; We might as well use ENOTSUP,<br>
+&nbsp;&nbsp;&nbsp; &nbsp;* since we don't use it for anything else in this file<br>
+&nbsp;&nbsp;&nbsp; &nbsp;*/<br>
+&nbsp;&nbsp;&nbsp; if ( rc == -ENOTSUP )<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; goto start_script;<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>
@@ -124,3 +140,20 @@ struct image_type script_image_type __image_type (
PROBE_NORMAL ) = {<br>
&nbsp;&nbsp;&nbsp;&nbsp; .load = script_load,<br>
&nbsp;&nbsp;&nbsp;&nbsp; .exec = script_exec,<br>
&nbsp;};<br>
+<br>
+/** "loopif" command body */<br>
+static int loopif_exec ( int argc, char **argv ) {<br>
+&nbsp;&nbsp;&nbsp; /* We use ENOTSUP, since we don't use it<br>
+&nbsp;&nbsp;&nbsp; &nbsp;* for anything else in this file<br>
+&nbsp;&nbsp;&nbsp; &nbsp;*/<br>
+&nbsp;&nbsp;&nbsp; if ( argc &gt; 1 &amp;&amp; strtoul ( argv[1], NULL, 0 ) )<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -ENOTSUP;<br>
+&nbsp;&nbsp;&nbsp; return 0;<br>
+}<br>
+<br>
+/** "loopif" command definition */<br>
+struct command loop_command __command = {<br>
+&nbsp;&nbsp;&nbsp; .name = "loopif",<br>
+&nbsp;&nbsp;&nbsp; .exec = loopif_exec,<br>
+};<br>
+<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>
&nbsp;<br>
&nbsp;FILE_LICENCE ( GPL2_OR_LATER );<br>
&nbsp;<br>
+extern int shell_exit_flag;<br>
&nbsp;extern void shell ( void );<br>
&nbsp;<br>
&nbsp;#endif /* _GPXE_SHELL_H */<br>
<br>
</tt>
</body>
</html>