]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[image] Allow download job to complete before acting upon image
authorMichael Brown <mcb30@ipxe.org>
Wed, 2 Mar 2011 19:29:24 +0000 (19:29 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 2 Mar 2011 19:29:24 +0000 (19:29 +0000)
Allow the monojob controlling the download to complete before calling
register_image() and friends.  This allows the trailing "ok" from
monojob.c to be printed before the image starts executing (and
possibly printing output of its own).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/downloader.c
src/include/ipxe/downloader.h
src/include/usr/imgmgmt.h
src/usr/imgmgmt.c

index 3e21ee9a3f315057eeda984c6d5de666f031cd9c..6e107bee6d214016a325b78e51ebe977c88de1f3 100644 (file)
@@ -50,8 +50,6 @@ struct downloader {
        struct image *image;
        /** Current position within image buffer */
        size_t pos;
-       /** Image registration routine */
-       int ( * register_image ) ( struct image *image );
 };
 
 /**
@@ -75,10 +73,6 @@ static void downloader_free ( struct refcnt *refcnt ) {
  */
 static void downloader_finished ( struct downloader *downloader, int rc ) {
 
-       /* Register image if download was successful */
-       if ( rc == 0 )
-               rc = downloader->register_image ( downloader->image );
-
        /* Shut down interfaces */
        intf_shutdown ( &downloader->xfer, rc );
        intf_shutdown ( &downloader->job, rc );
@@ -219,7 +213,6 @@ static struct interface_descriptor downloader_job_desc =
  *
  * @v job              Job control interface
  * @v image            Image to fill with downloaded file
- * @v register_image   Image registration routine
  * @v type             Location type to pass to xfer_open()
  * @v ...              Remaining arguments to pass to xfer_open()
  * @ret rc             Return status code
@@ -229,7 +222,6 @@ static struct interface_descriptor downloader_job_desc =
  * image registration routine @c register_image() will be called.
  */
 int create_downloader ( struct interface *job, struct image *image,
-                       int ( * register_image ) ( struct image *image ),
                        int type, ... ) {
        struct downloader *downloader;
        va_list args;
@@ -245,7 +237,6 @@ int create_downloader ( struct interface *job, struct image *image,
        intf_init ( &downloader->xfer, &downloader_xfer_desc,
                    &downloader->refcnt );
        downloader->image = image_get ( image );
-       downloader->register_image = register_image;
        va_start ( args, type );
 
        /* Instantiate child objects and attach to our interfaces */
index 3b6a9d6661e8310f0ba3ddf4b843610fbc01e8b3..a7efa3f79a4273b607138ba00d6a8b3a77ae910c 100644 (file)
@@ -13,7 +13,6 @@ struct interface;
 struct image;
 
 extern int create_downloader ( struct interface *job, struct image *image,
-                              int ( * register_image ) ( struct image *image ),
                               int type, ... );
 
 #endif /* _IPXE_DOWNLOADER_H */
index 0beab51393793c5e08bfee34967e46cb7df7f67b..64e51499e03bb372e24a80ee8b0bbc4131aabffb 100644 (file)
@@ -12,9 +12,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
 struct image;
 
 extern int imgdownload ( struct image *image, struct uri *uri,
-                        int ( * image_register ) ( struct image *image ) );
+                        int ( * action ) ( struct image *image ) );
 extern int imgfetch ( struct image *image, const char *uri_string,
-                     int ( * image_register ) ( struct image *image ) );
+                     int ( * action ) ( struct image *image ) );
 extern int imgload ( struct image *image );
 extern int imgexec ( struct image *image );
 extern struct image * imgautoselect ( void );
index e958bc199c5dac7ebfc26c31f683ab46b91f3dd3..6b15035383425b61dc9d87796722b244ee0ce4b8 100644 (file)
@@ -40,11 +40,11 @@ FILE_LICENCE ( GPL2_OR_LATER );
  *
  * @v image            Image
  * @v uri              URI
- * @v image_register   Action to take upon a successful download
+ * @v action           Action to take upon a successful download
  * @ret rc             Return status code
  */
 int imgdownload ( struct image *image, struct uri *uri,
-                 int ( * image_register ) ( struct image *image ) ) {
+                 int ( * action ) ( struct image *image ) ) {
        size_t len = ( unparse_uri ( NULL, 0, uri, URI_ALL ) + 1 );
        char uri_string_redacted[len];
        const char *password;
@@ -62,14 +62,18 @@ int imgdownload ( struct image *image, struct uri *uri,
        uri->password = password;
 
        /* Create downloader */
-       if ( ( rc = create_downloader ( &monojob, image, image_register,
-                                       LOCATION_URI, uri ) ) != 0 )
+       if ( ( rc = create_downloader ( &monojob, image, LOCATION_URI,
+                                       uri ) ) != 0 )
                return rc;
 
        /* Wait for download to complete */
        if ( ( rc = monojob_wait ( uri_string_redacted ) ) != 0 )
                return rc;
 
+       /* Act upon downloaded image */
+       if ( ( rc = action ( image ) ) != 0 )
+               return rc;
+
        return 0;
 }
 
@@ -78,18 +82,18 @@ int imgdownload ( struct image *image, struct uri *uri,
  *
  * @v image            Image
  * @v uri_string       URI as a string (e.g. "http://www.nowhere.com/vmlinuz")
- * @v image_register   Action to take upon a successful fetch
+ * @v action           Action to take upon a successful download
  * @ret rc             Return status code
  */
 int imgfetch ( struct image *image, const char *uri_string,
-              int ( * image_register ) ( struct image *image ) ) {
+              int ( * action ) ( struct image *image ) ) {
        struct uri *uri;
        int rc;
 
        if ( ! ( uri = parse_uri ( uri_string ) ) )
                return -ENOMEM;
 
-       rc = imgdownload ( image, uri, image_register );
+       rc = imgdownload ( image, uri, action );
 
        uri_put ( uri );
        return rc;