To support Boot.Kernel.Org, for example.

Also at:
http://git.etherboot.org/?p=people/sha0/gpxe.git;a=commitdiff;h=79bcbbe5
c07cb60ee8b240ec0ffff6448f3c42c5

>From 79bcbbe5c07cb60ee8b240ec0ffff6448f3c42c5 Mon Sep 17 00:00:00 2001
From: Shao Miller <[email protected]>
Date: Thu, 18 Mar 2010 22:50:54 -0400
Subject: [PATCH] [script] Allow control over error handling

Use 'clear script_errors' from within a script to prevent
any error during execution from exiting all scripts.

Use 'set script_errors 1' to restore the behaviour if it
was cleared.

Uncompressed code size cost: 97 bytes
---
 src/image/script.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/src/image/script.c b/src/image/script.c
index 0835ecb..df12557 100644
--- a/src/image/script.c
+++ b/src/image/script.c
@@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <ctype.h>
 #include <errno.h>
 #include <gpxe/image.h>
+#include <gpxe/settings.h>
 
 struct image_type script_image_type __image_type ( PROBE_NORMAL );
 
@@ -44,12 +45,28 @@ static int script_exec ( struct image *image ) {
        off_t eol;
        size_t len;
        int rc;
+       int error_control = 1;
+       static struct setting script_errors = {
+               .name = "script_errors",
+               .description = "",
+               .type = &setting_type_hex,
+               .tag = 0,
+       };
 
        /* Temporarily de-register image, so that a "boot" command
         * doesn't throw us into an execution loop.
         */
        unregister_image ( image );
 
+       /* Store the current error control */
+       rc = store_setting ( NULL, &script_errors, &error_control,
+                            sizeof ( error_control ) );
+       if ( rc < 0 ) {
+               DBG ( "Could not save script error control: %s\n",
+                     strerror ( rc ) );
+               goto done;
+       }
+
        while ( offset < image->len ) {
        
                /* Find length of next line, excluding any terminating
'\n' */
@@ -66,7 +83,11 @@ static int script_exec ( struct image *image ) {
                        copy_from_user ( cmdbuf, image->data, offset,
len );
                        cmdbuf[len] = '\0';
                        DBG ( "$ %s\n", cmdbuf );
-                       if ( ( rc = system ( cmdbuf ) ) != 0 ) {
+                       rc = system ( cmdbuf );
+                       /* Possibly update the error control flag */
+                       fetch_setting ( NULL, &script_errors,
&error_control,
+                                       sizeof ( error_control ) );
+                       if ( rc != 0 && error_control != 0 ) {
                                DBG ( "Command \"%s\" failed: %s\n",
                                      cmdbuf, strerror ( rc ) );
                                goto done;
-- 
1.5.6.3

Attachment: script_errors.patch
Description: script_errors.patch

_______________________________________________
gPXE-devel mailing list
[email protected]
http://etherboot.org/mailman/listinfo/gpxe-devel

Reply via email to