[gPXE-devel] Minor Scripting Improvements

Shao Miller Shao.Miller at yrdsb.edu.on.ca
Fri Mar 5 11:17:37 EST 2010


Michael Brown wrote:
>
> "Exit just the currently executing script" feels cleanest to me.
>
> Maybe "loopif" rather than "loop", to make it more intuitively obvious 
> that
> the argument is required?
>
> In the bazaar spirit, 69 bytes seems worth it to me.
>

Thanks for your feedback, Michael.  Attached are both features as one 
patch.  Of course, 'loopif' now brings the cost to 71 bytes, versus the 
69 for 'loop'.  ;)  I agree that 'loopif' makes more sense to the user.

I'll tear down the 'loop' staging branch shortly and put a 'loopif' 
version there, instead.

I value further feedback from anyone interested. 

- Shao Miller
-----

diff --git a/src/hci/shell.c b/src/hci/shell.c
index 5bedbdc..825dac3 100644
--- a/src/hci/shell.c
+++ b/src/hci/shell.c
@@ -35,13 +35,13 @@ FILE_LICENCE ( GPL2_OR_LATER );
 static const char shell_prompt[] = "gPXE> ";
 
 /** Flag set in order to exit shell */
-static int exit_flag = 0;
+int shell_exit_flag = 0;
 
 /** "exit" command body */
 static int exit_exec ( int argc, char **argv __unused ) {
 
     if ( argc == 1 ) {
-        exit_flag = 1;
+        shell_exit_flag = 1;
     } else {
         printf ( "Usage: exit\n"
              "Exits the command shell\n" );
@@ -91,8 +91,8 @@ struct command help_command __command = {
 void shell ( void ) {
     char *line;
 
-    exit_flag = 0;
-    while ( ! exit_flag ) {
+    shell_exit_flag = 0;
+    while ( ! shell_exit_flag ) {
         line = readline ( shell_prompt );
         if ( line ) {
             system ( line );
diff --git a/src/image/script.c b/src/image/script.c
index 0835ecb..0597228 100644
--- a/src/image/script.c
+++ b/src/image/script.c
@@ -29,7 +29,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <stdlib.h>
 #include <ctype.h>
 #include <errno.h>
+#include <gpxe/command.h>
 #include <gpxe/image.h>
+#include <gpxe/shell.h>
 
 struct image_type script_image_type __image_type ( PROBE_NORMAL );
 
@@ -40,7 +42,7 @@ struct image_type script_image_type __image_type ( 
PROBE_NORMAL );
  * @ret rc        Return status code
  */
 static int script_exec ( struct image *image ) {
-    size_t offset = 0;
+    size_t offset;
     off_t eol;
     size_t len;
     int rc;
@@ -50,6 +52,8 @@ static int script_exec ( struct image *image ) {
      */
     unregister_image ( image );
 
+ start_script:
+    offset = 0;
     while ( offset < image->len ) {
    
         /* Find length of next line, excluding any terminating '\n' */
@@ -73,12 +77,24 @@ static int script_exec ( struct image *image ) {
             }
         }
        
+        if ( shell_exit_flag )
+            /* "exit" command should exit this script */
+            goto done;
         /* Move to next line */
         offset += ( len + 1 );
     }
 
     rc = 0;
  done:
+    /* Reset exit flag */
+    shell_exit_flag = 0;
+
+    /* Check if we should loop.  We might as well use ENOTSUP,
+     * since we don't use it for anything else in this file
+     */
+    if ( rc == -ENOTSUP )
+        goto start_script;
+
     /* Re-register image and return */
     register_image ( image );
     return rc;
@@ -124,3 +140,20 @@ struct image_type script_image_type __image_type ( 
PROBE_NORMAL ) = {
     .load = script_load,
     .exec = script_exec,
 };
+
+/** "loopif" command body */
+static int loopif_exec ( int argc, char **argv ) {
+    /* We use ENOTSUP, since we don't use it
+     * for anything else in this file
+     */
+    if ( argc > 1 && strtoul ( argv[1], NULL, 0 ) )
+        return -ENOTSUP;
+    return 0;
+}
+
+/** "loopif" command definition */
+struct command loop_command __command = {
+    .name = "loopif",
+    .exec = loopif_exec,
+};
+
diff --git a/src/include/gpxe/shell.h b/src/include/gpxe/shell.h
index a65a344..148ea83 100644
--- a/src/include/gpxe/shell.h
+++ b/src/include/gpxe/shell.h
@@ -9,6 +9,7 @@
 
 FILE_LICENCE ( GPL2_OR_LATER );
 
+extern int shell_exit_flag;
 extern void shell ( void );
 
 #endif /* _GPXE_SHELL_H */

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://etherboot.org/pipermail/gpxe-devel/attachments/20100305/ffab8d3f/attachment.html 
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: exit_loopif.patch
Url: http://etherboot.org/pipermail/gpxe-devel/attachments/20100305/ffab8d3f/attachment.cc 


More information about the gPXE-devel mailing list