Blame SOURCES/0330-verifiers-File-type-for-fine-grained-signature-verif.patch

3efed6
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
3efed6
From: Vladimir Serbinenko <phcoder@gmail.com>
3efed6
Date: Wed, 20 Nov 2013 02:28:29 +0100
3efed6
Subject: [PATCH] verifiers: File type for fine-grained signature-verification
3efed6
 controlling
3efed6
3efed6
Let's provide file type info to the I/O layer. This way verifiers
3efed6
framework and its users will be able to differentiate files and verify
3efed6
only required ones.
3efed6
3efed6
This is preparatory patch.
3efed6
3efed6
Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
3efed6
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
3efed6
Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
3efed6
(backported from commit ca0a4f689a02c2c5a5e385f874aaaa38e151564e)
3efed6
Signed-off-by: Daniel Axtens <dja@axtens.net>
3efed6
---
3efed6
 grub-core/commands/acpi.c                    |   2 +-
3efed6
 grub-core/commands/blocklist.c               |   4 +-
3efed6
 grub-core/commands/cat.c                     |   2 +-
3efed6
 grub-core/commands/cmp.c                     |   4 +-
3efed6
 grub-core/commands/efi/loadbios.c            |   4 +-
3efed6
 grub-core/commands/file.c                    |   5 +-
3efed6
 grub-core/commands/hashsum.c                 |  22 ++--
3efed6
 grub-core/commands/hexdump.c                 |   2 +-
3efed6
 grub-core/commands/i386/pc/play.c            |   2 +-
3efed6
 grub-core/commands/keylayouts.c              |   2 +-
3efed6
 grub-core/commands/legacycfg.c               |   2 +-
3efed6
 grub-core/commands/loadenv.c                 |  24 +++--
3efed6
 grub-core/commands/ls.c                      |   8 +-
3efed6
 grub-core/commands/minicmd.c                 |   2 +-
3efed6
 grub-core/commands/nativedisk.c              |   3 +-
3efed6
 grub-core/commands/parttool.c                |   2 +-
3efed6
 grub-core/commands/search.c                  |   4 +-
3efed6
 grub-core/commands/test.c                    |   4 +-
3efed6
 grub-core/commands/testload.c                |   2 +-
3efed6
 grub-core/commands/testspeed.c               |   2 +-
3efed6
 grub-core/commands/verify.c                  |  51 ++++-----
3efed6
 grub-core/disk/loopback.c                    |   3 +-
3efed6
 grub-core/efiemu/main.c                      |   2 +-
3efed6
 grub-core/font/font.c                        |   4 +-
3efed6
 grub-core/fs/zfs/zfscrypt.c                  |   2 +-
3efed6
 grub-core/gettext/gettext.c                  |   2 +-
3efed6
 grub-core/gfxmenu/theme_loader.c             |   2 +-
3efed6
 grub-core/io/bufio.c                         |   4 +-
3efed6
 grub-core/io/gzio.c                          |   5 +-
3efed6
 grub-core/io/lzopio.c                        |   6 +-
3efed6
 grub-core/io/offset.c                        |   7 +-
3efed6
 grub-core/io/xzio.c                          |   6 +-
3efed6
 grub-core/kern/dl.c                          |   2 +-
3efed6
 grub-core/kern/elf.c                         |   4 +-
3efed6
 grub-core/kern/file.c                        |  22 ++--
3efed6
 grub-core/lib/syslinux_parse.c               |   2 +-
3efed6
 grub-core/loader/efi/chainloader.c           |   2 +-
3efed6
 grub-core/loader/i386/bsd.c                  |  16 +--
3efed6
 grub-core/loader/i386/coreboot/chainloader.c |   2 +-
3efed6
 grub-core/loader/i386/linux.c                |   2 +-
3efed6
 grub-core/loader/i386/pc/chainloader.c       |   4 +-
3efed6
 grub-core/loader/i386/pc/freedos.c           |   2 +-
3efed6
 grub-core/loader/i386/pc/linux.c             |   2 +-
3efed6
 grub-core/loader/i386/pc/ntldr.c             |   2 +-
3efed6
 grub-core/loader/i386/pc/plan9.c             |   2 +-
3efed6
 grub-core/loader/i386/pc/pxechainloader.c    |   2 +-
3efed6
 grub-core/loader/i386/pc/truecrypt.c         |   2 +-
3efed6
 grub-core/loader/i386/xen.c                  |   7 +-
3efed6
 grub-core/loader/i386/xen_file.c             |   2 +-
3efed6
 grub-core/loader/i386/xnu.c                  |   2 +-
3efed6
 grub-core/loader/linux.c                     |   6 +-
3efed6
 grub-core/loader/macho.c                     |   4 +-
3efed6
 grub-core/loader/mips/linux.c                |   2 +-
3efed6
 grub-core/loader/multiboot.c                 |   8 +-
3efed6
 grub-core/loader/xnu.c                       |  16 +--
3efed6
 grub-core/loader/xnu_resume.c                |   4 +-
3efed6
 grub-core/normal/autofs.c                    |  11 +-
3efed6
 grub-core/normal/crypto.c                    |   2 +-
3efed6
 grub-core/normal/dyncmd.c                    |   2 +-
3efed6
 grub-core/normal/main.c                      |   2 +-
3efed6
 grub-core/normal/term.c                      |   2 +-
3efed6
 grub-core/video/readers/jpeg.c               |   2 +-
3efed6
 grub-core/video/readers/png.c                |   2 +-
3efed6
 grub-core/video/readers/tga.c                |   2 +-
3efed6
 util/grub-fstest.c                           |   6 +-
3efed6
 util/grub-mount.c                            |   6 +-
3efed6
 include/grub/bufio.h                         |   4 +-
3efed6
 include/grub/elfload.h                       |   2 +-
3efed6
 include/grub/file.h                          | 152 +++++++++++++++++++--------
3efed6
 include/grub/machoload.h                     |   3 +-
3efed6
 70 files changed, 292 insertions(+), 221 deletions(-)
3efed6
3efed6
diff --git a/grub-core/commands/acpi.c b/grub-core/commands/acpi.c
3efed6
index 9f02f22019a..5a1499aa0e3 100644
3efed6
--- a/grub-core/commands/acpi.c
3efed6
+++ b/grub-core/commands/acpi.c
3efed6
@@ -635,7 +635,7 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
3efed6
       grub_size_t size;
3efed6
       char *buf;
3efed6
 
3efed6
-      file = grub_file_open (args[i]);
3efed6
+      file = grub_file_open (args[i], GRUB_FILE_TYPE_ACPI_TABLE);
3efed6
       if (! file)
3efed6
 	{
3efed6
 	  free_tables ();
3efed6
diff --git a/grub-core/commands/blocklist.c b/grub-core/commands/blocklist.c
3efed6
index d1a47b504bf..944449b77d4 100644
3efed6
--- a/grub-core/commands/blocklist.c
3efed6
+++ b/grub-core/commands/blocklist.c
3efed6
@@ -121,8 +121,8 @@ grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (argc < 1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  grub_file_filter_disable_compression ();
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_PRINT_BLOCKLIST
3efed6
+			 | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/commands/cat.c b/grub-core/commands/cat.c
3efed6
index 88d90443602..ba5f0061aa5 100644
3efed6
--- a/grub-core/commands/cat.c
3efed6
+++ b/grub-core/commands/cat.c
3efed6
@@ -56,7 +56,7 @@ grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
   if (argc != 1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/commands/cmp.c b/grub-core/commands/cmp.c
3efed6
index cc23ee67ea3..e9c3b25d34c 100644
3efed6
--- a/grub-core/commands/cmp.c
3efed6
+++ b/grub-core/commands/cmp.c
3efed6
@@ -45,8 +45,8 @@ grub_cmd_cmp (grub_command_t cmd __attribute__ ((unused)),
3efed6
   grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0],
3efed6
 		args[1]);
3efed6
 
3efed6
-  file1 = grub_file_open (args[0]);
3efed6
-  file2 = grub_file_open (args[1]);
3efed6
+  file1 = grub_file_open (args[0], GRUB_FILE_TYPE_CMP);
3efed6
+  file2 = grub_file_open (args[1], GRUB_FILE_TYPE_CMP);
3efed6
   if (! file1 || ! file2)
3efed6
     goto cleanup;
3efed6
 
3efed6
diff --git a/grub-core/commands/efi/loadbios.c b/grub-core/commands/efi/loadbios.c
3efed6
index 132cadbc764..d41d521a4ae 100644
3efed6
--- a/grub-core/commands/efi/loadbios.c
3efed6
+++ b/grub-core/commands/efi/loadbios.c
3efed6
@@ -169,7 +169,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
3efed6
 
3efed6
   if (argc > 1)
3efed6
     {
3efed6
-      file = grub_file_open (argv[1]);
3efed6
+      file = grub_file_open (argv[1], GRUB_FILE_TYPE_VBE_DUMP);
3efed6
       if (! file)
3efed6
 	return grub_errno;
3efed6
 
3efed6
@@ -183,7 +183,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
3efed6
 	return grub_errno;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_VBE_DUMP);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/commands/file.c b/grub-core/commands/file.c
3efed6
index 3ff6d5522d2..4f81aa1f9e1 100644
3efed6
--- a/grub-core/commands/file.c
3efed6
+++ b/grub-core/commands/file.c
3efed6
@@ -165,7 +165,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
   if (type == -1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified");
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
   switch (type)
3efed6
@@ -546,7 +546,8 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
     case IS_XNU64:
3efed6
     case IS_XNU32:
3efed6
       {
3efed6
-	macho = grub_macho_open (args[0], (type == IS_XNU64));
3efed6
+	macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL,
3efed6
+				 (type == IS_XNU64));
3efed6
 	if (!macho)
3efed6
 	  break;
3efed6
 	/* FIXME: more checks?  */
3efed6
diff --git a/grub-core/commands/hashsum.c b/grub-core/commands/hashsum.c
3efed6
index d18687351a5..456ba908b6f 100644
3efed6
--- a/grub-core/commands/hashsum.c
3efed6
+++ b/grub-core/commands/hashsum.c
3efed6
@@ -113,7 +113,7 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
3efed6
   if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
3efed6
     return grub_error (GRUB_ERR_BUG, "mdlen is too long");
3efed6
 
3efed6
-  hashlist = grub_file_open (hashfilename);
3efed6
+  hashlist = grub_file_open (hashfilename, GRUB_FILE_TYPE_HASHLIST);
3efed6
   if (!hashlist)
3efed6
     return grub_errno;
3efed6
   
3efed6
@@ -141,17 +141,15 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
3efed6
 	  filename = grub_xasprintf ("%s/%s", prefix, p);
3efed6
 	  if (!filename)
3efed6
 	    return grub_errno;
3efed6
-	  if (!uncompress)
3efed6
-	    grub_file_filter_disable_compression ();
3efed6
-	  file = grub_file_open (filename);
3efed6
+	  file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
3efed6
+				 | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
3efed6
+				    : GRUB_FILE_TYPE_NONE));
3efed6
 	  grub_free (filename);
3efed6
 	}
