From c165e8d1fc03c12549e222c65505fe954a199d77 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 25 Feb 2014 15:29:00 +0000 Subject: [PATCH] [image] Ensure every image has a fully resolved URI Signed-off-by: Michael Brown --- src/core/downloader.c | 16 ++++------------ src/include/ipxe/downloader.h | 3 +-- src/usr/imgmgmt.c | 32 ++++++++++++++++++++------------ 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/core/downloader.c b/src/core/downloader.c index 3927dfabf..cec6625ba 100644 --- a/src/core/downloader.c +++ b/src/core/downloader.c @@ -20,7 +20,6 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include -#include #include #include #include @@ -229,17 +228,13 @@ static struct interface_descriptor downloader_job_desc = * * @v job Job control interface * @v image Image to fill with downloaded file - * @v type Location type to pass to xfer_open() - * @v ... Remaining arguments to pass to xfer_open() * @ret rc Return status code * - * Instantiates a downloader object to download the specified URI into - * the specified image object. + * Instantiates a downloader object to download the content of the + * specified image from its URI. */ -int create_downloader ( struct interface *job, struct image *image, - int type, ... ) { +int create_downloader ( struct interface *job, struct image *image ) { struct downloader *downloader; - va_list args; int rc; /* Allocate and initialise structure */ @@ -252,21 +247,18 @@ int create_downloader ( struct interface *job, struct image *image, intf_init ( &downloader->xfer, &downloader_xfer_desc, &downloader->refcnt ); downloader->image = image_get ( image ); - va_start ( args, type ); /* Instantiate child objects and attach to our interfaces */ - if ( ( rc = xfer_vopen ( &downloader->xfer, type, args ) ) != 0 ) + if ( ( rc = xfer_open_uri ( &downloader->xfer, image->uri ) ) != 0 ) goto err; /* Attach parent interface, mortalise self, and return */ intf_plug_plug ( &downloader->job, job ); ref_put ( &downloader->refcnt ); - va_end ( args ); return 0; err: downloader_finished ( downloader, rc ); ref_put ( &downloader->refcnt ); - va_end ( args ); return rc; } diff --git a/src/include/ipxe/downloader.h b/src/include/ipxe/downloader.h index a7efa3f79..de1a2e75e 100644 --- a/src/include/ipxe/downloader.h +++ b/src/include/ipxe/downloader.h @@ -12,7 +12,6 @@ FILE_LICENCE ( GPL2_OR_LATER ); struct interface; struct image; -extern int create_downloader ( struct interface *job, struct image *image, - int type, ... ); +extern int create_downloader ( struct interface *job, struct image *image ); #endif /* _IPXE_DOWNLOADER_H */ diff --git a/src/usr/imgmgmt.c b/src/usr/imgmgmt.c index 1f1f69048..18cabbbc6 100644 --- a/src/usr/imgmgmt.c +++ b/src/usr/imgmgmt.c @@ -48,13 +48,6 @@ int imgdownload ( struct uri *uri, struct image **image ) { char *uri_string_redacted; int rc; - /* Allocate image */ - *image = alloc_image ( uri ); - if ( ! *image ) { - rc = -ENOMEM; - goto err_alloc_image; - } - /* Construct redacted URI */ password = uri->password; if ( password ) @@ -63,12 +56,25 @@ int imgdownload ( struct uri *uri, struct image **image ) { uri->password = password; if ( ! uri_string_redacted ) { rc = -ENOMEM; - goto err_uri; + goto err_uri_string; + } + + /* Resolve URI */ + uri = resolve_uri ( cwuri, uri ); + if ( ! uri ) { + rc = -ENOMEM; + goto err_resolve_uri; + } + + /* Allocate image */ + *image = alloc_image ( uri ); + if ( ! *image ) { + rc = -ENOMEM; + goto err_alloc_image; } /* Create downloader */ - if ( ( rc = create_downloader ( &monojob, *image, LOCATION_URI, - uri ) ) != 0 ) { + if ( ( rc = create_downloader ( &monojob, *image ) ) != 0 ) { printf ( "Could not start download: %s\n", strerror ( rc ) ); goto err_create_downloader; } @@ -86,10 +92,12 @@ int imgdownload ( struct uri *uri, struct image **image ) { err_register_image: err_monojob_wait: err_create_downloader: - free ( uri_string_redacted ); - err_uri: image_put ( *image ); err_alloc_image: + uri_put ( uri ); + err_resolve_uri: + free ( uri_string_redacted ); + err_uri_string: return rc; }