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;
/**
* @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 */
#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;
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;
}
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 */