]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[image] Ensure every image has a fully resolved URI
authorMichael Brown <mcb30@ipxe.org>
Tue, 25 Feb 2014 15:29:00 +0000 (15:29 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 27 Feb 2014 13:32:58 +0000 (13:32 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/downloader.c
src/include/ipxe/downloader.h
src/usr/imgmgmt.c

index 3927dfabf09c51cd4d3f5ef45887a985e28de861..cec6625ba84d497a76650ba83637a9bac6791a5e 100644 (file)
@@ -20,7 +20,6 @@
 FILE_LICENCE ( GPL2_OR_LATER );
 
 #include <stdlib.h>
-#include <stdarg.h>
 #include <errno.h>
 #include <syslog.h>
 #include <ipxe/iobuf.h>
@@ -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;
 }
index a7efa3f79a4273b607138ba00d6a8b3a77ae910c..de1a2e75ec7ce432f69633d849c8d6204e0e7331 100644 (file)
@@ -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 */
index 1f1f690488d0cc7ef11439283569c6932d2b4a13..18cabbbc69a8b59182dafceb16bb802593e3c589 100644 (file)
@@ -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;
 }