]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/io/gzio.c (grub_gzio_open): Removed "transparent" parameter.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 5 Sep 2010 11:05:36 +0000 (13:05 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 5 Sep 2010 11:05:36 +0000 (13:05 +0200)
Made static.
(grub_gzfile_open): Removed. All users updated.
(GRUB_MOD_INIT): New function.
(GRUB_MOD_FINI): Likewise.
* grub-core/kern/file.c (grub_file_filters_all): New variable.
(grub_file_filters_enabled): Likewise.
(grub_file_open): Handle filters.
* grub-core/loader/i386/bsd.c (GRUB_MOD_INIT): Load gzio.
* grub-core/normal/main.c (GRUB_MOD_INIT): Likewise.
* include/grub/file.h (grub_file_filter_id_t): New type.
(grub_file_filter_t): Likewise.
(grub_file_filters_all): New extern variable.
(grub_file_filters_enabled): Likewise.
(grub_file_filter_register): New inline function.
(grub_file_filter_unregister): Likewise.
(grub_file_filter_disable): Likewise.
(grub_file_filter_disable_compression): Likewise.
* include/grub/gzio.h: Removed.

35 files changed:
ChangeLog
grub-core/commands/acpi.c
grub-core/commands/blocklist.c
grub-core/commands/cat.c
grub-core/commands/cmp.c
grub-core/commands/crc.c
grub-core/commands/hashsum.c
grub-core/commands/hexdump.c
grub-core/commands/loadenv.c
grub-core/commands/ls.c
grub-core/commands/search.c
grub-core/commands/test.c
grub-core/gettext/gettext.c
grub-core/io/gzio.c
grub-core/kern/elf.c
grub-core/kern/file.c
grub-core/loader/i386/bsd.c
grub-core/loader/i386/linux.c
grub-core/loader/i386/pc/chainloader.c
grub-core/loader/i386/pc/linux.c
grub-core/loader/i386/xnu.c
grub-core/loader/macho.c
grub-core/loader/mips/linux.c
grub-core/loader/multiboot.c
grub-core/loader/powerpc/ieee1275/linux.c
grub-core/loader/sparc64/ieee1275/linux.c
grub-core/loader/xnu.c
grub-core/loader/xnu_resume.c
grub-core/normal/main.c
include/grub/file.h
include/grub/gzio.h [deleted file]
util/grub-fstest.c
util/grub-probe.c
util/i386/pc/grub-setup.c
util/sparc64/ieee1275/grub-setup.c

index 77f9232db24653b3e3def39fe243e7f2894df59b..33de07ea1e2c47c8e6b521e52ee4f08fee8706cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2010-09-05  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/io/gzio.c (grub_gzio_open): Removed "transparent" parameter.
+       Made static.
+       (grub_gzfile_open): Removed. All users updated.
+       (GRUB_MOD_INIT): New function.
+       (GRUB_MOD_FINI): Likewise.
+       * grub-core/kern/file.c (grub_file_filters_all): New variable.
+       (grub_file_filters_enabled): Likewise.
+       (grub_file_open): Handle filters.
+       * grub-core/loader/i386/bsd.c (GRUB_MOD_INIT): Load gzio.
+       * grub-core/normal/main.c (GRUB_MOD_INIT): Likewise.
+       * include/grub/file.h (grub_file_filter_id_t): New type.
+       (grub_file_filter_t): Likewise.
+       (grub_file_filters_all): New extern variable.
+       (grub_file_filters_enabled): Likewise.
+       (grub_file_filter_register): New inline function.
+       (grub_file_filter_unregister): Likewise.
+       (grub_file_filter_disable): Likewise.
+       (grub_file_filter_disable_compression): Likewise.
+       * include/grub/gzio.h: Removed.
+
 2010-09-04  BVK Chaitanya  <bvk.groups@gmail.com>
 
        Filename expansion support for wildcards in GRUB script.
index 1f17b63d62d1d98955ec77250c1408cc969acddc..b2edcc9cdb623f85268c62103b92a4dab456e1e8 100644 (file)
@@ -23,7 +23,6 @@
 #include <grub/disk.h>
 #include <grub/term.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 #include <grub/acpi.h>
 #include <grub/mm.h>
 #include <grub/machine/memory.h>
@@ -628,7 +627,7 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
       grub_size_t size;
       char *buf;
 
-      file = grub_gzfile_open (args[i], 1);
+      file = grub_file_open (args[i]);
       if (! file)
        {
          free_tables ();
index cace31113ee1505e532adfd14a81f7e1b3a094d0..4651fb32ae56a321933c623c8d620b486822f355 100644 (file)
@@ -82,6 +82,7 @@ grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)),
   if (argc < 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no file specified");
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (args[0]);
   if (! file)
     return grub_errno;
index a70118517af759741b54781c876aefb24d2528f7..68ca83c5dd50a781447fe8282ca230a3431afa4b 100644 (file)
@@ -22,7 +22,6 @@
 #include <grub/disk.h>
 #include <grub/term.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 #include <grub/extcmd.h>
 #include <grub/i18n.h>
 
@@ -48,7 +47,7 @@ grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
 
-  file = grub_gzfile_open (args[0], 1);
+  file = grub_file_open (args[0]);
   if (! file)
     return grub_errno;
 
index 626e1d022e8e186e2c2d2258b679f5e7554f79b4..d9e76a4d72407dd91c7ed6274a976daa1c5459fa 100644 (file)
@@ -21,7 +21,6 @@
 #include <grub/misc.h>
 #include <grub/file.h>
 #include <grub/mm.h>
-#include <grub/gzio.h>
 #include <grub/command.h>
 #include <grub/i18n.h>
 
@@ -44,8 +43,8 @@ grub_cmd_cmp (grub_command_t cmd __attribute__ ((unused)),
   grub_printf ("Compare file `%s' with `%s':\n", args[0],
               args[1]);
 
-  file1 = grub_gzfile_open (args[0], 1);
-  file2 = grub_gzfile_open (args[1], 1);
+  file1 = grub_file_open (args[0]);
+  file2 = grub_file_open (args[1]);
   if (! file1 || ! file2)
     goto cleanup;
 
index 1c1a690aab85febbb4c1ec739715242ea7592183..f165e1aaf82f487ec9185dd9dcc2a4ad06bba6f0 100644 (file)
@@ -38,6 +38,7 @@ grub_cmd_crc (grub_command_t cmd __attribute__ ((unused)),
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (args[0]);
   if (! file)
     return 0;
index df85015a6178902f7d2fcb5cce1f0a13a67c9834..54f487cc7ffa84339fe2c12ff7152f462a562755 100644 (file)
@@ -115,11 +115,15 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
          filename = grub_xasprintf ("%s/%s", prefix, p);
          if (!filename)
            return grub_errno;
+         grub_file_filter_disable_compression ();
          file = grub_file_open (filename);
          grub_free (filename);
        }
       else
-       file = grub_file_open (p);
+       {
+         grub_file_filter_disable_compression ();
+         file = grub_file_open (p);
+       }
       if (!file)
        {
          grub_file_close (hashlist);
@@ -206,6 +210,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
       grub_file_t file;
       grub_err_t err;
       unsigned j;
+      grub_file_filter_disable_compression ();
       file = grub_file_open (args[i]);
       if (!file)
        {
index 6c518f649b1db8ec6e8b4274928d8c6fb12ce52c..08a94eb64b702050584b8000373bca27196f2817 100644 (file)
@@ -21,7 +21,6 @@
 #include <grub/file.h>
 #include <grub/disk.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 #include <grub/lib/hexdump.h>
 #include <grub/extcmd.h>
 #include <grub/i18n.h>
@@ -89,7 +88,7 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args)
     {
       grub_file_t file;
 
-      file = grub_gzfile_open (args[0], 1);
+      file = grub_file_open (args[0]);
       if (! file)
        return 0;
 
index 381810a9234c61defd0cb4b87e63fa3d263965c6..9a1873ba9c1745f98a48d575ef65c20362c9b005 100644 (file)
@@ -56,6 +56,7 @@ open_envblk_file (char *filename)
           grub_strcpy (filename, prefix);
           filename[len] = '/';
           grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
+         grub_file_filter_disable_compression ();
           file = grub_file_open (filename);
           grub_free (filename);
           return file;
@@ -67,6 +68,7 @@ open_envblk_file (char *filename)
         }
     }
 
+  grub_file_filter_disable_compression ();
   return grub_file_open (filename);
 }
 
index b91ef2942e8c13bd904b0fc61162c2fdb32cc9cd..02915bac45536824fe6bbfb0ba5637f5c20d80d6 100644 (file)
@@ -105,6 +105,7 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
 
          /* XXX: For ext2fs symlinks are detected as files while they
             should be reported as directories.  */
+         grub_file_filter_disable_compression ();
          file = grub_file_open (pathname);
          if (! file)
            {
@@ -211,6 +212,7 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
          struct grub_dirhook_info info;
          grub_errno = 0;
 
+         grub_file_filter_disable_compression ();
          file = grub_file_open (dirname);
          if (! file)
            goto fail;
index 71267b1175d12173b8db7ce76e629ec71b6f0d99..8a646b452f34abbda3bd9bf1be852675682737f8 100644 (file)
@@ -54,6 +54,7 @@ FUNC_NAME (const char *key, const char *var, int no_floppy)
        if (! buf)
          return 1;
 
+       grub_file_filter_disable_compression ();
        file = grub_file_open (buf);
        if (file)
          {
index 6995165cf47f3590bd34dd5b650b8b8d5469ca04..97b7fe6e4fef66928ff032003084da32feb0055a 100644 (file)
@@ -334,6 +334,7 @@ test_parse (char **args, int *argn, int argc)
          if (grub_strcmp (args[*argn], "-s") == 0)
            {
              grub_file_t file;
+             grub_file_filter_disable_compression ();
              file = grub_file_open (args[*argn + 1]);
              update_val (file && (grub_file_size (file) != 0));
              if (file)
index bc7d428249a3a06df8b4c0bbcc9c32eab1ab2349..2f94ac030fa1a04c3664c2423e4ef77927e5b992 100644 (file)
@@ -26,7 +26,6 @@
 #include <grub/normal.h>
 #include <grub/file.h>
 #include <grub/kernel.h>
-#include <grub/gzio.h>
 #include <grub/i18n.h>
 
 /*
@@ -219,7 +218,7 @@ grub_gettext_translate (const char *orig)
   return ret;
 }
 
-/* This is similar to grub_gzfile_open. */
+/* This is similar to grub_file_open. */
 static grub_file_t
 grub_mofile_open (const char *filename)
 {
@@ -229,7 +228,7 @@ grub_mofile_open (const char *filename)
   /* Using fd_mo and not another variable because
      it's needed for grub_gettext_get_info.  */
 
-  fd_mo = grub_gzfile_open (filename, 1);
+  fd_mo = grub_file_open (filename);
   grub_errno = GRUB_ERR_NONE;
 
   if (!fd_mo)
index 0545e32bde074134e508ee5b0914d1fe8a39858f..96b54790a457d2b43bb45190e0f2bccfd7d05088 100644 (file)
@@ -40,7 +40,7 @@
 #include <grub/misc.h>
 #include <grub/fs.h>
 #include <grub/file.h>
-#include <grub/gzio.h>
+#include <grub/dl.h>
 
 /*
  *  Window Size
@@ -1113,8 +1113,8 @@ initialize_tables (grub_file_t file)
 /* Open a new decompressing object on the top of IO. If TRANSPARENT is true,
    even if IO does not contain data compressed by gzip, return a valid file
    object. Note that this function won't close IO, even if an error occurs.  */
-grub_file_t
-grub_gzio_open (grub_file_t io, int transparent)
+static grub_file_t
+grub_gzio_open (grub_file_t io)
 {
   grub_file_t file;
   grub_gzio_t gzio = 0;
@@ -1145,33 +1145,11 @@ grub_gzio_open (grub_file_t io, int transparent)
       grub_free (file);
       grub_file_seek (io, 0);
 
-      if (grub_errno == GRUB_ERR_BAD_FILE_TYPE && transparent)
+      if (grub_errno == GRUB_ERR_BAD_FILE_TYPE)
        {
          grub_errno = GRUB_ERR_NONE;
          return io;
        }
-      else
-       return 0;
-    }
-
-  return file;
-}
-
-/* This is similar to grub_gzio_open, but takes a file name as an argument.  */
-grub_file_t
-grub_gzfile_open (const char *name, int transparent)
-{
-  grub_file_t io, file;
-
-  io = grub_file_open (name);
-  if (! io)
-    return 0;
-
-  file = grub_gzio_open (io, transparent);
-  if (! file)
-    {
-      grub_file_close (io);
-      return 0;
     }
 
   return file;
@@ -1252,3 +1230,13 @@ static struct grub_fs grub_gzio_fs =
     .label = 0,
     .next = 0
   };
+
+GRUB_MOD_INIT(gzio)
+{
+  grub_file_filter_register (GRUB_FILE_FILTER_GZIO, grub_gzio_open);
+}
+
+GRUB_MOD_FINI(gzio)
+{
+  grub_file_filter_unregister (GRUB_FILE_FILTER_GZIO);
+}
index 875a855ea2f0c3a7b696e32390188fe988993155..4be408c3131c7d6e679f826e6321a2d346d1d07c 100644 (file)
@@ -21,7 +21,6 @@
 #include <grub/elf.h>
 #include <grub/elfload.h>
 #include <grub/file.h>
-#include <grub/gzio.h>
 #include <grub/misc.h>
 #include <grub/mm.h>
 
@@ -95,7 +94,7 @@ grub_elf_open (const char *name)
   grub_file_t file;
   grub_elf_t elf;
 
-  file = grub_gzfile_open (name, 1);
+  file = grub_file_open (name);
   if (! file)
     return 0;
 
index e17c35f95dbf0dec56926fe9c2df35c780059783..c93fbf737116ee09a795f26ec4c08b9be77f7458 100644 (file)
@@ -24,6 +24,9 @@
 #include <grub/fs.h>
 #include <grub/device.h>
 
+grub_file_filter_t grub_file_filters_all[GRUB_FILE_FILTER_MAX];
+grub_file_filter_t grub_file_filters_enabled[GRUB_FILE_FILTER_MAX];
+
 /* Get the device part of the filename NAME. It is enclosed by parentheses.  */
 char *
 grub_file_get_device_name (const char *name)
@@ -54,14 +57,15 @@ grub_file_get_device_name (const char *name)
 grub_file_t
 grub_file_open (const char *name)
 {
-  grub_device_t device;
-  grub_file_t file = 0;
+  grub_device_t device = 0;
+  grub_file_t file = 0, last_file = 0;
   char *device_name;
   char *file_name;
+  grub_file_filter_id_t filter;
 
   device_name = grub_file_get_device_name (name);
   if (grub_errno)
-    return 0;
+    goto fail;
 
   /* Get the file part of NAME.  */
   file_name = grub_strchr (name, ')');
@@ -94,6 +98,19 @@ grub_file_open (const char *name)
   if ((file->fs->open) (file, file_name) != GRUB_ERR_NONE)
     goto fail;
 
+  for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters_enabled);
+       filter++)
+    if (grub_file_filters_enabled[filter])
+      {
+       last_file = file;
+       file = grub_file_filters_enabled[filter] (file);
+      }
+  if (!file)
+    grub_file_close (last_file);
+    
+  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
+              sizeof (grub_file_filters_enabled));
+
   return file;
 
  fail:
@@ -104,6 +121,9 @@ grub_file_open (const char *name)
 
   grub_free (file);
 
+  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
+              sizeof (grub_file_filters_enabled));
+
   return 0;
 }
 
