]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[image] Allow single-member archive images to be executed transparently
authorMichael Brown <mcb30@ipxe.org>
Wed, 12 May 2021 12:54:59 +0000 (13:54 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 12 May 2021 12:57:35 +0000 (13:57 +0100)
Provide image_extract_exec() as a helper method to allow single-member
archive images (such as gzip compressed images) to be executed without
an explicit "imgextract" step.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/archive.c
src/image/gzip.c
src/image/zlib.c
src/include/ipxe/image.h

index cd024bde3b880abbd4d30e44ecaf3f6407ac8276..7ef86bd9a528d2373dbb2b037ae8414305e80359 100644 (file)
@@ -97,6 +97,36 @@ int image_extract ( struct image *image, const char *name,
        return rc;
 }
 
+/**
+ * Extract and execute image
+ *
+ * @v image            Image
+ * @ret rc             Return status code
+ */
+int image_extract_exec ( struct image *image ) {
+       struct image *extracted;
+       int rc;
+
+       /* Extract image */
+       if ( ( rc = image_extract ( image, NULL, &extracted ) ) != 0 )
+               goto err_extract;
+
+       /* Set image command line */
+       if ( ( rc = image_set_cmdline ( extracted, image->cmdline ) ) != 0 )
+               goto err_set_cmdline;
+
+       /* Set auto-unregister flag */
+       extracted->flags |= IMAGE_AUTO_UNREGISTER;
+
+       /* Tail-recurse into extracted image */
+       return image_exec ( extracted );
+
+ err_set_cmdline:
+       unregister_image ( extracted );
+ err_extract:
+       return rc;
+}
+
 /* Drag in objects via image_extract() */
 REQUIRING_SYMBOL ( image_extract );
 
index 40728138bcadc3010c06d2f3fafb21ad29d8c969..98376e1133b41dc82e02ce256c49e765c47de808 100644 (file)
@@ -163,4 +163,5 @@ struct image_type gzip_image_type __image_type ( PROBE_NORMAL ) = {
        .name = "gzip",
        .probe = gzip_probe,
        .extract = gzip_extract,
+       .exec = image_extract_exec,
 };
index bc27142d7d48d69a41562ca32e47b4d62f0f4a2f..a42c47e1ba809e8adbb7cf03e83c20fa56ac867a 100644 (file)
@@ -159,4 +159,5 @@ struct image_type zlib_image_type __image_type ( PROBE_NORMAL ) = {
        .name = "zlib",
        .probe = zlib_probe,
        .extract = zlib_extract,
+       .exec = image_extract_exec,
 };
index c6e723dc69e85ccfa71a268becbcaf3e7a4df728..0a5a2603462293576bf7a41f9fd09a5561bab179 100644 (file)
@@ -200,6 +200,7 @@ extern int image_asn1 ( struct image *image, size_t offset,
                        struct asn1_cursor **cursor );
 extern int image_extract ( struct image *image, const char *name,
                           struct image **extracted );
+extern int image_extract_exec ( struct image *image );
 
 /**
  * Increment reference count on an image