]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[image] Provide image_set_uri() to modify an image's URI
authorMichael Brown <mcb30@ipxe.org>
Sat, 9 Jan 2016 13:22:37 +0000 (13:22 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sat, 9 Jan 2016 13:22:37 +0000 (13:22 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/image.c
src/include/ipxe/image.h

index 529e3d72cd4ce7a7629f700d23ccf0d3b57fcc17..4a4e9c2a032455d6ac36c96d2051435f536a8cd3 100644 (file)
@@ -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
  *
index 6abd7a2d2f226d192e7a770c9bf70de7bf633a99..f33feddad9e07411694eaefe768d4815e14304e9 100644 (file)
@@ -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 );