* @ret image Executable image
*/
struct image * alloc_image ( struct uri *uri ) {
- const char *name;
struct image *image;
int rc;
/* 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
*
}
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 );