Added IMAGE_LOADED flag and find_image()
authorMichael Brown <mcb30@etherboot.org>
Fri, 12 Jan 2007 06:03:02 +0000 (06:03 +0000)
committerMichael Brown <mcb30@etherboot.org>
Fri, 12 Jan 2007 06:03:02 +0000 (06:03 +0000)
src/core/image.c
src/include/gpxe/image.h

index d093e3a..e14e08f 100644 (file)
@@ -72,6 +72,23 @@ void unregister_image ( struct image *image ) {
        DBGC ( image, "IMAGE %p unregistered\n", image );
 }
 
+/**
+ * Find image by name
+ *
+ * @v name             Image name
+ * @ret image          Executable/loadable image, or NULL
+ */
+struct image * find_image ( const char *name ) {
+       struct image *image;
+
+       list_for_each_entry ( image, &images, list ) {
+               if ( strcmp ( image->name, name ) == 0 )
+                       return image;
+       }
+
+       return NULL;
+}
+
 /**
  * Load executable/loadable image into memory
  *
@@ -89,6 +106,7 @@ int image_load ( struct image *image ) {
                return rc;
        }
 
+       image->flags |= IMAGE_LOADED;
        return 0;
 }
 
@@ -111,6 +129,7 @@ int image_autoload ( struct image *image ) {
                               image, image->type->name, strerror ( rc ) );
                        return rc;
                }
+               image->flags |= IMAGE_LOADED;
                return 0;
        }
 
@@ -127,8 +146,16 @@ int image_autoload ( struct image *image ) {
 int image_exec ( struct image *image ) {
        int rc;
 
+       /* Image must be loaded first */
+       if ( ! ( image->flags & IMAGE_LOADED ) ) {
+               DBGC ( image, "IMAGE %p could not execute: not loaded\n",
+                      image );
+               return -ENOTTY;
+       }
+
        assert ( image->type != NULL );
 
+       /* Try executing the image */
        if ( ( rc = image->type->exec ( image ) ) != 0 ) {
                DBGC ( image, "IMAGE %p could not execute: %s\n",
                       image, strerror ( rc ) );
index efc6a64..fc955c2 100644 (file)
@@ -45,8 +45,14 @@ struct image {
 
        /** Image type, if known */
        struct image_type *type;
+
+       /** Flags */
+       unsigned int flags;
 };
 
+/** Image is loaded */
+#define IMAGE_LOADED 0x0001
+
 /** An executable or loadable image type */
 struct image_type {
        /** Name of this image type */
@@ -102,6 +108,7 @@ extern struct list_head images;
 
 extern int register_image ( struct image *image );
 extern void unregister_image ( struct image *image );
+struct image * find_image ( const char *name );
 extern int image_load ( struct image *image );
 extern int image_autoload ( struct image *image );
 extern int image_exec ( struct image *image );