From: Glenn Washburn Date: Fri, 26 Aug 2022 04:08:57 +0000 (-0500) Subject: disk/loopback: Support transparent decompression of backing file X-Git-Tag: grub-2.12-rc1~264 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=084dfe6d9c7a5144391ac1b5e6bca09c0878a3b1;p=thirdparty%2Fgrub.git disk/loopback: Support transparent decompression of backing file A new option is added to the loopback command, -D or --decompress, which when specified transparently decompresses the backing file. This allows compressed images to be used as if they were uncompressed. Add documentation to support this change. Suggested-by: Li Gen Signed-off-by: Glenn Washburn Reviewed-by: Daniel Kiper --- diff --git a/docs/grub.texi b/docs/grub.texi index 107f66ebc..211cddc01 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -4938,7 +4938,7 @@ suffix @samp{.pf2} appended. @xref{Theme file format,,Fonts}. @node loopback @subsection loopback -@deffn Command loopback [@option{-d}] device file +@deffn Command loopback [@option{-d}] [@option{-D}] device file Make the device named @var{device} correspond to the contents of the filesystem image in @var{file}. For example: @@ -4947,6 +4947,9 @@ loopback loop0 /path/to/image ls (loop0)/ @end example +Specifying the @option{-D} option allows the loopback file to be tranparently +decompressed if there is an appropriate decompressor loaded. + With the @option{-d} option, delete a device previously created using this command. @end deffn diff --git a/grub-core/disk/loopback.c b/grub-core/disk/loopback.c index 41bebd14f..2cfc53a91 100644 --- a/grub-core/disk/loopback.c +++ b/grub-core/disk/loopback.c @@ -43,6 +43,7 @@ static const struct grub_arg_option options[] = /* TRANSLATORS: The disk is simply removed from the list of available ones, not wiped, avoid to scare user. */ {"delete", 'd', 0, N_("Delete the specified loopback drive."), 0, 0}, + {"decompress", 'D', 0, N_("Transparently decompress backing file."), 0, 0}, {0, 0, 0, 0, 0, 0} }; @@ -79,6 +80,7 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; grub_file_t file; + enum grub_file_type type = GRUB_FILE_TYPE_LOOPBACK; struct grub_loopback *newdev; grub_err_t ret; @@ -89,6 +91,9 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args) if (state[0].set) return delete_loopback (args[0]); + if (!state[1].set) + type |= GRUB_FILE_TYPE_NO_DECOMPRESS; + if (argc < 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); @@ -97,8 +102,7 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args) if (grub_strcmp (newdev->devname, args[0]) == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name already exists"); - file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK - | GRUB_FILE_TYPE_NO_DECOMPRESS); + file = grub_file_open (args[1], type); if (! file) return grub_errno; @@ -226,7 +230,7 @@ static grub_extcmd_t cmd; GRUB_MOD_INIT(loopback) { cmd = grub_register_extcmd ("loopback", grub_cmd_loopback, 0, - N_("[-d] DEVICENAME FILE."), + N_("[-d] [-D] DEVICENAME FILE."), /* TRANSLATORS: The file itself is not destroyed or transformed into drive. */ N_("Make a virtual drive from a file."), options);