fetch() now knows nothing about struct image; it simply loads a file and
authorMichael Brown <mcb30@etherboot.org>
Fri, 12 Jan 2007 08:02:27 +0000 (08:02 +0000)
committerMichael Brown <mcb30@etherboot.org>
Fri, 12 Jan 2007 08:02:27 +0000 (08:02 +0000)
returns the allocated buffer.

src/core/image.c
src/include/gpxe/image.h
src/include/usr/fetch.h
src/usr/fetch.c
src/usr/imgmgmt.c

index 5199898..ce69c8a 100644 (file)
@@ -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;
 }
index 7f11e6a..5367735 100644 (file)
@@ -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;
index e7c035b..372f6f8 100644 (file)
@@ -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 */
index 0017318..fe5ae59 100644 (file)
 #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;
 }
index 2c949ae..6a2599d 100644 (file)
@@ -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 */