diff --git a/src/core/image.c b/src/core/image.c index 529e3d72c..4a4e9c2a0 100644 --- a/src/core/image.c +++ b/src/core/image.c @@ -88,7 +88,6 @@ static void free_image ( struct refcnt *refcnt ) { * @ret image Executable image */ struct image * alloc_image ( struct uri *uri ) { - const char *name; struct image *image; int rc; @@ -99,23 +98,42 @@ struct image * alloc_image ( struct uri *uri ) { /* Initialise image */ ref_init ( &image->refcnt, free_image ); - if ( uri ) { - image->uri = uri_get ( uri ); - if ( uri->path ) { - name = basename ( ( char * ) uri->path ); - if ( ( rc = image_set_name ( image, name ) ) != 0 ) - goto err_set_name; - } - } + if ( uri && ( ( rc = image_set_uri ( image, uri ) ) != 0 ) ) + goto err_set_uri; return image; - err_set_name: + err_set_uri: image_put ( image ); err_alloc: return NULL; } +/** + * Set image URI + * + * @v image Image + * @v uri New image URI + * @ret rc Return status code + */ +int image_set_uri ( struct image *image, struct uri *uri ) { + const char *name; + int rc; + + /* Set name, if image does not already have one */ + if ( uri->path && ( ! ( image->name && image->name[0] ) ) ) { + name = basename ( ( char * ) uri->path ); + if ( ( rc = image_set_name ( image, name ) ) != 0 ) + return rc; + } + + /* Update image URI */ + uri_put ( image->uri ); + image->uri = uri_get ( uri ); + + return 0; +} + /** * Set image name * diff --git a/src/include/ipxe/image.h b/src/include/ipxe/image.h index 6abd7a2d2..f33feddad 100644 --- a/src/include/ipxe/image.h +++ b/src/include/ipxe/image.h @@ -158,6 +158,7 @@ static inline struct image * first_image ( void ) { } extern struct image * alloc_image ( struct uri *uri ); +extern int image_set_uri ( struct image *image, struct uri *uri ); extern int image_set_name ( struct image *image, const char *name ); extern int image_set_cmdline ( struct image *image, const char *cmdline ); extern int register_image ( struct image *image );