FILE_LICENCE ( GPL2_OR_LATER );
#include <stdlib.h>
-#include <stdarg.h>
#include <errno.h>
#include <syslog.h>
#include <ipxe/iobuf.h>
*
* @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 */
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;
}
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 )
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;
}
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;
}