summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-01-12 09:02:27 +0100
committerMichael Brown2007-01-12 09:02:27 +0100
commit475d6d1f7c7f169a89ea363ad819b0dd2975ae10 (patch)
tree000239996a57f863fb56326ed137bf85c3517934
parentAllow "imgexec" with no arguments to boot the file that was loaded with (diff)
downloadipxe-475d6d1f7c7f169a89ea363ad819b0dd2975ae10.tar.gz
ipxe-475d6d1f7c7f169a89ea363ad819b0dd2975ae10.tar.xz
ipxe-475d6d1f7c7f169a89ea363ad819b0dd2975ae10.zip
fetch() now knows nothing about struct image; it simply loads a file and
returns the allocated buffer.
-rw-r--r--src/core/image.c4
-rw-r--r--src/include/gpxe/image.h8
-rw-r--r--src/include/usr/fetch.h7
-rw-r--r--src/usr/fetch.c20
-rw-r--r--src/usr/imgmgmt.c2
5 files changed, 19 insertions, 22 deletions
diff --git a/src/core/image.c b/src/core/image.c
index 51998982e..ce69c8a3c 100644
--- a/src/core/image.c
+++ b/src/core/image.c
@@ -99,9 +99,7 @@ struct image * find_image ( const char *name ) {
* image.
*/
void free_image ( struct image *image ) {
- if ( image->free )
- image->free ( image->data );
- image->free = NULL;
+ efree ( image->data );
image->data = UNULL;
image->len = 0;
}
diff --git a/src/include/gpxe/image.h b/src/include/gpxe/image.h
index 7f11e6a0c..5367735c8 100644
--- a/src/include/gpxe/image.h
+++ b/src/include/gpxe/image.h
@@ -31,14 +31,6 @@ struct image {
userptr_t data;
/** Length of raw file image */
size_t len;
- /**
- * Free raw file image
- *
- * @v data Raw file image
- *
- * Call this method before freeing up the @c struct @c image.
- */
- void ( * free ) ( userptr_t data );
/** Entry point */
physaddr_t entry;
diff --git a/src/include/usr/fetch.h b/src/include/usr/fetch.h
index e7c035be5..372f6f8cd 100644
--- a/src/include/usr/fetch.h
+++ b/src/include/usr/fetch.h
@@ -4,10 +4,13 @@
/**
* @file
*
- * Fetch file as executable/loadable image
+ * Fetch file
*
*/
-extern int fetch ( struct image *image, const char *filename );
+#include <stdint.h>
+#include <gpxe/uaccess.h>
+
+extern int fetch ( const char *filename, userptr_t *data, size_t *len );
#endif /* _USR_FETCH_H */
diff --git a/src/usr/fetch.c b/src/usr/fetch.c
index 001731845..fe5ae59fa 100644
--- a/src/usr/fetch.c
+++ b/src/usr/fetch.c
@@ -34,13 +34,18 @@
#include <gpxe/dhcp.h>
/**
- * Fetch file as executable/loadable image
+ * Fetch file
*
- * @v image Executable/loadable image
- * @v filename Filename
+ * @v filename Filename to fetch
+ * @ret data Loaded file
+ * @ret len Length of loaded file
* @ret rc Return status code
+ *
+ * Fetch file to an external buffer allocated with emalloc(). The
+ * caller is responsible for eventually freeing the buffer with
+ * efree().
*/
-int fetch ( struct image *image, const char *filename ) {
+int fetch ( const char *filename, userptr_t *data, size_t *len ) {
struct buffer buffer;
int rc;
@@ -69,10 +74,9 @@ int fetch ( struct image *image, const char *filename ) {
return rc;
}
- /* Transfer ownserhip of the data buffer to the image */
- image->data = buffer.addr;
- image->len = buffer.fill;
- image->free = efree;
+ /* Fill in buffer address and length */
+ *data = buffer.addr;
+ *len = buffer.fill;
return 0;
}
diff --git a/src/usr/imgmgmt.c b/src/usr/imgmgmt.c
index 2c949ae24..6a2599d53 100644
--- a/src/usr/imgmgmt.c
+++ b/src/usr/imgmgmt.c
@@ -54,7 +54,7 @@ int imgfetch ( const char *filename, const char *name,
strncpy ( image->name, name, ( sizeof ( image->name ) - 1 ) );
/* Fetch the file */
- if ( ( rc = fetch ( image, filename ) ) != 0 )
+ if ( ( rc = fetch ( filename, &image->data, &image->len ) ) != 0 )
goto err;
/* Register the image */