From b9fea9cbacf34b5f075894038ad1ab81d414aeb9 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 12 Jan 2007 06:03:02 +0000 Subject: [PATCH] Added IMAGE_LOADED flag and find_image() --- src/core/image.c | 27 +++++++++++++++++++++++++++ src/include/gpxe/image.h | 7 +++++++ 2 files changed, 34 insertions(+) diff --git a/src/core/image.c b/src/core/image.c index d093e3a1..e14e08f1 100644 --- a/src/core/image.c +++ b/src/core/image.c @@ -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 ) ); diff --git a/src/include/gpxe/image.h b/src/include/gpxe/image.h index efc6a642..fc955c2e 100644 --- a/src/include/gpxe/image.h +++ b/src/include/gpxe/image.h @@ -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 );