[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>
pull/373/head
Michael Brown 2021-05-12 13:54:59 +01:00
parent a6a8bb1a9a
commit 191f8825cb
4 changed files with 33 additions and 0 deletions

View 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 );

View 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,
};

View 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,
};

View 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