aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2021-05-12 13:54:59 +0100
committerMichael Brown <mcb30@ipxe.org>2021-05-12 13:57:35 +0100
commit191f8825cbd17a6819545e5633287e3d934039b6 (patch)
tree0d4ec7ae17fb56a08975e3a5d9e6041128ae6af5 /src/core
parenta6a8bb1a9a58becb82dfacc7bc27cf645d0e216c (diff)
downloadipxe-191f8825cbd17a6819545e5633287e3d934039b6.zip
ipxe-191f8825cbd17a6819545e5633287e3d934039b6.tar.gz
ipxe-191f8825cbd17a6819545e5633287e3d934039b6.tar.bz2
[image] Allow single-member archive images to be executed transparently
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>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/archive.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/core/archive.c b/src/core/archive.c
index cd024bd..7ef86bd 100644
--- a/src/core/archive.c
+++ b/src/core/archive.c
@@ -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 );