3efed6
       else
3efed6
-	{
3efed6
-	  if (!uncompress)
3efed6
-	    grub_file_filter_disable_compression ();
3efed6
-	  file = grub_file_open (p);
3efed6
-	}
3efed6
+	file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
3efed6
+			       | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
3efed6
+				  : GRUB_FILE_TYPE_NONE));
3efed6
       if (!file)
3efed6
 	{
3efed6
 	  grub_file_close (hashlist);
3efed6
@@ -242,9 +240,9 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
3efed6
       grub_file_t file;
3efed6
       grub_err_t err;
3efed6
       unsigned j;
3efed6
-      if (!uncompress)
3efed6
-	grub_file_filter_disable_compression ();
3efed6
-      file = grub_file_open (args[i]);
3efed6
+      file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
3efed6
+			     | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
3efed6
+				: GRUB_FILE_TYPE_NONE));
3efed6
       if (!file)
3efed6
 	{
3efed6
 	  if (!keep)
3efed6
diff --git a/grub-core/commands/hexdump.c b/grub-core/commands/hexdump.c
3efed6
index 4c884b3a19a..eaa12465bb3 100644
3efed6
--- a/grub-core/commands/hexdump.c
3efed6
+++ b/grub-core/commands/hexdump.c
3efed6
@@ -90,7 +90,7 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
     {
3efed6
       grub_file_t file;
3efed6
 
3efed6
-      file = grub_file_open (args[0]);
3efed6
+      file = grub_file_open (args[0], GRUB_FILE_TYPE_HEXCAT);
3efed6
       if (! file)
3efed6
 	return 0;
3efed6
 
3efed6
diff --git a/grub-core/commands/i386/pc/play.c b/grub-core/commands/i386/pc/play.c
3efed6
index 7712e2a36a1..c8181310515 100644
3efed6
--- a/grub-core/commands/i386/pc/play.c
3efed6
+++ b/grub-core/commands/i386/pc/play.c
3efed6
@@ -93,7 +93,7 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
3efed6
       grub_uint32_t tempo;
3efed6
       grub_file_t file;
3efed6
 
3efed6
-      file = grub_file_open (args[0]);
3efed6
+      file = grub_file_open (args[0], GRUB_FILE_TYPE_AUDIO);
3efed6
 
3efed6
       if (! file)
3efed6
         return grub_errno;
3efed6
diff --git a/grub-core/commands/keylayouts.c b/grub-core/commands/keylayouts.c
3efed6
index f35d3a369ba..c05d6128a6d 100644
3efed6
--- a/grub-core/commands/keylayouts.c
3efed6
+++ b/grub-core/commands/keylayouts.c
3efed6
@@ -220,7 +220,7 @@ grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
3efed6
   else
3efed6
     filename = argv[0];
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_KEYBOARD_LAYOUT);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/commands/legacycfg.c b/grub-core/commands/legacycfg.c
3efed6
index 0de070eacc4..f5696a51a75 100644
3efed6
--- a/grub-core/commands/legacycfg.c
3efed6
+++ b/grub-core/commands/legacycfg.c
3efed6
@@ -56,7 +56,7 @@ legacy_file (const char *filename)
3efed6
   if (!suffix)
3efed6
     return grub_errno;
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_CONFIG);
3efed6
   if (! file)
3efed6
     {
3efed6
       grub_free (suffix);
3efed6
diff --git a/grub-core/commands/loadenv.c b/grub-core/commands/loadenv.c
3efed6
index 91c99456091..163b9a09042 100644
3efed6
--- a/grub-core/commands/loadenv.c
3efed6
+++ b/grub-core/commands/loadenv.c
3efed6
@@ -46,7 +46,8 @@ static const struct grub_arg_option options[] =
3efed6
    PUBKEY filter (that insists upon properly signed files) as well.  PUBKEY
3efed6
    filter is restored before the function returns. */
3efed6
 static grub_file_t
3efed6
-open_envblk_file (char *filename, int untrusted)
3efed6
+open_envblk_file (char *filename,
3efed6
+		  enum grub_file_type type)
3efed6
 {
3efed6
   grub_file_t file;
3efed6
   char *buf = 0;
3efed6
@@ -74,13 +75,7 @@ open_envblk_file (char *filename, int untrusted)
3efed6
       grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
3efed6
     }
3efed6
 
3efed6
-  /* The filters that are disabled will be re-enabled by the call to
3efed6
-     grub_file_open() after this particular file is opened. */
3efed6
-  grub_file_filter_disable_compression ();
3efed6
-  if (untrusted)
3efed6
-    grub_file_filter_disable_pubkey ();
3efed6
-
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, type);
3efed6
 
3efed6
   grub_free (buf);
3efed6
   return file;
3efed6
@@ -98,7 +93,10 @@ grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
   whitelist.list = args;
3efed6
 
3efed6
   /* state[0] is the -f flag; state[1] is the --skip-sig flag */
3efed6
-  file = open_envblk_file ((state[0].set) ? state[0].arg : 0, state[1].set);
3efed6
+  file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
3efed6
+			   GRUB_FILE_TYPE_LOADENV
3efed6
+			   | (state[1].set
3efed6
+			      ? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE));
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -133,7 +131,10 @@ grub_cmd_list_env (grub_extcmd_context_t ctxt,
3efed6
   grub_file_t file;
3efed6
   grub_envblk_t envblk;
3efed6
 
3efed6
-  file = open_envblk_file ((state[0].set) ? state[0].arg : 0, 0);
3efed6
+  file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
3efed6
+			   GRUB_FILE_TYPE_LOADENV
3efed6
+			   | (state[1].set
3efed6
+			      ? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE));
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -317,7 +318,8 @@ grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified");
3efed6
 
3efed6
   file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
3efed6
-                           1 /* allow untrusted */);
3efed6
+			   GRUB_FILE_TYPE_SAVEENV
3efed6
+			   | GRUB_FILE_TYPE_SKIP_SIGNATURE);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
3efed6
index c25161cc4f2..2cdb2acc552 100644
3efed6
--- a/grub-core/commands/ls.c
3efed6
+++ b/grub-core/commands/ls.c
3efed6
@@ -129,8 +129,8 @@ print_files_long (const char *filename, const struct grub_dirhook_info *info,
3efed6
 
3efed6
       /* XXX: For ext2fs symlinks are detected as files while they
3efed6
 	 should be reported as directories.  */
3efed6
-      grub_file_filter_disable_compression ();
3efed6
-      file = grub_file_open (pathname);
3efed6
+      file = grub_file_open (pathname, GRUB_FILE_TYPE_GET_SIZE
3efed6
+			     | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
       if (! file)
3efed6
 	{
3efed6
 	  grub_errno = 0;
3efed6
@@ -234,8 +234,8 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
3efed6
 	  struct grub_dirhook_info info;
3efed6
 	  grub_errno = 0;
3efed6
 
3efed6
-	  grub_file_filter_disable_compression ();
3efed6
-	  file = grub_file_open (dirname);
3efed6
+	  file = grub_file_open (dirname, GRUB_FILE_TYPE_GET_SIZE
3efed6
+				 | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
 	  if (! file)
3efed6
 	    goto fail;
3efed6
 
3efed6
diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c
3efed6
index b25ca4b9f17..46bf135e8f0 100644
3efed6
--- a/grub-core/commands/minicmd.c
3efed6
+++ b/grub-core/commands/minicmd.c
3efed6
@@ -43,7 +43,7 @@ grub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)),
3efed6
   if (argc < 1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_CAT);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/commands/nativedisk.c b/grub-core/commands/nativedisk.c
3efed6
index d69214f6de0..f200a5ce092 100644
3efed6
--- a/grub-core/commands/nativedisk.c
3efed6
+++ b/grub-core/commands/nativedisk.c
3efed6
@@ -242,7 +242,8 @@ grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)),
3efed6
       if (! filename)
3efed6
 	goto fail;
3efed6
 
3efed6
-      file = grub_file_open (filename);
3efed6
+      file = grub_file_open (filename,
3efed6
+			     GRUB_FILE_TYPE_GRUB_MODULE);
3efed6
       grub_free (filename);
3efed6
       if (! file)
3efed6
 	goto fail;
