Scripts temporarily deregister themselves while executing. This
authorMichael Brown <mcb30@etherboot.org>
Sat, 9 Jun 2007 18:00:34 +0000 (19:00 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sat, 9 Jun 2007 18:00:34 +0000 (19:00 +0100)
allows us to avoid execution loops without having to hack around the
image registration order.

src/core/image.c
src/image/script.c
src/usr/imgmgmt.c

index e270540..08a129f 100644 (file)
@@ -106,20 +106,6 @@ void unregister_image ( struct image *image ) {
        DBGC ( image, "IMAGE %p unregistered\n", image );
 }
 
-/**
- * Move image to start of list of registered images
- *
- * @v image            Executable/loadable image
- *
- * Move the image to the start of the image list.  This makes it
- * easier to keep track of which of the images marked as loaded is
- * likely to still be valid.
- */
-void promote_image ( struct image *image ) {
-       list_del ( &image->list );
-       list_add ( &image->list, &images );
-}
-
 /**
  * Find image by name
  *
index 8443243..8e511d2 100644 (file)
@@ -44,6 +44,13 @@ static int script_exec ( struct image *image ) {
        char *eol;
        int rc;
 
+       /* Temporarily de-register image, so that a "boot" command
+        * doesn't throw us into an execution loop.  Hold a reference
+        * to avoid the image's being freed.
+        */
+       image_get ( image );
+       unregister_image ( image );
+
        while ( offset < image->len ) {
        
                /* Read up to cmdbuf bytes from script into buffer */
@@ -60,7 +67,8 @@ static int script_exec ( struct image *image ) {
                if ( ! eol ) {
                        DBG ( "Script line too long (max %d bytes)\n",
                              sizeof ( cmdbuf ) );
-                       return -ENOEXEC;
+                       rc = -ENOEXEC;
+                       goto done;
                }
 
                /* Mark end of line and execute command */
@@ -69,14 +77,19 @@ static int script_exec ( struct image *image ) {
                if ( ( rc = system ( cmdbuf ) ) != 0 ) {
                        DBG ( "Command \"%s\" exited with status %d\n",
                              cmdbuf, rc );
-                       return rc;
+                       goto done;
                }
                
                /* Move to next line */
                offset += ( ( eol - cmdbuf ) + 1 );
        }
 
-       return 0;
+       rc = 0;
+ done:
+       /* Re-register image and return */
+       register_image ( image );
+       image_put ( image );
+       return rc;
 }
 
 /**
index 28801fe..9fe2e14 100644 (file)
@@ -89,7 +89,8 @@ int imgload ( struct image *image ) {
                return rc;
 
        /* If we succeed, move the image to the start of the list */
-       promote_image ( image );
+#warning "No longer exists"
+       //      promote_image ( image );
 
        return 0;
 }