Skip to content

Commit

Permalink
[image] Allow download job to complete before acting upon image
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Mar 2, 2011
1 parent 560cc63 commit 3c9c27b
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 19 deletions.
9 changes: 0 additions & 9 deletions src/core/downloader.c
Expand Up @@ -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 );
};

/**
Expand All @@ -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 );
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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 */
Expand Down
1 change: 0 additions & 1 deletion src/include/ipxe/downloader.h
Expand Up @@ -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 */
4 changes: 2 additions & 2 deletions src/include/usr/imgmgmt.h
Expand Up @@ -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 );
Expand Down
18 changes: 11 additions & 7 deletions src/usr/imgmgmt.c
Expand Up @@ -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;
Expand All @@ -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;
}

Expand All @@ -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;
Expand Down

0 comments on commit 3c9c27b

Please sign in to comment.