aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
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 );