diff options
author | Michael Brown <mcb30@ipxe.org> | 2021-05-12 13:54:59 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2021-05-12 13:57:35 +0100 |
commit | 191f8825cbd17a6819545e5633287e3d934039b6 (patch) | |
tree | 0d4ec7ae17fb56a08975e3a5d9e6041128ae6af5 /src/core | |
parent | a6a8bb1a9a58becb82dfacc7bc27cf645d0e216c (diff) | |
download | ipxe-191f8825cbd17a6819545e5633287e3d934039b6.tar.gz |
[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.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/core/archive.c b/src/core/archive.c index cd024bde3..7ef86bd9a 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 ); |