3efed6
diff --git a/grub-core/commands/parttool.c b/grub-core/commands/parttool.c
3efed6
index 36dadc0b1db..051e31320e9 100644
3efed6
--- a/grub-core/commands/parttool.c
3efed6
+++ b/grub-core/commands/parttool.c
3efed6
@@ -199,7 +199,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
3efed6
 	  {
3efed6
 	    grub_file_t file;
3efed6
 
3efed6
-	    file = grub_file_open (filename);
3efed6
+	    file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
3efed6
 	    if (file)
3efed6
 	      {
3efed6
 		char *buf = 0;
3efed6
diff --git a/grub-core/commands/search.c b/grub-core/commands/search.c
3efed6
index 7dd32e445c9..ddda6e7c590 100644
3efed6
--- a/grub-core/commands/search.c
3efed6
+++ b/grub-core/commands/search.c
3efed6
@@ -81,8 +81,8 @@ iterate_device (const char *name, void *data)
3efed6
       if (! buf)
3efed6
 	return 1;
3efed6
 
3efed6
-      grub_file_filter_disable_compression ();
3efed6
-      file = grub_file_open (buf);
3efed6
+      file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH
3efed6
+			     | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
       if (file)
3efed6
 	{
3efed6
 	  found = 1;
3efed6
diff --git a/grub-core/commands/test.c b/grub-core/commands/test.c
3efed6
index 5f06642f6c6..13c6ed9534a 100644
3efed6
--- a/grub-core/commands/test.c
3efed6
+++ b/grub-core/commands/test.c
3efed6
@@ -355,8 +355,8 @@ test_parse (char **args, int *argn, int argc)
3efed6
 	  if (grub_strcmp (args[*argn], "-s") == 0)
3efed6
 	    {
3efed6
 	      grub_file_t file;
3efed6
-	      grub_file_filter_disable_compression ();
3efed6
-	      file = grub_file_open (args[*argn + 1]);
3efed6
+	      file = grub_file_open (args[*argn + 1], GRUB_FILE_TYPE_GET_SIZE
3efed6
+				     | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
 	      update_val (file && (grub_file_size (file) != 0), &ctx;;
3efed6
 	      if (file)
3efed6
 		grub_file_close (file);
3efed6
diff --git a/grub-core/commands/testload.c b/grub-core/commands/testload.c
3efed6
index cfab6763dc3..ff01a0516dd 100644
3efed6
--- a/grub-core/commands/testload.c
3efed6
+++ b/grub-core/commands/testload.c
3efed6
@@ -57,7 +57,7 @@ grub_cmd_testload (struct grub_command *cmd __attribute__ ((unused)),
3efed6
   if (argc < 1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_TESTLOAD);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/commands/testspeed.c b/grub-core/commands/testspeed.c
3efed6
index 042645f8d26..c13a9b8d8d2 100644
3efed6
--- a/grub-core/commands/testspeed.c
3efed6
+++ b/grub-core/commands/testspeed.c
3efed6
@@ -61,7 +61,7 @@ grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
   if (buffer == NULL)
3efed6
     return grub_errno;
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_TESTLOAD);
3efed6
   if (file == NULL)
3efed6
     goto quit;
3efed6
 
3efed6
diff --git a/grub-core/commands/verify.c b/grub-core/commands/verify.c
3efed6
index 67cb1c78509..f0dfeceebd4 100644
3efed6
--- a/grub-core/commands/verify.c
3efed6
+++ b/grub-core/commands/verify.c
3efed6
@@ -680,10 +680,12 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
3efed6
   if (argc < 1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
3efed6
 
3efed6
-  grub_file_filter_disable_compression ();
3efed6
-  if (ctxt->state[OPTION_SKIP_SIG].set)
3efed6
-    grub_file_filter_disable_pubkey ();
3efed6
-  pkf = grub_file_open (args[0]);
3efed6
+  pkf = grub_file_open (args[0],
3efed6
+			GRUB_FILE_TYPE_PUBLIC_KEY_TRUST
3efed6
+			| GRUB_FILE_TYPE_NO_DECOMPRESS
3efed6
+			| (ctxt->state[OPTION_SKIP_SIG].set
3efed6
+			   ? GRUB_FILE_TYPE_SKIP_SIGNATURE
3efed6
+			   : GRUB_FILE_TYPE_NONE));
3efed6
   if (!pkf)
3efed6
     return grub_errno;
3efed6
   pk = grub_load_public_key (pkf);
3efed6
@@ -771,10 +773,12 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
3efed6
   if (argc > 2)
3efed6
     {
3efed6
       grub_file_t pkf;
3efed6
-      grub_file_filter_disable_compression ();
3efed6
-      if (ctxt->state[OPTION_SKIP_SIG].set)
3efed6
-	grub_file_filter_disable_pubkey ();
3efed6
-      pkf = grub_file_open (args[2]);
3efed6
+      pkf = grub_file_open (args[2],
3efed6
+			    GRUB_FILE_TYPE_PUBLIC_KEY
3efed6
+			    | GRUB_FILE_TYPE_NO_DECOMPRESS
3efed6
+			    | (ctxt->state[OPTION_SKIP_SIG].set
3efed6
+			       ? GRUB_FILE_TYPE_SKIP_SIGNATURE
3efed6
+			       : GRUB_FILE_TYPE_NONE));
3efed6
       if (!pkf)
3efed6
 	return grub_errno;
3efed6
       pk = grub_load_public_key (pkf);
3efed6
@@ -786,16 +790,16 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
3efed6
       grub_file_close (pkf);
3efed6
     }
3efed6
 
3efed6
-  grub_file_filter_disable_all ();
3efed6
-  f = grub_file_open (args[0]);
3efed6
+  f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE);
3efed6
   if (!f)
3efed6
     {
3efed6
       err = grub_errno;
3efed6
       goto fail;
3efed6
     }
3efed6
 
3efed6
-  grub_file_filter_disable_all ();
3efed6
-  sig = grub_file_open (args[1]);
3efed6
+  sig = grub_file_open (args[1],
3efed6
+			GRUB_FILE_TYPE_SIGNATURE
3efed6
+			| GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
   if (!sig)
3efed6
     {
3efed6
       err = grub_errno;
3efed6
@@ -858,33 +862,32 @@ struct grub_fs verified_fs =
3efed6
 };
3efed6
 
3efed6
 static grub_file_t
3efed6
-grub_pubkey_open (grub_file_t io, const char *filename)
3efed6
+grub_pubkey_open (grub_file_t io, enum grub_file_type type)
3efed6
 {
3efed6
   grub_file_t sig;
3efed6
   char *fsuf, *ptr;
3efed6
   grub_err_t err;
3efed6
-  grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
3efed6
   grub_file_t ret;
3efed6
   grub_verified_t verified;
3efed6
 
3efed6
+  if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_SIGNATURE
3efed6
+      || (type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_VERIFY_SIGNATURE
3efed6
+      || (type & GRUB_FILE_TYPE_SKIP_SIGNATURE))
3efed6
+    return io;
3efed6
+
3efed6
   if (!sec)
3efed6
     return io;
3efed6
   if (io->device->disk && 
3efed6
       (io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
3efed6
        || io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID))
3efed6
     return io;
3efed6
-  fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig"));
3efed6
+  fsuf = grub_malloc (grub_strlen (io->name) + sizeof (".sig"));
3efed6
   if (!fsuf)
3efed6
     return NULL;
3efed6
-  ptr = grub_stpcpy (fsuf, filename);
3efed6
+  ptr = grub_stpcpy (fsuf, io->name);
3efed6
   grub_memcpy (ptr, ".sig", sizeof (".sig"));
3efed6
 
3efed6
-  grub_memcpy (curfilt, grub_file_filters_enabled,
3efed6
-	       sizeof (curfilt));
3efed6
-  grub_file_filter_disable_all ();
3efed6
-  sig = grub_file_open (fsuf);
3efed6
-  grub_memcpy (grub_file_filters_enabled, curfilt,
3efed6
-	       sizeof (curfilt));
3efed6
+  sig = grub_file_open (fsuf, GRUB_FILE_TYPE_SIGNATURE);
3efed6
   grub_free (fsuf);
3efed6
   if (!sig)
3efed6
     return NULL;
3efed6
@@ -918,7 +921,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
3efed6
   if (!verified->buf)
3efed6
     {
3efed6
       grub_file_close (sig);
3efed6
-      grub_free (verified);
3efed6
+      verified_free (verified);
3efed6
       grub_free (ret);
3efed6
       return NULL;
3efed6
     }
3efed6
@@ -926,7 +929,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
3efed6
     {
3efed6
       if (!grub_errno)
3efed6
 	grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
3efed6
-		    filename);
3efed6
+		    io->name);
3efed6
       grub_file_close (sig);
3efed6
       verified_free (verified);
3efed6
       grub_free (ret);
3efed6
diff --git a/grub-core/disk/loopback.c b/grub-core/disk/loopback.c
3efed6
index 2d8deaeafbd..9406d931cdd 100644
3efed6
--- a/grub-core/disk/loopback.c
3efed6
+++ b/grub-core/disk/loopback.c
3efed6
@@ -92,7 +92,8 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
   if (argc < 2)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  file = grub_file_open (args[1]);
3efed6
+  file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK
3efed6
+			 | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/efiemu/main.c b/grub-core/efiemu/main.c
3efed6
index f6813b1ed15..a81934725be 100644
3efed6
--- a/grub-core/efiemu/main.c
3efed6
+++ b/grub-core/efiemu/main.c
3efed6
@@ -187,7 +187,7 @@ grub_efiemu_load_file (const char *filename)
3efed6
   grub_file_t file;
3efed6
   grub_err_t err;
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/font/font.c b/grub-core/font/font.c
3efed6
index b36a099b856..b67507fcc82 100644
3efed6
--- a/grub-core/font/font.c
3efed6
+++ b/grub-core/font/font.c
3efed6
@@ -422,7 +422,7 @@ grub_font_load (const char *filename)
3efed6
 #endif
3efed6
 
3efed6
   if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+')
3efed6
-    file = grub_buffile_open (filename, 1024);
3efed6
+    file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
3efed6
   else
3efed6
     {
3efed6
       const char *prefix = grub_env_get ("prefix");
3efed6
@@ -442,7 +442,7 @@ grub_font_load (const char *filename)
3efed6
       ptr = grub_stpcpy (ptr, filename);
3efed6
       ptr = grub_stpcpy (ptr, ".pf2");
3efed6
       *ptr = 0;
3efed6
-      file = grub_buffile_open (fullname, 1024);
3efed6
+      file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024);
3efed6
       grub_free (fullname);
3efed6
     }
3efed6
   if (!file)
3efed6
diff --git a/grub-core/fs/zfs/zfscrypt.c b/grub-core/fs/zfs/zfscrypt.c
3efed6
index f8488c35344..de3b015f582 100644
3efed6
--- a/grub-core/fs/zfs/zfscrypt.c
3efed6
+++ b/grub-core/fs/zfs/zfscrypt.c
3efed6
@@ -430,7 +430,7 @@ grub_cmd_zfs_key (grub_extcmd_context_t ctxt, int argc, char **args)
3efed6
   if (argc > 0)
3efed6
     {
3efed6
       grub_file_t file;
3efed6
-      file = grub_file_open (args[0]);
3efed6
+      file = grub_file_open (args[0], GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY);
3efed6
       if (!file)
3efed6
 	return grub_errno;
3efed6
       real_size = grub_file_read (file, buf, 1024);
3efed6
diff --git a/grub-core/gettext/gettext.c b/grub-core/gettext/gettext.c
3efed6
index b22e1bcc94b..84d520cd494 100644
3efed6
--- a/grub-core/gettext/gettext.c
3efed6
+++ b/grub-core/gettext/gettext.c
3efed6
@@ -291,7 +291,7 @@ grub_mofile_open (struct grub_gettext_context *ctx,
3efed6
   /* Using fd_mo and not another variable because
3efed6
      it's needed for grub_gettext_get_info.  */
3efed6
 
3efed6
-  fd = grub_file_open (filename);
3efed6
+  fd = grub_file_open (filename, GRUB_FILE_TYPE_GETTEXT_CATALOG);
3efed6
 
3efed6
   if (!fd)
3efed6
     return grub_errno;
3efed6
diff --git a/grub-core/gfxmenu/theme_loader.c b/grub-core/gfxmenu/theme_loader.c
3efed6
index 02978392ccc..d6829bb5e90 100644
3efed6
--- a/grub-core/gfxmenu/theme_loader.c
3efed6
+++ b/grub-core/gfxmenu/theme_loader.c
3efed6
@@ -743,7 +743,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
3efed6
   p.view = view;
3efed6
   p.theme_dir = grub_get_dirname (theme_path);
3efed6
 
3efed6
-  file = grub_file_open (theme_path);
3efed6
+  file = grub_file_open (theme_path, GRUB_FILE_TYPE_THEME);
3efed6
   if (! file)
3efed6
     {
3efed6
       grub_free (p.theme_dir);
3efed6
diff --git a/grub-core/io/bufio.c b/grub-core/io/bufio.c
3efed6
index 2781afe0515..0dbac1b3a1e 100644
3efed6
--- a/grub-core/io/bufio.c
3efed6
+++ b/grub-core/io/bufio.c
3efed6
@@ -88,11 +88,11 @@ grub_bufio_open (grub_file_t io, grub_size_t size)
3efed6
 }
3efed6
 
3efed6
 grub_file_t
3efed6
-grub_buffile_open (const char *name, grub_size_t size)
3efed6
+grub_buffile_open (const char *name, enum grub_file_type type, grub_size_t size)
3efed6
 {
3efed6
   grub_file_t io, file;
3efed6
 
3efed6
-  io = grub_file_open (name);
3efed6
+  io = grub_file_open (name, type);
3efed6
   if (! io)
3efed6
     return 0;
3efed6
 
3efed6
diff --git a/grub-core/io/gzio.c b/grub-core/io/gzio.c
3efed6
index 7024cda84ea..2ecf076dd5e 100644
3efed6
--- a/grub-core/io/gzio.c
3efed6
+++ b/grub-core/io/gzio.c
3efed6
@@ -1156,11 +1156,14 @@ initialize_tables (grub_gzio_t gzio)
3efed6
    even if IO does not contain data compressed by gzip, return a valid file
3efed6
    object. Note that this function won't close IO, even if an error occurs.  */
3efed6
 static grub_file_t
3efed6
-grub_gzio_open (grub_file_t io, const char *name __attribute__ ((unused)))
3efed6
+grub_gzio_open (grub_file_t io, enum grub_file_type type)
3efed6
 {
3efed6
   grub_file_t file;
3efed6
   grub_gzio_t gzio = 0;
3efed6
 
3efed6
+  if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
3efed6
+    return io;
3efed6
+
3efed6
   file = (grub_file_t) grub_zalloc (sizeof (*file));
3efed6
   if (! file)
3efed6
     return 0;
3efed6
diff --git a/grub-core/io/lzopio.c b/grub-core/io/lzopio.c
3efed6
index 7559c6c9cab..84edf6dd2dc 100644
3efed6
--- a/grub-core/io/lzopio.c
3efed6
+++ b/grub-core/io/lzopio.c
3efed6
@@ -407,12 +407,14 @@ CORRUPTED:
3efed6
 }
3efed6
 
3efed6
 static grub_file_t
3efed6
-grub_lzopio_open (grub_file_t io,
3efed6
-		  const char *name __attribute__ ((unused)))
3efed6
+grub_lzopio_open (grub_file_t io, enum grub_file_type type)
3efed6
 {
3efed6
   grub_file_t file;
3efed6
   grub_lzopio_t lzopio;
3efed6
 
3efed6
+  if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
3efed6
+    return io;
3efed6
+
3efed6
   file = (grub_file_t) grub_zalloc (sizeof (*file));
3efed6
   if (!file)
3efed6
     return 0;
3efed6
diff --git a/grub-core/io/offset.c b/grub-core/io/offset.c
3efed6
index ebed0ebe63e..ec8e2320871 100644
3efed6
--- a/grub-core/io/offset.c
3efed6
+++ b/grub-core/io/offset.c
3efed6
@@ -69,7 +69,8 @@ grub_file_offset_close (grub_file_t file)
3efed6
 }
3efed6
 
3efed6
 grub_file_t
3efed6
-grub_file_offset_open (grub_file_t parent, grub_off_t start, grub_off_t size)
3efed6
+grub_file_offset_open (grub_file_t parent, enum grub_file_type type,
3efed6
+		       grub_off_t start, grub_off_t size)
3efed6
 {
3efed6
   struct grub_offset_file *off_data;
3efed6
   grub_file_t off_file, last_off_file;
3efed6
@@ -95,10 +96,10 @@ grub_file_offset_open (grub_file_t parent, grub_off_t start, grub_off_t size)
3efed6
   last_off_file = NULL;
3efed6
   for (filter = GRUB_FILE_FILTER_COMPRESSION_FIRST;
3efed6
        off_file && filter <= GRUB_FILE_FILTER_COMPRESSION_LAST; filter++)
3efed6
-    if (grub_file_filters_enabled[filter])
3efed6
+    if (grub_file_filters[filter])
3efed6
       {
3efed6
 	last_off_file = off_file;
3efed6
-	off_file = grub_file_filters_enabled[filter] (off_file, parent->name);
3efed6
+	off_file = grub_file_filters[filter] (off_file, type);
3efed6
       }
3efed6
 
3efed6
   if (!off_file)
3efed6
diff --git a/grub-core/io/xzio.c b/grub-core/io/xzio.c
3efed6
index a3536ad73b1..42afeedcd64 100644
3efed6
--- a/grub-core/io/xzio.c
3efed6
+++ b/grub-core/io/xzio.c
3efed6
@@ -169,12 +169,14 @@ ERROR:
3efed6
 }
3efed6
 
3efed6
 static grub_file_t
3efed6
-grub_xzio_open (grub_file_t io,
3efed6
-		const char *name __attribute__ ((unused)))
3efed6
+grub_xzio_open (grub_file_t io, enum grub_file_type type)
3efed6
 {
3efed6
   grub_file_t file;
3efed6
   grub_xzio_t xzio;
3efed6
 
3efed6
+  if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
3efed6
+    return io;
3efed6
+
3efed6
   file = (grub_file_t) grub_zalloc (sizeof (*file));
3efed6
   if (!file)
3efed6
     return 0;
3efed6
diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
3efed6
index 91105bc4677..d7a7c8f97b0 100644
3efed6
--- a/grub-core/kern/dl.c
3efed6
+++ b/grub-core/kern/dl.c
3efed6
@@ -806,7 +806,7 @@ grub_dl_load_file (const char *filename)
3efed6
 
3efed6
   grub_boot_time ("Loading module %s", filename);
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
3efed6
   if (! file)
3efed6
     return 0;
3efed6
 
3efed6
diff --git a/grub-core/kern/elf.c b/grub-core/kern/elf.c
3efed6
index 4f282c9cf43..9d7149b3892 100644
3efed6
--- a/grub-core/kern/elf.c
3efed6
+++ b/grub-core/kern/elf.c
3efed6
@@ -136,12 +136,12 @@ fail:
3efed6
 }
3efed6
 
3efed6
 grub_elf_t
3efed6
-grub_elf_open (const char *name)
3efed6
+grub_elf_open (const char *name, enum grub_file_type type)
3efed6
 {
3efed6
   grub_file_t file;
3efed6
   grub_elf_t elf;
3efed6
 
3efed6
-  file = grub_file_open (name);
3efed6
+  file = grub_file_open (name, type);
3efed6
   if (! file)
3efed6
     return 0;
3efed6
 
3efed6
diff --git a/grub-core/kern/file.c b/grub-core/kern/file.c
3efed6
index c2d9a550007..2efc31da94f 100644
3efed6
--- a/grub-core/kern/file.c
3efed6
+++ b/grub-core/kern/file.c
3efed6
@@ -28,8 +28,7 @@
3efed6
 
3efed6
 void (*EXPORT_VAR (grub_grubnet_fini)) (void);
3efed6
 
3efed6
-grub_file_filter_t grub_file_filters_all[GRUB_FILE_FILTER_MAX];
3efed6
-grub_file_filter_t grub_file_filters_enabled[GRUB_FILE_FILTER_MAX];
3efed6
+grub_file_filter_t grub_file_filters[GRUB_FILE_FILTER_MAX];
3efed6
 
3efed6
 /* Get the device part of the filename NAME. It is enclosed by parentheses.  */
3efed6
 char *
3efed6
@@ -59,7 +58,7 @@ grub_file_get_device_name (const char *name)
3efed6
 }
3efed6
 
3efed6
 grub_file_t
3efed6
-grub_file_open (const char *name)
3efed6
+grub_file_open (const char *name, enum grub_file_type type)
3efed6
 {
3efed6
   grub_device_t device = 0;
3efed6
   grub_file_t file = 0, last_file = 0;
3efed6
@@ -116,18 +115,20 @@ grub_file_open (const char *name)
3efed6
   file->name = grub_strdup (name);
3efed6
   grub_errno = GRUB_ERR_NONE;
3efed6
 
3efed6
-  for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters_enabled);
3efed6
+  for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters);
3efed6
        filter++)
3efed6
-    if (grub_file_filters_enabled[filter])
3efed6
+    if (grub_file_filters[filter])
3efed6
       {
3efed6
 	last_file = file;
3efed6
-	file = grub_file_filters_enabled[filter] (file, name);
3efed6
+	file = grub_file_filters[filter] (file, type);
3efed6
+	if (file && file != last_file)
3efed6
+	  {
3efed6
+	    file->name = grub_strdup (name);
3efed6
+	    grub_errno = GRUB_ERR_NONE;
3efed6
+	  }
3efed6
       }
3efed6
   if (!file)
3efed6
     grub_file_close (last_file);
3efed6
-    
3efed6
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
3efed6
-	       sizeof (grub_file_filters_enabled));
3efed6
 
3efed6
   grub_dprintf ("file", "Opening `%s' succeeded.\n", name);
3efed6
 
3efed6
@@ -141,9 +142,6 @@ grub_file_open (const char *name)
3efed6
 
3efed6
   grub_free (file);
3efed6
 
3efed6
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
3efed6
-	       sizeof (grub_file_filters_enabled));
3efed6
-
3efed6
   grub_dprintf ("file", "Opening `%s' failed.\n", name);
3efed6
 
3efed6
   return 0;
3efed6
diff --git a/grub-core/lib/syslinux_parse.c b/grub-core/lib/syslinux_parse.c
3efed6
index 21ca040ada7..83e7bdb9161 100644
3efed6
--- a/grub-core/lib/syslinux_parse.c
3efed6
+++ b/grub-core/lib/syslinux_parse.c
3efed6
@@ -696,7 +696,7 @@ syslinux_parse_real (struct syslinux_menu *menu)
3efed6
   char *buf = NULL;
3efed6
   grub_err_t err = GRUB_ERR_NONE;
3efed6
 
3efed6
-  file = grub_file_open (menu->filename);
3efed6
+  file = grub_file_open (menu->filename, GRUB_FILE_TYPE_CONFIG);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
   while ((grub_free (buf), buf = grub_file_getline (file)))
3efed6
diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c
3efed6
index a93edc975cd..29663f71801 100644
3efed6
--- a/grub-core/loader/efi/chainloader.c
3efed6
+++ b/grub-core/loader/efi/chainloader.c
3efed6
@@ -941,7 +941,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
3efed6
       *(--p16) = 0;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/bsd.c b/grub-core/loader/i386/bsd.c
3efed6
index 0f317632a3b..8306b415abd 100644
3efed6
--- a/grub-core/loader/i386/bsd.c
3efed6
+++ b/grub-core/loader/i386/bsd.c
3efed6
@@ -1464,7 +1464,7 @@ grub_bsd_load (int argc, char *argv[])
3efed6
       goto fail;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
3efed6
   if (!file)
3efed6
     goto fail;
3efed6
 
3efed6
@@ -1541,7 +1541,7 @@ grub_cmd_freebsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
3efed6
 	  if (err)
3efed6
 	    return err;
3efed6
 
3efed6
-	  file = grub_file_open (argv[0]);
3efed6
+	  file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
3efed6
 	  if (! file)
3efed6
 	    return grub_errno;
3efed6
 
3efed6
@@ -1700,7 +1700,7 @@ grub_cmd_netbsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
3efed6
 	{
3efed6
 	  grub_file_t file;
3efed6
 
3efed6
-	  file = grub_file_open (argv[0]);
3efed6
+	  file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
3efed6
 	  if (! file)
3efed6
 	    return grub_errno;
3efed6
 
3efed6
@@ -1809,7 +1809,7 @@ grub_cmd_freebsd_loadenv (grub_command_t cmd __attribute__ ((unused)),
3efed6
       goto fail;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_ENV);
3efed6
   if ((!file) || (!file->size))
3efed6
     goto fail;
3efed6
 
3efed6
@@ -1914,7 +1914,7 @@ grub_cmd_freebsd_module (grub_command_t cmd __attribute__ ((unused)),
3efed6
       return 0;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_MODULE);
3efed6
   if ((!file) || (!file->size))
3efed6
     goto fail;
3efed6
 
3efed6
@@ -1965,7 +1965,7 @@ grub_netbsd_module_load (char *filename, grub_uint32_t type)
3efed6
   void *src;
3efed6
   grub_err_t err;
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_NETBSD_MODULE);
3efed6
   if ((!file) || (!file->size))
3efed6
     goto fail;
3efed6
 
3efed6
@@ -2055,7 +2055,7 @@ grub_cmd_freebsd_module_elf (grub_command_t cmd __attribute__ ((unused)),
3efed6
       return 0;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_MODULE_ELF);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
   if (!file->size)
3efed6
@@ -2095,7 +2095,7 @@ grub_cmd_openbsd_ramdisk (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (!openbsd_ramdisk.max_size)
3efed6
     return grub_error (GRUB_ERR_BAD_OS, "your kOpenBSD doesn't support ramdisk");
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_OPENBSD_RAMDISK);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/coreboot/chainloader.c b/grub-core/loader/i386/coreboot/chainloader.c
3efed6
index 2cb78eee090..0a19ebb9c3e 100644
3efed6
--- a/grub-core/loader/i386/coreboot/chainloader.c
3efed6
+++ b/grub-core/loader/i386/coreboot/chainloader.c
3efed6
@@ -439,7 +439,7 @@ grub_cmd_chain (grub_command_t cmd __attribute__ ((unused)),
3efed6
 
3efed6
   grub_loader_unset ();
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_COREBOOT_CHAINLOADER);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
3efed6
index 191f1631e88..aa2cbc4e7eb 100644
3efed6
--- a/grub-core/loader/i386/linux.c
3efed6
+++ b/grub-core/loader/i386/linux.c
3efed6
@@ -709,7 +709,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
3efed6
       goto fail;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/chainloader.c b/grub-core/loader/i386/pc/chainloader.c
3efed6
index ef3a322b78c..976fea73ab5 100644
3efed6
--- a/grub-core/loader/i386/pc/chainloader.c
3efed6
+++ b/grub-core/loader/i386/pc/chainloader.c
3efed6
@@ -172,8 +172,8 @@ grub_chainloader_cmd (const char *filename, grub_chainloader_flags_t flags)
3efed6
 
3efed6
   grub_dl_ref (my_mod);
3efed6
 
3efed6
-  grub_file_filter_disable_compression ();
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_PCCHAINLOADER
3efed6
+			 | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/freedos.c b/grub-core/loader/i386/pc/freedos.c
3efed6
index 478f3c5139d..aac6c9715f6 100644
3efed6
--- a/grub-core/loader/i386/pc/freedos.c
3efed6
+++ b/grub-core/loader/i386/pc/freedos.c
3efed6
@@ -110,7 +110,7 @@ grub_cmd_freedos (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (!rel)
3efed6
     goto fail;
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEDOS);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c
3efed6
index 63736fae950..b5c28c6580e 100644
3efed6
--- a/grub-core/loader/i386/pc/linux.c
3efed6
+++ b/grub-core/loader/i386/pc/linux.c
3efed6
@@ -142,7 +142,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
3efed6
       goto fail;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/ntldr.c b/grub-core/loader/i386/pc/ntldr.c
3efed6
index 1b88f40d871..f0d74145b38 100644
3efed6
--- a/grub-core/loader/i386/pc/ntldr.c
3efed6
+++ b/grub-core/loader/i386/pc/ntldr.c
3efed6
@@ -90,7 +90,7 @@ grub_cmd_ntldr (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (!rel)
3efed6
     goto fail;
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_NTLDR);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/plan9.c b/grub-core/loader/i386/pc/plan9.c
3efed6
index 814a49d5071..0351090daf8 100644
3efed6
--- a/grub-core/loader/i386/pc/plan9.c
3efed6
+++ b/grub-core/loader/i386/pc/plan9.c
3efed6
@@ -413,7 +413,7 @@ grub_cmd_plan9 (grub_extcmd_context_t ctxt, int argc, char *argv[])
3efed6
   if (!rel)
3efed6
     goto fail;
3efed6
 
3efed6
-  fill_ctx.file = grub_file_open (argv[0]);
3efed6
+  fill_ctx.file = grub_file_open (argv[0], GRUB_FILE_TYPE_PLAN9_KERNEL);
3efed6
   if (! fill_ctx.file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/pxechainloader.c b/grub-core/loader/i386/pc/pxechainloader.c
3efed6
index e60c62b1bad..acb061169b9 100644
3efed6
--- a/grub-core/loader/i386/pc/pxechainloader.c
3efed6
+++ b/grub-core/loader/i386/pc/pxechainloader.c
3efed6
@@ -99,7 +99,7 @@ grub_cmd_pxechain (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (!rel)
3efed6
     goto fail;
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_PXECHAINLOADER);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/pc/truecrypt.c b/grub-core/loader/i386/pc/truecrypt.c
3efed6
index 9ea4fde42a5..cbeeec7beae 100644
3efed6
--- a/grub-core/loader/i386/pc/truecrypt.c
3efed6
+++ b/grub-core/loader/i386/pc/truecrypt.c
3efed6
@@ -99,7 +99,7 @@ grub_cmd_truecrypt (grub_command_t cmd __attribute__ ((unused)),
3efed6
 
3efed6
   grub_dl_ref (my_mod);
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_TRUECRYPT);
3efed6
   if (! file)
3efed6
     goto fail;
3efed6
 
3efed6
diff --git a/grub-core/loader/i386/xen.c b/grub-core/loader/i386/xen.c
3efed6
index 85b93347b25..82350d3a178 100644
3efed6
--- a/grub-core/loader/i386/xen.c
3efed6
+++ b/grub-core/loader/i386/xen.c
3efed6
@@ -650,7 +650,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
3efed6
 			      (char *) xen_state.next_start.cmd_line,
3efed6
 			      sizeof (xen_state.next_start.cmd_line) - 1);
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -901,9 +901,8 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
3efed6
 
3efed6
   xen_state.max_addr = ALIGN_UP (xen_state.max_addr, PAGE_SIZE);
3efed6
 
3efed6
-  if (nounzip)
3efed6
-    grub_file_filter_disable_compression ();
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_INITRD |
3efed6
+			 (nounzip ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE));
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
   size = grub_file_size (file);
3efed6
diff --git a/grub-core/loader/i386/xen_file.c b/grub-core/loader/i386/xen_file.c
3efed6
index 77a93e7b228..9af5d66dfcd 100644
3efed6
--- a/grub-core/loader/i386/xen_file.c
3efed6
+++ b/grub-core/loader/i386/xen_file.c
3efed6
@@ -78,7 +78,7 @@ grub_xen_file (grub_file_t file)
3efed6
      Trim it.  */
3efed6
   if (grub_memcmp (magic, XZ_MAGIC, sizeof (XZ_MAGIC) - 1) == 0)
3efed6
     payload_length -= 4;
3efed6
-  off_file = grub_file_offset_open (file, payload_offset,
3efed6
+  off_file = grub_file_offset_open (file, GRUB_FILE_TYPE_LINUX_KERNEL, payload_offset,
3efed6
 				    payload_length);
3efed6
   if (!off_file)
3efed6
     goto fail;
3efed6
diff --git a/grub-core/loader/i386/xnu.c b/grub-core/loader/i386/xnu.c
3efed6
index 44f7ebfa2b6..a7009360732 100644
3efed6
--- a/grub-core/loader/i386/xnu.c
3efed6
+++ b/grub-core/loader/i386/xnu.c
3efed6
@@ -486,7 +486,7 @@ grub_cmd_devprop_load (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (argc != 1)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_XNU_DEVPROP);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
   size = grub_file_size (file);
3efed6
diff --git a/grub-core/loader/linux.c b/grub-core/loader/linux.c
3efed6
index 0953f6d3266..2b2f798e754 100644
3efed6
--- a/grub-core/loader/linux.c
3efed6
+++ b/grub-core/loader/linux.c
3efed6
@@ -183,7 +183,6 @@ grub_initrd_init (int argc, char *argv[],
3efed6
 	  eptr = grub_strchr (ptr, ':');
3efed6
 	  if (eptr)
3efed6
 	    {
3efed6
-	      grub_file_filter_disable_compression ();
3efed6
 	      grub_size_t dir_size, name_len;
3efed6
 
3efed6
 	      initrd_ctx->components[i].newc_name = grub_strndup (ptr, eptr - ptr);
3efed6
@@ -215,8 +214,9 @@ grub_initrd_init (int argc, char *argv[],
3efed6
 	  root = 0;
3efed6
 	  newc = 0;
3efed6
 	}
3efed6
-      grub_file_filter_disable_compression ();
3efed6
-      initrd_ctx->components[i].file = grub_file_open (fname);
3efed6
+      initrd_ctx->components[i].file = grub_file_open (fname,
3efed6
+						       GRUB_FILE_TYPE_LINUX_INITRD
3efed6
+						       | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
       if (!initrd_ctx->components[i].file)
3efed6
 	{
3efed6
 	  grub_initrd_close (initrd_ctx);
3efed6
diff --git a/grub-core/loader/macho.c b/grub-core/loader/macho.c
3efed6
index f61341af515..05710c48e06 100644
3efed6
--- a/grub-core/loader/macho.c
3efed6
+++ b/grub-core/loader/macho.c
3efed6
@@ -188,12 +188,12 @@ fail:
3efed6
 }
3efed6
 
3efed6
 grub_macho_t
3efed6
-grub_macho_open (const char *name, int is_64bit)
3efed6
+grub_macho_open (const char *name, enum grub_file_type type, int is_64bit)
3efed6
 {
3efed6
   grub_file_t file;
3efed6
   grub_macho_t macho;
3efed6
 
3efed6
-  file = grub_file_open (name);
3efed6
+  file = grub_file_open (name, type);
3efed6
   if (! file)
3efed6
     return 0;
3efed6
 
3efed6
diff --git a/grub-core/loader/mips/linux.c b/grub-core/loader/mips/linux.c
3efed6
index 27c1db84a44..10358854458 100644
3efed6
--- a/grub-core/loader/mips/linux.c
3efed6
+++ b/grub-core/loader/mips/linux.c
3efed6
@@ -237,7 +237,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (argc == 0)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  elf = grub_elf_open (argv[0]);
3efed6
+  elf = grub_elf_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
3efed6
   if (! elf)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c
3efed6
index f455e803910..e8963d7cdb3 100644
3efed6
--- a/grub-core/loader/multiboot.c
3efed6
+++ b/grub-core/loader/multiboot.c
3efed6
@@ -323,7 +323,7 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (argc == 0)
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
3efed6
 
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_MULTIBOOT_KERNEL);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -389,10 +389,8 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
3efed6
     return grub_error (GRUB_ERR_BAD_ARGUMENT,
3efed6
 		       N_("you need to load the kernel first"));
3efed6
 
3efed6
-  if (nounzip)
3efed6
-    grub_file_filter_disable_compression ();
3efed6
-
3efed6
-  file = grub_file_open (argv[0]);
3efed6
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_MULTIBOOT_MODULE
3efed6
+			 | (nounzip ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE));
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/loader/xnu.c b/grub-core/loader/xnu.c
3efed6
index 2bf02489bad..9f78abb05f9 100644
3efed6
--- a/grub-core/loader/xnu.c
3efed6
+++ b/grub-core/loader/xnu.c
3efed6
@@ -355,7 +355,7 @@ grub_cmd_xnu_kernel (grub_command_t cmd __attribute__ ((unused)),
3efed6
 
3efed6
   grub_xnu_unload ();
3efed6
 
3efed6
-  macho = grub_macho_open (args[0], 0);
3efed6
+  macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, 0);
3efed6
   if (! macho)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -460,7 +460,7 @@ grub_cmd_xnu_kernel64 (grub_command_t cmd __attribute__ ((unused)),
3efed6
 
3efed6
   grub_xnu_unload ();
3efed6
 
3efed6
-  macho = grub_macho_open (args[0], 1);
3efed6
+  macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, 1);
3efed6
   if (! macho)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -678,7 +678,7 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
3efed6
     macho = 0;
3efed6
 
3efed6
   if (infoplistname)
3efed6
-    infoplist = grub_file_open (infoplistname);
3efed6
+    infoplist = grub_file_open (infoplistname, GRUB_FILE_TYPE_XNU_INFO_PLIST);
3efed6
   else
3efed6
     infoplist = 0;
3efed6
   grub_errno = GRUB_ERR_NONE;
3efed6
@@ -775,7 +775,7 @@ grub_cmd_xnu_mkext (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (! grub_xnu_heap_size)
3efed6
     return grub_error (GRUB_ERR_BAD_OS, N_("you need to load the kernel first"));
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_MKEXT);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -889,7 +889,7 @@ grub_cmd_xnu_ramdisk (grub_command_t cmd __attribute__ ((unused)),
3efed6
   if (! grub_xnu_heap_size)
3efed6
     return grub_error (GRUB_ERR_BAD_OS, N_("you need to load the kernel first"));
3efed6
 
3efed6
-  file = grub_file_open (args[0]);
3efed6
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_RAMDISK);
3efed6
   if (! file)
3efed6
     return grub_errno;
3efed6
 
3efed6
@@ -929,7 +929,7 @@ grub_xnu_check_os_bundle_required (char *plistname,
3efed6
   if (binname)
3efed6
     *binname = 0;
3efed6
 
3efed6
-  file = grub_file_open (plistname);
3efed6
+  file = grub_file_open (plistname, GRUB_FILE_TYPE_XNU_INFO_PLIST);
3efed6
   if (! file)
3efed6
     return 0;
3efed6
 
3efed6
@@ -1214,7 +1214,7 @@ grub_xnu_load_kext_from_dir (char *dirname, const char *osbundlerequired,
3efed6
 		grub_strcpy (binname + grub_strlen (binname), "/");
3efed6
 	      grub_strcpy (binname + grub_strlen (binname), binsuffix);
3efed6
 	      grub_dprintf ("xnu", "%s:%s\n", ctx.plistname, binname);
3efed6
-	      binfile = grub_file_open (binname);
3efed6
+	      binfile = grub_file_open (binname, GRUB_FILE_TYPE_XNU_KEXT);
3efed6
 	      if (! binfile)
3efed6
 		grub_errno = GRUB_ERR_NONE;
3efed6
 
3efed6
@@ -1257,7 +1257,7 @@ grub_cmd_xnu_kext (grub_command_t cmd __attribute__ ((unused)),
3efed6
       /* User explicitly specified plist and binary. */
3efed6
       if (grub_strcmp (args[1], "-") != 0)
3efed6
 	{
3efed6
-	  binfile = grub_file_open (args[1]);
3efed6
+	  binfile = grub_file_open (args[1], GRUB_FILE_TYPE_XNU_KEXT);
3efed6
 	  if (! binfile)
3efed6
 	    return grub_errno;
3efed6
 	}
3efed6
diff --git a/grub-core/loader/xnu_resume.c b/grub-core/loader/xnu_resume.c
3efed6
index 99119558d21..d648ef0cd3a 100644
3efed6
--- a/grub-core/loader/xnu_resume.c
3efed6
+++ b/grub-core/loader/xnu_resume.c
3efed6
@@ -53,8 +53,8 @@ grub_xnu_resume (char *imagename)
3efed6
   grub_addr_t target_image;
3efed6
   grub_err_t err;
3efed6
 
3efed6
-  grub_file_filter_disable_compression ();
3efed6
-  file = grub_file_open (imagename);
3efed6
+  file = grub_file_open (imagename, GRUB_FILE_TYPE_XNU_HIBERNATE_IMAGE
3efed6
+			 | GRUB_FILE_TYPE_NO_DECOMPRESS);
3efed6
   if (! file)
3efed6
     return 0;
3efed6
 
3efed6
diff --git a/grub-core/normal/autofs.c b/grub-core/normal/autofs.c
3efed6
index 721b9c3256d..7a7cf2b0f7e 100644
3efed6
--- a/grub-core/normal/autofs.c
3efed6
+++ b/grub-core/normal/autofs.c
3efed6
@@ -33,12 +33,6 @@ autoload_fs_module (void)
3efed6
 {
3efed6
   grub_named_list_t p;
3efed6
   int ret = 0;
3efed6
-  grub_file_filter_t grub_file_filters_was[GRUB_FILE_FILTER_MAX];
3efed6
-
3efed6
-  grub_memcpy (grub_file_filters_was, grub_file_filters_enabled,
3efed6
-	       sizeof (grub_file_filters_enabled));
3efed6
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
3efed6
-	       sizeof (grub_file_filters_enabled));
3efed6
 
3efed6
   while ((p = fs_module_list) != NULL)
3efed6
     {
3efed6
@@ -56,9 +50,6 @@ autoload_fs_module (void)
3efed6
       grub_free (p);
3efed6
     }
3efed6
 
3efed6
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_was,
3efed6
-	       sizeof (grub_file_filters_enabled));
3efed6
-
3efed6
   return ret;
3efed6
 }
3efed6
 
3efed6
@@ -82,7 +73,7 @@ read_fs_list (const char *prefix)
3efed6
 	  tmp_autoload_hook = grub_fs_autoload_hook;
3efed6
 	  grub_fs_autoload_hook = NULL;
3efed6
 
3efed6
-	  file = grub_file_open (filename);
3efed6
+	  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
3efed6
 	  if (file)
3efed6
 	    {
3efed6
 	      /* Override previous fs.lst.  */
3efed6
diff --git a/grub-core/normal/crypto.c b/grub-core/normal/crypto.c
3efed6
index e6d345f3345..d01e6f271e1 100644
3efed6
--- a/grub-core/normal/crypto.c
3efed6
+++ b/grub-core/normal/crypto.c
3efed6
@@ -94,7 +94,7 @@ read_crypto_list (const char *prefix)
3efed6
       return;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
3efed6
   grub_free (filename);
3efed6
   if (!file)
3efed6
     {
3efed6
diff --git a/grub-core/normal/dyncmd.c b/grub-core/normal/dyncmd.c
3efed6
index 169c126f508..719ebf477f2 100644
3efed6
--- a/grub-core/normal/dyncmd.c
3efed6
+++ b/grub-core/normal/dyncmd.c
3efed6
@@ -106,7 +106,7 @@ read_command_list (const char *prefix)
3efed6
 	{
3efed6
 	  grub_file_t file;
3efed6
 
3efed6
-	  file = grub_file_open (filename);
3efed6
+	  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
3efed6
 	  if (file)
3efed6
 	    {
3efed6
 	      char *buf = NULL;
3efed6
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
3efed6
index 59fd54eb0f1..cee71a4c2ab 100644
3efed6
--- a/grub-core/normal/main.c
3efed6
+++ b/grub-core/normal/main.c
3efed6
@@ -127,7 +127,7 @@ read_config_file (const char *config)
3efed6
     }
3efed6
 
3efed6
   /* Try to open the config file.  */
3efed6
-  rawfile = grub_file_open (config);
3efed6
+  rawfile = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
3efed6
   if (! rawfile)
3efed6
     return 0;
3efed6
 
3efed6
diff --git a/grub-core/normal/term.c b/grub-core/normal/term.c
3efed6
index 93a3a0d912e..cc8c173b6e8 100644
3efed6
--- a/grub-core/normal/term.c
3efed6
+++ b/grub-core/normal/term.c
3efed6
@@ -331,7 +331,7 @@ read_terminal_list (const char *prefix)
3efed6
       return;
3efed6
     }
3efed6
 
3efed6
-  file = grub_file_open (filename);
3efed6
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
3efed6
   grub_free (filename);
3efed6
   if (!file)
3efed6
     {
3efed6
diff --git a/grub-core/video/readers/jpeg.c b/grub-core/video/readers/jpeg.c
3efed6
index 21b0d9ded67..31359a4c9c8 100644
3efed6
--- a/grub-core/video/readers/jpeg.c
3efed6
+++ b/grub-core/video/readers/jpeg.c
3efed6
@@ -772,7 +772,7 @@ grub_video_reader_jpeg (struct grub_video_bitmap **bitmap,
3efed6
   grub_file_t file;
3efed6
   struct grub_jpeg_data *data;
3efed6
 
3efed6
-  file = grub_buffile_open (filename, 0);
3efed6
+  file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/video/readers/png.c b/grub-core/video/readers/png.c
3efed6
index 719e647e44f..0157ff7420b 100644
3efed6
--- a/grub-core/video/readers/png.c
3efed6
+++ b/grub-core/video/readers/png.c
3efed6
@@ -1095,7 +1095,7 @@ grub_video_reader_png (struct grub_video_bitmap **bitmap,
3efed6
   grub_file_t file;
3efed6
   struct grub_png_data *data;
3efed6
 
3efed6
-  file = grub_buffile_open (filename, 0);
3efed6
+  file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
3efed6
   if (!file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/grub-core/video/readers/tga.c b/grub-core/video/readers/tga.c
3efed6
index c7a16fa9cc4..7cb9d1d2a0c 100644
3efed6
--- a/grub-core/video/readers/tga.c
3efed6
+++ b/grub-core/video/readers/tga.c
3efed6
@@ -297,7 +297,7 @@ grub_video_reader_tga (struct grub_video_bitmap **bitmap,
3efed6
 
3efed6
   grub_memset (&data, 0, sizeof (data));
3efed6
 
3efed6
-  data.file = grub_buffile_open (filename, 0);
3efed6
+  data.file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
3efed6
   if (! data.file)
3efed6
     return grub_errno;
3efed6
 
3efed6
diff --git a/util/grub-fstest.c b/util/grub-fstest.c
3efed6
index 793aefa02b1..fe5982220d0 100644
3efed6
--- a/util/grub-fstest.c
3efed6
+++ b/util/grub-fstest.c
3efed6
@@ -120,9 +120,9 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len, void
3efed6
       return;
3efed6
     }
3efed6
 
3efed6
-  if (uncompress == 0)
3efed6
-    grub_file_filter_disable_compression ();
3efed6
-  file = grub_file_open (pathname);
3efed6
+  file = grub_file_open (pathname, ((uncompress == 0)
3efed6
+				    ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE)
3efed6
+			 | GRUB_FILE_TYPE_FSTEST);
3efed6
   if (!file)
3efed6
     {
3efed6
       grub_util_error (_("cannot open `%s': %s"), pathname,
3efed6
diff --git a/util/grub-mount.c b/util/grub-mount.c
3efed6
index a25db8a7181..e32b502e7e4 100644
3efed6
--- a/util/grub-mount.c
3efed6
+++ b/util/grub-mount.c
3efed6
@@ -208,7 +208,7 @@ fuse_getattr (const char *path, struct stat *st)
3efed6
   if (!ctx.file_info.dir)
3efed6
     {
3efed6
       grub_file_t file;
3efed6
-      file = grub_file_open (path);
3efed6
+      file = grub_file_open (path, GRUB_FILE_TYPE_GET_SIZE);
3efed6
       if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE)
3efed6
 	{
3efed6
 	  grub_errno = GRUB_ERR_NONE;
3efed6
@@ -244,7 +244,7 @@ static int
3efed6
 fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused)))
3efed6
 {
3efed6
   grub_file_t file;
3efed6
-  file = grub_file_open (path);
3efed6
+  file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT);
3efed6
   if (! file)
3efed6
     return translate_error ();
3efed6
   files[first_fd++] = file;
3efed6
@@ -308,7 +308,7 @@ fuse_readdir_call_fill (const char *filename,
3efed6
       grub_file_t file;
3efed6
       char *tmp;
3efed6
       tmp = xasprintf ("%s/%s", ctx->path, filename);
3efed6
-      file = grub_file_open (tmp);
3efed6
+      file = grub_file_open (tmp, GRUB_FILE_TYPE_GET_SIZE);
3efed6
       free (tmp);
3efed6
       /* Symlink to directory.  */
3efed6
       if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE)
3efed6
diff --git a/include/grub/bufio.h b/include/grub/bufio.h
3efed6
index 77eb8ee5672..0ff72d1033c 100644
3efed6
--- a/include/grub/bufio.h
3efed6
+++ b/include/grub/bufio.h
3efed6
@@ -23,6 +23,8 @@
3efed6
 #include <grub/file.h>
3efed6
 
3efed6
 grub_file_t EXPORT_FUNC (grub_bufio_open) (grub_file_t io, grub_size_t size);
3efed6
-grub_file_t EXPORT_FUNC (grub_buffile_open) (const char *name, grub_size_t size);
3efed6
+grub_file_t EXPORT_FUNC (grub_buffile_open) (const char *name,
3efed6
+					     enum grub_file_type type,
3efed6
+					     grub_size_t size);
3efed6
 
3efed6
 #endif /* ! GRUB_BUFIO_H */
3efed6
diff --git a/include/grub/elfload.h b/include/grub/elfload.h
3efed6
index 9a7ae4ebb30..dbb609c9b20 100644
3efed6
--- a/include/grub/elfload.h
3efed6
+++ b/include/grub/elfload.h
3efed6
@@ -42,7 +42,7 @@ typedef int (*grub_elf32_phdr_iterate_hook_t)
3efed6
 typedef int (*grub_elf64_phdr_iterate_hook_t)
3efed6
   (grub_elf_t elf, Elf64_Phdr *phdr, void *arg);
3efed6
 
3efed6
-grub_elf_t grub_elf_open (const char *);
3efed6
+grub_elf_t grub_elf_open (const char *, enum grub_file_type type);
3efed6
 grub_elf_t grub_elf_file (grub_file_t file, const char *filename);
3efed6
 grub_err_t grub_elf_close (grub_elf_t);
3efed6
 
3efed6
diff --git a/include/grub/file.h b/include/grub/file.h
3efed6
index 739488cbe59..5b47c5f91f9 100644
3efed6
--- a/include/grub/file.h
3efed6
+++ b/include/grub/file.h
3efed6
@@ -25,6 +25,109 @@
3efed6
 #include <grub/fs.h>
3efed6
 #include <grub/disk.h>
3efed6
 
3efed6
+enum grub_file_type
3efed6
+  {
3efed6
+    GRUB_FILE_TYPE_NONE = 0,
3efed6
+    /* GRUB module to be loaded.  */
3efed6
+    GRUB_FILE_TYPE_GRUB_MODULE,
3efed6
+    /* Loopback file to be represented as disk.  */
3efed6
+    GRUB_FILE_TYPE_LOOPBACK,
3efed6
+    /* Linux kernel to be loaded.  */
3efed6
+    GRUB_FILE_TYPE_LINUX_KERNEL,
3efed6
+    /* Linux initrd.  */
3efed6
+    GRUB_FILE_TYPE_LINUX_INITRD,
3efed6
+
3efed6
+    /* Multiboot kernel.  */
3efed6
+    GRUB_FILE_TYPE_MULTIBOOT_KERNEL,
3efed6
+    /* Multiboot module.  */
3efed6
+    GRUB_FILE_TYPE_MULTIBOOT_MODULE,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_BSD_KERNEL,
3efed6
+    GRUB_FILE_TYPE_FREEBSD_ENV,
3efed6
+    GRUB_FILE_TYPE_FREEBSD_MODULE,
3efed6
+    GRUB_FILE_TYPE_FREEBSD_MODULE_ELF,
3efed6
+    GRUB_FILE_TYPE_NETBSD_MODULE,
3efed6
+    GRUB_FILE_TYPE_OPENBSD_RAMDISK,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_XNU_INFO_PLIST,
3efed6
+    GRUB_FILE_TYPE_XNU_MKEXT,
3efed6
+    GRUB_FILE_TYPE_XNU_KEXT,
3efed6
+    GRUB_FILE_TYPE_XNU_KERNEL,
3efed6
+    GRUB_FILE_TYPE_XNU_RAMDISK,
3efed6
+    GRUB_FILE_TYPE_XNU_HIBERNATE_IMAGE,
3efed6
+    GRUB_FILE_XNU_DEVPROP,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_PLAN9_KERNEL,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_NTLDR,
3efed6
+    GRUB_FILE_TYPE_TRUECRYPT,
3efed6
+    GRUB_FILE_TYPE_FREEDOS,
3efed6
+    GRUB_FILE_TYPE_PXECHAINLOADER,
3efed6
+    GRUB_FILE_TYPE_PCCHAINLOADER,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_COREBOOT_CHAINLOADER,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE,
3efed6
+
3efed6
+    /* File holding signature.  */
3efed6
+    GRUB_FILE_TYPE_SIGNATURE,
3efed6
+    /* File holding public key to verify signature once.  */
3efed6
+    GRUB_FILE_TYPE_PUBLIC_KEY,
3efed6
+    /* File holding public key to add to trused keys.  */
3efed6
+    GRUB_FILE_TYPE_PUBLIC_KEY_TRUST,
3efed6
+    /* File of which we intend to print a blocklist to the user.  */
3efed6
+    GRUB_FILE_TYPE_PRINT_BLOCKLIST,
3efed6
+    /* File we intend to use for test loading or testing speed.  */
3efed6
+    GRUB_FILE_TYPE_TESTLOAD,
3efed6
+    /* File we open only to get its size. E.g. in ls output.  */
3efed6
+    GRUB_FILE_TYPE_GET_SIZE,
3efed6
+    /* Font file.  */
3efed6
+    GRUB_FILE_TYPE_FONT,
3efed6
+    /* File holding encryption key for encrypted ZFS.  */
3efed6
+    GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY,
3efed6
+    /* File we open n grub-fstest.  */
3efed6
+    GRUB_FILE_TYPE_FSTEST,
3efed6
+    /* File we open n grub-mount.  */
3efed6
+    GRUB_FILE_TYPE_MOUNT,
3efed6
+    /* File which we attempt to identify the type of.  */
3efed6
+    GRUB_FILE_TYPE_FILE_ID,
3efed6
+    /* File holding ACPI table.  */
3efed6
+    GRUB_FILE_TYPE_ACPI_TABLE,
3efed6
+    /* File we intend show to user.  */
3efed6
+    GRUB_FILE_TYPE_CAT,
3efed6
+    GRUB_FILE_TYPE_HEXCAT,
3efed6
+    /* One of pair of files we intend to compare.  */
3efed6
+    GRUB_FILE_TYPE_CMP,
3efed6
+    /* List of hashes for hashsum.  */
3efed6
+    GRUB_FILE_TYPE_HASHLIST,
3efed6
+    /* File hashed by hashsum.  */
3efed6
+    GRUB_FILE_TYPE_TO_HASH,
3efed6
+    /* Keyboard layout.  */
3efed6
+    GRUB_FILE_TYPE_KEYBOARD_LAYOUT,
3efed6
+    /* Picture file.  */
3efed6
+    GRUB_FILE_TYPE_PIXMAP,
3efed6
+    /* *.lst shipped by GRUB.  */
3efed6
+    GRUB_FILE_TYPE_GRUB_MODULE_LIST,
3efed6
+    /* config file.  */
3efed6
+    GRUB_FILE_TYPE_CONFIG,
3efed6
+    GRUB_FILE_TYPE_THEME,
3efed6
+    GRUB_FILE_TYPE_GETTEXT_CATALOG,
3efed6
+    GRUB_FILE_TYPE_FS_SEARCH,
3efed6
+    GRUB_FILE_TYPE_AUDIO,
3efed6
+    GRUB_FILE_TYPE_VBE_DUMP,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_LOADENV,
3efed6
+    GRUB_FILE_TYPE_SAVEENV,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_VERIFY_SIGNATURE,
3efed6
+
3efed6
+    GRUB_FILE_TYPE_MASK = 0xffff,
3efed6
+
3efed6
+    /* --skip-sig is specified.  */
3efed6
+    GRUB_FILE_TYPE_SKIP_SIGNATURE = 0x10000,
3efed6
+    GRUB_FILE_TYPE_NO_DECOMPRESS = 0x20000
3efed6
+  };
3efed6
+
3efed6
 /* File description.  */
3efed6
 struct grub_file
3efed6
 {
3efed6
@@ -77,61 +180,26 @@ typedef enum grub_file_filter_id
3efed6
     GRUB_FILE_FILTER_COMPRESSION_LAST = GRUB_FILE_FILTER_LZOPIO,
3efed6
   } grub_file_filter_id_t;
3efed6
 
3efed6
-typedef grub_file_t (*grub_file_filter_t) (grub_file_t in, const char *filename);
3efed6
+typedef grub_file_t (*grub_file_filter_t) (grub_file_t in, enum grub_file_type type);
3efed6
 
3efed6
-extern grub_file_filter_t EXPORT_VAR(grub_file_filters_all)[GRUB_FILE_FILTER_MAX];
3efed6
-extern grub_file_filter_t EXPORT_VAR(grub_file_filters_enabled)[GRUB_FILE_FILTER_MAX];
3efed6
+extern grub_file_filter_t EXPORT_VAR(grub_file_filters)[GRUB_FILE_FILTER_MAX];
3efed6
 
3efed6
 static inline void
3efed6
 grub_file_filter_register (grub_file_filter_id_t id, grub_file_filter_t filter)
3efed6
 {
3efed6
-  grub_file_filters_all[id] = filter;
3efed6
-  grub_file_filters_enabled[id] = filter;
3efed6
+  grub_file_filters[id] = filter;
3efed6
 }
3efed6
 
3efed6
 static inline void
3efed6
 grub_file_filter_unregister (grub_file_filter_id_t id)
3efed6
 {
3efed6
-  grub_file_filters_all[id] = 0;
3efed6
-  grub_file_filters_enabled[id] = 0;
3efed6
-}
3efed6
-
3efed6
-static inline void
3efed6
-grub_file_filter_disable (grub_file_filter_id_t id)
3efed6
-{
3efed6
-  grub_file_filters_enabled[id] = 0;
3efed6
-}
3efed6
-
3efed6
-static inline void
3efed6
-grub_file_filter_disable_compression (void)
3efed6
-{
3efed6
-  grub_file_filter_id_t id;
3efed6
-
3efed6
-  for (id = GRUB_FILE_FILTER_COMPRESSION_FIRST;
3efed6
-       id <= GRUB_FILE_FILTER_COMPRESSION_LAST; id++)
3efed6
-    grub_file_filters_enabled[id] = 0;
3efed6
-}
3efed6
-
3efed6
-static inline void
3efed6
-grub_file_filter_disable_all (void)
3efed6
-{
3efed6
-  grub_file_filter_id_t id;
3efed6
-
3efed6
-  for (id = 0;
3efed6
-       id < GRUB_FILE_FILTER_MAX; id++)
3efed6
-    grub_file_filters_enabled[id] = 0;
3efed6
-}
3efed6
-
3efed6
-static inline void
3efed6
-grub_file_filter_disable_pubkey (void)
3efed6
-{
3efed6
-  grub_file_filters_enabled[GRUB_FILE_FILTER_PUBKEY] = 0;
3efed6
+  grub_file_filters[id] = 0;
3efed6
 }
3efed6
 
3efed6
 /* Get a device name from NAME.  */
3efed6
 char *EXPORT_FUNC(grub_file_get_device_name) (const char *name);
3efed6
 
3efed6
-grub_file_t EXPORT_FUNC(grub_file_open) (const char *name);
3efed6
+grub_file_t EXPORT_FUNC(grub_file_open) (const char *name, enum grub_file_type type);
3efed6
 grub_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, void *buf,
3efed6
 					  grub_size_t len);
3efed6
 grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
3efed6
@@ -159,8 +227,8 @@ grub_file_seekable (const grub_file_t file)
3efed6
 }
3efed6
 
3efed6
 grub_file_t
3efed6
-grub_file_offset_open (grub_file_t parent, grub_off_t start,
3efed6
-		       grub_off_t size);
3efed6
+grub_file_offset_open (grub_file_t parent, enum grub_file_type type,
3efed6
+		       grub_off_t start, grub_off_t size);
3efed6
 void
3efed6
 grub_file_offset_close (grub_file_t file);
3efed6
 
3efed6
diff --git a/include/grub/machoload.h b/include/grub/machoload.h
3efed6
index 1eec118f15f..f1157f4105b 100644
3efed6
--- a/include/grub/machoload.h
3efed6
+++ b/include/grub/machoload.h
3efed6
@@ -49,7 +49,8 @@ struct grub_macho_file
3efed6
 };
3efed6
 typedef struct grub_macho_file *grub_macho_t;
3efed6
 
3efed6
-grub_macho_t grub_macho_open (const char *, int is_64bit);
3efed6
+grub_macho_t grub_macho_open (const char *, enum grub_file_type type,
3efed6
+			      int is_64bit);
3efed6
 grub_macho_t grub_macho_file (grub_file_t file, const char *filename,
3efed6
 			      int is_64bit);
3efed6
 grub_err_t grub_macho_close (grub_macho_t);