index 84459b15b4e8cd7445ddbcde26cf77bc9b9aa626..2e92bc42f6a3e2de7b77baf4d99ec4736341ae40 100644 (file)
@@ -28,7 +28,6 @@
 #include <grub/elfload.h>
 #include <grub/env.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 #include <grub/aout.h>
 #include <grub/command.h>
 #include <grub/extcmd.h>
@@ -1326,7 +1325,7 @@ grub_bsd_load (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (!file)
     goto fail;
 
@@ -1396,7 +1395,7 @@ grub_cmd_freebsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
          if (err)
            return err;
 
-         file = grub_gzfile_open (argv[0], 1);
+         file = grub_file_open (argv[0]);
          if (! file)
            return grub_errno;
 
@@ -1526,7 +1525,7 @@ grub_cmd_netbsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
        {
          grub_file_t file;
 
-         file = grub_gzfile_open (argv[0], 1);
+         file = grub_file_open (argv[0]);
          if (! file)
            return grub_errno;
 
@@ -1630,7 +1629,7 @@ grub_cmd_freebsd_loadenv (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if ((!file) || (!file->size))
     goto fail;
 
@@ -1731,7 +1730,7 @@ grub_cmd_freebsd_module (grub_command_t cmd __attribute__ ((unused)),
       return 0;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if ((!file) || (!file->size))
     goto fail;
 
@@ -1782,7 +1781,7 @@ grub_netbsd_module_load (char *filename, grub_uint32_t type)
   void *src;
   grub_err_t err;
 
-  file = grub_gzfile_open (filename, 1);
+  file = grub_file_open (filename);
   if ((!file) || (!file->size))
     goto fail;
 
@@ -1868,7 +1867,7 @@ grub_cmd_freebsd_module_elf (grub_command_t cmd __attribute__ ((unused)),
       return 0;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (!file)
     return grub_errno;
   if (!file->size)
@@ -1904,7 +1903,7 @@ grub_cmd_openbsd_ramdisk (grub_command_t cmd __attribute__ ((unused)),
   if (!openbsd_ramdisk.max_size)
     return grub_error (GRUB_ERR_BAD_OS, "your kOpenBSD doesn't support ramdisk");
 
-  file = grub_gzfile_open (args[0], 1);
+  file = grub_file_open (args[0]);
   if (! file)
     return grub_error (GRUB_ERR_FILE_NOT_FOUND,
                       "couldn't load ramdisk");
@@ -1940,6 +1939,9 @@ static grub_command_t cmd_netbsd_module_elf, cmd_openbsd_ramdisk;
 
 GRUB_MOD_INIT (bsd)
 {
+  /* Net and OpenBSD kernels are often compressed.  */
+  grub_dl_load ("gzio");
+
   cmd_freebsd = grub_register_extcmd ("kfreebsd", grub_cmd_freebsd,
                                      GRUB_COMMAND_FLAG_BOTH,
                                      N_("FILE"), N_("Load kernel of FreeBSD."),
index 9cb26a0c261a22e128451e3c95b93c90d55411c0..cc2d20af3a996adf6baafaf731e1c035d80b2959 100644 (file)
@@ -1069,6 +1069,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (argv[0]);
   if (! file)
     goto fail;
index 502031d0e5b5299331b4109bdac88edbc229c230..e76f84f082daaad0c7a1fd568712de3111f82922 100644 (file)
@@ -69,6 +69,7 @@ grub_chainloader_cmd (const char *filename, grub_chainloader_flags_t flags)
 
   grub_dl_ref (my_mod);
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (filename);
   if (! file)
     goto fail;
index 0719cfb26083743f881789aafbfc6164450eadde..2f5dfec706bc384c170e0c8f7045037e00ad853f 100644 (file)
@@ -401,6 +401,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
 
   addr_min = GRUB_LINUX_BZIMAGE_ADDR + grub_linux16_prot_size;
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (argv[0]);
   if (!file)
     goto fail;
index d35e9e0aac61ce42c475ec861b14583977775490..a9435eff37934b37dfefbfe95f57867301af145b 100644 (file)
@@ -31,7 +31,6 @@
 #include <grub/charset.h>
 #include <grub/term.h>
 #include <grub/command.h>
-#include <grub/gzio.h>
 #include <grub/i18n.h>
 #include <grub/bitmap_scale.h>
 
@@ -535,7 +534,7 @@ grub_cmd_devprop_load (grub_command_t cmd __attribute__ ((unused)),
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
 
-  file = grub_gzfile_open (args[0], 1);
+  file = grub_file_open (args[0]);
   if (! file)
     return grub_error (GRUB_ERR_FILE_NOT_FOUND,
                       "couldn't load device-propertie dump");
index 199d6f11188b1bc22e7bf1e6ad463e772fa703b4..ecf0d8c5358103b1256edad3020b33682c134164 100644 (file)
@@ -26,7 +26,6 @@
 #include <grub/cpu/macho.h>
 #include <grub/machoload.h>
 #include <grub/file.h>
-#include <grub/gzio.h>
 #include <grub/misc.h>
 #include <grub/mm.h>
 
@@ -149,7 +148,7 @@ grub_macho_open (const char *name)
   grub_file_t file;
   grub_macho_t macho;
 
-  file = grub_gzfile_open (name, 1);
+  file = grub_file_open (name);
   if (! file)
     return 0;
 
index 018cfdcc560e0db9709a8ee39b263b89f4c3aac6..48f77dffb998479599611b676dbe6429a3bf192c 100644 (file)
@@ -344,6 +344,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
   if (initrd_loaded)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "only one initrd can be loaded.");
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (argv[0]);
   if (! file)
     return grub_errno;
index 1de1def8614fdfbc0f182c8d28096de0029d5ff5..8780ec061f751effe0bf1af24c47e693ddd7acb4 100644 (file)
@@ -39,7 +39,6 @@
 #include <grub/dl.h>
 #include <grub/mm.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 #include <grub/env.h>
 #include <grub/cpu/relocator.h>
 #include <grub/video.h>
@@ -225,7 +224,7 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)),
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no kernel specified");
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (! file)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "couldn't open file");
 
@@ -291,9 +290,9 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
                       "you need to load the multiboot kernel first");
 
   if (nounzip)
-    file = grub_file_open (argv[0]);
-  else
-    file = grub_gzfile_open (argv[0], 1);
+    grub_file_filter_disable_compression ();
+
+  file = grub_file_open (argv[0]);
   if (! file)
     return grub_errno;
 
index 351d050e5cfa013b1eca0d0b3495d256da0752b6..249238d454ecdbaaf950668953e44aefa20e5601 100644 (file)
@@ -301,6 +301,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (argv[0]);
   if (! file)
     goto fail;
index 948729a5dde177e15d41837ac360340abc031c99..177a6976e3d4635703a8f766b2ee70c0f972c9d9 100644 (file)
@@ -305,7 +305,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
       goto out;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (!file)
     goto out;
 
@@ -393,6 +393,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (argv[0]);
   if (! file)
     goto fail;
index 92532ed3503e9f5f5e0618dbb37cfb8fa01c9a80..ece65611adaa9308bfda63a5f43f2306b62803a4 100644 (file)
@@ -28,7 +28,6 @@
 #include <grub/machoload.h>
 #include <grub/macho.h>
 #include <grub/cpu/macho.h>
-#include <grub/gzio.h>
 #include <grub/command.h>
 #include <grub/misc.h>
 #include <grub/extcmd.h>
@@ -661,7 +660,7 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile)
     macho = 0;
 
   if (infoplistname)
-    infoplist = grub_gzfile_open (infoplistname, 1);
+    infoplist = grub_file_open (infoplistname);
   else
     infoplist = 0;
   grub_errno = GRUB_ERR_NONE;
@@ -756,7 +755,7 @@ grub_cmd_xnu_mkext (grub_command_t cmd __attribute__ ((unused)),
   if (! grub_xnu_heap_size)
     return grub_error (GRUB_ERR_BAD_OS, "no xnu kernel loaded");
 
-  file = grub_gzfile_open (args[0], 1);
+  file = grub_file_open (args[0]);
   if (! file)
     return grub_error (GRUB_ERR_FILE_NOT_FOUND,
                       "couldn't load driver package");
@@ -869,7 +868,7 @@ grub_cmd_xnu_ramdisk (grub_command_t cmd __attribute__ ((unused)),
   if (! grub_xnu_heap_size)
     return grub_error (GRUB_ERR_BAD_OS, "no xnu kernel loaded");
 
-  file = grub_gzfile_open (args[0], 1);
+  file = grub_file_open (args[0]);
   if (! file)
     return grub_error (GRUB_ERR_FILE_NOT_FOUND,
                       "couldn't load ramdisk");
@@ -909,7 +908,7 @@ grub_xnu_check_os_bundle_required (char *plistname, char *osbundlereq,
   if (binname)
     *binname = 0;
 
-  file = grub_gzfile_open (plistname, 1);
+  file = grub_file_open (plistname);
   if (! file)
     {
       grub_file_close (file);
@@ -1166,7 +1165,7 @@ grub_xnu_load_kext_from_dir (char *dirname, char *osbundlerequired,
                grub_strcpy (binname + grub_strlen (binname), "/");
              grub_strcpy (binname + grub_strlen (binname), binsuffix);
              grub_dprintf ("xnu", "%s:%s\n", plistname, binname);
-             binfile = grub_gzfile_open (binname, 1);
+             binfile = grub_file_open (binname);
              if (! binfile)
                grub_errno = GRUB_ERR_NONE;
 
@@ -1204,7 +1203,7 @@ grub_cmd_xnu_kext (grub_command_t cmd __attribute__ ((unused)),
       /* User explicitly specified plist and binary. */
       if (grub_strcmp (args[1], "-") != 0)
        {
-         binfile = grub_gzfile_open (args[1], 1);
+         binfile = grub_file_open (args[1]);
          if (! binfile)
            {
              grub_error (GRUB_ERR_BAD_OS, "can't open file");
index 6aebc1f34b17c983fbf4dc4c9caaa9ec0a6fcf54..8f0e2448399ed09c22442a1a5ae638b12d6b89d5 100644 (file)
@@ -52,6 +52,7 @@ grub_xnu_resume (char *imagename)
   grub_addr_t target_image;
   grub_err_t err;
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (imagename);
   if (! file)
     return 0;
index 6a008f5778affea9e6fc90acd2423b967c12c0e1..c7e83fba02bcae5184f69c71c810d950d117648e 100644 (file)
@@ -474,6 +474,9 @@ static void (*grub_xputs_saved) (const char *str);
 
 GRUB_MOD_INIT(normal)
 {
+  /* Previously many modules depended on gzio. Be nice to user and load it.  */
+  grub_dl_load ("gzio");
+
   grub_context_init ();
   grub_script_init ();
   grub_menu_init ();
index 05c9907d51e0365bbd6b5118eb93938cfdd06759..a9f9552da78b92ca38c82ac379554cb364afef41 100644 (file)
@@ -51,6 +51,50 @@ struct grub_file
 };
 typedef struct grub_file *grub_file_t;
 
+/* Filters with lower ID are executed first.  */
+typedef enum grub_file_filter_id
+  {
+    GRUB_FILE_FILTER_GZIO,
+    GRUB_FILE_FILTER_MAX,
+    GRUB_FILE_FILTER_COMPRESSION_FIRST = GRUB_FILE_FILTER_GZIO,
+    GRUB_FILE_FILTER_COMPRESSION_LAST = GRUB_FILE_FILTER_GZIO,
+  } grub_file_filter_id_t;
+
+typedef grub_file_t (*grub_file_filter_t) (grub_file_t in);
+
+extern grub_file_filter_t EXPORT_VAR(grub_file_filters_all)[GRUB_FILE_FILTER_MAX];
+extern grub_file_filter_t EXPORT_VAR(grub_file_filters_enabled)[GRUB_FILE_FILTER_MAX];
+
+static inline void
+grub_file_filter_register (grub_file_filter_id_t id, grub_file_filter_t filter)
+{
+  grub_file_filters_all[id] = filter;
+  grub_file_filters_enabled[id] = filter;
+};
+
+static inline void
+grub_file_filter_unregister (grub_file_filter_id_t id)
+{
+  grub_file_filters_all[id] = 0;
+  grub_file_filters_enabled[id] = 0;
+};
+
+static inline void
+grub_file_filter_disable (grub_file_filter_id_t id)
+{
+  grub_file_filters_enabled[id] = 0;
+};
+
+static inline void
+grub_file_filter_disable_compression (void)
+{
+  grub_file_filter_id_t id;
+
+  for (id = GRUB_FILE_FILTER_COMPRESSION_FIRST;
+       id <= GRUB_FILE_FILTER_COMPRESSION_LAST; id++)
+    grub_file_filters_enabled[id] = 0;
+};
+
 /* Get a device name from NAME.  */
 char *EXPORT_FUNC(grub_file_get_device_name) (const char *name);
 
diff --git a/include/grub/gzio.h b/include/grub/gzio.h
deleted file mode 100644 (file)
index cd7f397..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* gzio.h - prototypes for gzio */
-/*
- *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2005,2007  Free Software Foundation, Inc.
- *
- *  GRUB is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  GRUB is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef GRUB_GZIO_H
-#define GRUB_GZIO_H    1
-
-#include <grub/file.h>
-
-grub_file_t grub_gzio_open (grub_file_t io, int transparent);
-grub_file_t grub_gzfile_open (const char *name, int transparent);
-
-#endif /* ! GRUB_GZIO_H */
index 48fcbc57f1b1df452a3565ca4b4f7dc656c7bb69..3935ce08b9c4a7b001d2fc9bf5b5a76fd6d57b63 100644 (file)
@@ -107,6 +107,7 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len))
       return;
     }
 
+  grub_file_filter_disable_compression ();
   file = grub_file_open (pathname);
   if (!file)
     {
index ab3e2713e257c93521af1005da6eff31fbc42794..62206bf0e0b8af76c424f1749039e6f27bf069f6 100644 (file)
@@ -245,6 +245,7 @@ probe (const char *path, char *device_name)
              grub_path = xasprintf ("(%s)%s", drive_name, rel_path);
              free (rel_path);
              grub_util_info ("reading %s via GRUB facilities", grub_path);
+             grub_file_filter_disable_compression ();
              file = grub_file_open (grub_path);
              if (! file)
                grub_util_error ("cannot open %s via GRUB facilities", grub_path);
index 9788efe4a4fcc82a82c7d0866ec04031b1fce693..642d9d104f526f52e48ca3231d5b7fad17a08312 100644 (file)
@@ -454,6 +454,7 @@ unable_to_embed:
 
       grub_disk_cache_invalidate_all ();
 
+      grub_file_filter_disable_compression ();
       file = grub_file_open (core_path_dev);
       if (file)
        {
@@ -524,6 +525,7 @@ unable_to_embed:
     }
 
   /* Now read the core image to determine where the sectors are.  */
+  grub_file_filter_disable_compression ();
   file = grub_file_open (core_path_dev);
   if (! file)
     grub_util_error ("%s", grub_errmsg);
index 94734b97753a30a9c519208342bb2c684f3a4d16..d8481295f1f32ab47f3a9d13ea6fb61e3ac80069 100644 (file)
@@ -228,6 +228,7 @@ setup (const char *prefix, const char *dir,
 
       grub_disk_cache_invalidate_all ();
 
+      grub_file_filter_disable_compression ();
       file = grub_file_open (core_path);
       if (file)
        {
@@ -297,6 +298,7 @@ setup (const char *prefix, const char *dir,
     }
 
   /* Now read the core image to determine where the sectors are.  */
+  grub_file_filter_disable_compression ();
   file = grub_file_open (core_path);
   if (! file)
     grub_util_error ("%s", grub_errmsg);