*/
#include <stdint.h>
-#include <vsprintf.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
#include <gpxe/image.h>
+#include <gpxe/downloader.h>
+#include <gpxe/monojob.h>
+#include <gpxe/open.h>
#include <usr/imgmgmt.h>
/** @file
*
*/
+static int imgfetch_autoload ( struct image *image ) {
+ int rc;
+
+ if ( ( rc = register_image ( image ) ) != 0 )
+ return rc;
+
+ if ( ( rc = image_autoload ( image ) ) != 0 )
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Fetch an image
+ *
+ * @v uri_string URI as a string (e.g. "http://www.nowhere.com/vmlinuz")
+ * @v name Name for image, or NULL
+ * @ret new_image Newly created image
+ * @ret rc Return status code
+ */
+int imgfetch ( struct image *image, const char *uri_string, int load ) {
+ int rc;
+
+ printf ( "uri_string = %s\n", uri_string );
+
+ if ( ( rc = create_downloader ( &monojob, image,
+ ( load ? imgfetch_autoload :
+ register_image ),
+ LOCATION_URI_STRING,
+ uri_string ) ) == 0 )
+ rc = monojob_wait();
+
+ return rc;
+}
+
+/**
+ * Load an image
+ *
+ * @v image Image
+ * @ret rc Return status code
+ */
+int imgload ( struct image *image ) {
+ int rc;
+
+ /* Try to load image */
+ if ( ( rc = image_autoload ( image ) ) != 0 )
+ return rc;
+
+ return 0;
+}
+
+/**
+ * Execute an image
+ *
+ * @v image Image
+ * @ret rc Return status code
+ */
+int imgexec ( struct image *image ) {
+ return image_exec ( image );
+}
+
+/**
+ * Identify the first loaded image
+ *
+ * @ret image Image, or NULL
+ */
+struct image * imgautoselect ( void ) {
+ struct image *image;
+
+ for_each_image ( image ) {
+ if ( image->flags & IMAGE_LOADED )
+ return image;
+ }
+
+ return NULL;
+}
+
/**
* Display status of an image
*
* @v image Executable/loadable image
*/
void imgstat ( struct image *image ) {
- printf ( "%s: %zd bytes ", image->name, image->len );
+ printf ( "%s: %zd bytes", image->name, image->len );
if ( image->type )
printf ( " [%s]", image->type->name );
if ( image->flags & IMAGE_LOADED )
printf ( " [LOADED]" );
if ( image->cmdline[0] )
- printf ( "\"%s\"", image->cmdline );
+ printf ( " \"%s\"", image->cmdline );
printf ( "\n" );
}
+/**
+ * Free an image
+ *
+ * @v image Executable/loadable image
+ */
+void imgfree ( struct image *image ) {
+ unregister_image ( image );
+}