2007-11-19  Bean  <bean123ch@gmail.com>

	* include/grub/file.h (grub_fshook): New structure.
	(grub_fshook_register): New function.
	(grub_fshook_unregister): New function.
	(grub_open_file_raw): New function.

	* kern/file.c (grub_fshook_list): New variable.
	(grub_fshook_register): New function.
	(grub_fshook_unregister): New function.
	(grub_open_file_raw): The original grub_open_file.
	(grub_open_file): New function.

	* io/gzio.c (grub_fshook_open): New function.
	(grub_fshook_gzio): New variable.
	
	* commands/cat.c (grub_cmd_cat): Replace grub_gzfile_open with grub_file_open.

	* commands/cmp.c (grub_cmd_cmp): The same.

	* commands/hexdump.c (grub_cmd_hexdump): The same.

	* kern/elf.c (grub_elf_open): The same.

	* loader/multiboot2.c (grub_multiboot2): The same.
	(grub_module2): The same.

	* loader/multiboot_loader.c (grub_rescue_cmd_multiboot_loader): The same.

	* loader/i386/pc/multiboot.c (grub_multiboot): The same.
	(grub_module): The same.


Index: commands/cat.c
===================================================================
RCS file: /sources/grub/grub2/commands/cat.c,v
retrieving revision 1.6
diff -u -p -r1.6 cat.c
--- commands/cat.c	21 Jul 2007 23:32:19 -0000	1.6
+++ commands/cat.c	19 Nov 2007 09:51:12 -0000
@@ -24,7 +24,6 @@
 #include <grub/disk.h>
 #include <grub/term.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 
 static grub_err_t
 grub_cmd_cat (struct grub_arg_list *state __attribute__ ((unused)),
@@ -38,7 +37,7 @@ grub_cmd_cat (struct grub_arg_list *stat
   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 0;
   
Index: commands/cmp.c
===================================================================
RCS file: /sources/grub/grub2/commands/cmp.c,v
retrieving revision 1.8
diff -u -p -r1.8 cmp.c
--- commands/cmp.c	21 Jul 2007 23:32:19 -0000	1.8
+++ commands/cmp.c	19 Nov 2007 09:51:13 -0000
@@ -23,7 +23,6 @@
 #include <grub/misc.h>
 #include <grub/file.h>
 #include <grub/mm.h>
-#include <grub/gzio.h>
 
 #define BUFFER_SIZE 512
 
@@ -44,8 +43,8 @@ grub_cmd_cmp (struct grub_arg_list *stat
   grub_printf ("Compare `%s' and `%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: commands/hexdump.c
===================================================================
RCS file: /sources/grub/grub2/commands/hexdump.c,v
retrieving revision 1.1
diff -u -p -r1.1 hexdump.c
--- commands/hexdump.c	18 Nov 2007 06:41:45 -0000	1.1
+++ commands/hexdump.c	19 Nov 2007 09:51:13 -0000
@@ -23,7 +23,6 @@
 #include <grub/file.h>
 #include <grub/disk.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 #include <grub/hexdump.h>
 
 static const struct grub_arg_option options[] = {
@@ -100,7 +99,7 @@ grub_cmd_hexdump (struct grub_arg_list *
 
   if (is_file)
     {
-      file = grub_gzfile_open (args[0], 1);
+      file = grub_file_open (args[0]);
       if (!file)
 	return 0;
 
Index: include/grub/file.h
===================================================================
RCS file: /sources/grub/grub2/include/grub/file.h,v
retrieving revision 1.6
diff -u -p -r1.6 file.h
--- include/grub/file.h	2 Aug 2007 18:40:36 -0000	1.6
+++ include/grub/file.h	19 Nov 2007 09:51:13 -0000
@@ -48,9 +48,20 @@ struct grub_file
 };
 typedef struct grub_file *grub_file_t;
 
+struct grub_fshook
+{
+  grub_file_t (*open_func)(grub_file_t file);
+  struct grub_fshook *next;
+};
+typedef struct grub_fshook *grub_fshook_t;
+
+void EXPORT_FUNC(grub_fshook_register) (grub_fshook_t fshook);
+void EXPORT_FUNC(grub_fshook_unregister) (grub_fshook_t fshook);
+
 /* Get a device name from NAME.  */
 char *EXPORT_FUNC(grub_file_get_device_name) (const char *name);
 
+grub_file_t EXPORT_FUNC(grub_file_open_raw) (const char *name);
 grub_file_t EXPORT_FUNC(grub_file_open) (const char *name);
 grub_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, char *buf,
 					  grub_size_t len);
Index: io/gzio.c
===================================================================
RCS file: /sources/grub/grub2/io/gzio.c,v
retrieving revision 1.5
diff -u -p -r1.5 gzio.c
--- io/gzio.c	21 Jul 2007 23:32:25 -0000	1.5
+++ io/gzio.c	19 Nov 2007 09:51:18 -0000
@@ -36,6 +36,7 @@
 
 #include <grub/err.h>
 #include <grub/types.h>
+#include <grub/dl.h>
 #include <grub/mm.h>
 #include <grub/misc.h>
 #include <grub/fs.h>
@@ -1241,3 +1242,25 @@ static struct grub_fs grub_gzio_fs =
     .label = 0,
     .next = 0
   };
+
+static grub_file_t grub_fshook_open(grub_file_t file)
+{
+  return grub_gzio_open (file, 1);
+}
+
+static struct grub_fshook grub_fshook_gzio =
+  {
+    .open_func = grub_fshook_open,
+    .next = 0
+  };
+
+GRUB_MOD_INIT(gzio)
+{
+  (void) mod;			/* To stop warning. */
+  grub_fshook_register(&grub_fshook_gzio);
+}
+
+GRUB_MOD_FINI(gzio)
+{
+  grub_fshook_unregister(&grub_fshook_gzio);
+}
Index: kern/elf.c
===================================================================
RCS file: /sources/grub/grub2/kern/elf.c,v
retrieving revision 1.7
diff -u -p -r1.7 elf.c
--- kern/elf.c	21 Jul 2007 23:32:26 -0000	1.7
+++ kern/elf.c	19 Nov 2007 09:51:19 -0000
@@ -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>
 
@@ -96,7 +95,7 @@ grub_elf_open (const char *name)
 {
   grub_file_t file;
 
-  file = grub_gzfile_open (name, 1);
+  file = grub_file_open (name);
   if (! file)
     return 0;
 
Index: kern/file.c
===================================================================
RCS file: /sources/grub/grub2/kern/file.c,v
retrieving revision 1.7
diff -u -p -r1.7 file.c
--- kern/file.c	21 Jul 2007 23:32:26 -0000	1.7
+++ kern/file.c	19 Nov 2007 09:51:20 -0000
@@ -23,6 +23,30 @@
 #include <grub/mm.h>
 #include <grub/fs.h>
 #include <grub/device.h>
+#include <grub/env.h>
+
+static grub_fshook_t grub_fshook_list;
+
+void
+grub_fshook_register (grub_fshook_t fshook)
+{
+  fshook->next = grub_fshook_list;
+  grub_fshook_list = fshook;
+}
+
+void
+grub_fshook_unregister (grub_fshook_t fshook)
+{
+  grub_fshook_t *p, q;
+
+  for (p = &grub_fshook_list, q = *p; q; p = &(q->next), q = q->next)
+    if (q == fshook)
+      {
+	*p = q->next;
+	break;
+      }
+}
+
 
 /* Get the device part of the filename NAME. It is enclosed by parentheses.  */
 char *
@@ -52,7 +76,7 @@ grub_file_get_device_name (const char *n
 }
 
 grub_file_t
-grub_file_open (const char *name)
+grub_file_open_raw (const char *name)
 {
   grub_device_t device;
   grub_file_t file = 0;
@@ -110,6 +134,34 @@ grub_file_open (const char *name)
   return 0;
 }
 
+grub_file_t
+grub_file_open (const char *name)
+{
+  grub_file_t file;
+  grub_fshook_t p;
+  char *val;
+
+  file=grub_file_open_raw (name);
+
+  if (! file)
+    return file;
+
+  val= grub_env_get ("nofshook");
+  if ((val) && (val[0]=='1'))
+    return file;
+
+  for (p=grub_fshook_list;p;p=p->next)
+    {
+      grub_file_t new_file;
+
+      new_file = (*p->open_func) (file);
+      if (new_file)
+        return new_file;
+    }
+
+  return file;
+}
+
 grub_ssize_t
 grub_file_read (grub_file_t file, char *buf, grub_size_t len)
 {
Index: loader/multiboot2.c
===================================================================
RCS file: /sources/grub/grub2/loader/multiboot2.c,v
retrieving revision 1.1
diff -u -p -r1.1 multiboot2.c
--- loader/multiboot2.c	25 Jul 2007 00:44:02 -0000	1.1
+++ loader/multiboot2.c	19 Nov 2007 09:51:21 -0000
@@ -28,7 +28,6 @@
 #include <grub/dl.h>
 #include <grub/mm.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 
 static grub_addr_t entry;
 extern grub_dl_t my_mod;
@@ -323,7 +322,7 @@ grub_multiboot2 (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (! file)
     {
       grub_error (GRUB_ERR_BAD_ARGUMENT, "Couldn't open file");
@@ -423,7 +422,7 @@ grub_module2 (int argc, char *argv[])
     }
 
   /* Load module data.  */
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (! file)
     goto out;
 
Index: loader/multiboot_loader.c
===================================================================
RCS file: /sources/grub/grub2/loader/multiboot_loader.c,v
retrieving revision 1.1
diff -u -p -r1.1 multiboot_loader.c
--- loader/multiboot_loader.c	25 Jul 2007 00:44:02 -0000	1.1
+++ loader/multiboot_loader.c	19 Nov 2007 09:51:23 -0000
@@ -28,7 +28,6 @@
 #include <grub/dl.h>
 #include <grub/mm.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 
 grub_dl_t my_mod;
 
@@ -85,7 +84,7 @@ grub_rescue_cmd_multiboot_loader (int ar
       goto fail;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (! file)
     {
       grub_error (GRUB_ERR_BAD_ARGUMENT, "Couldn't open file");
Index: loader/i386/pc/multiboot.c
===================================================================
RCS file: /sources/grub/grub2/loader/i386/pc/multiboot.c,v
retrieving revision 1.14
diff -u -p -r1.14 multiboot.c
--- loader/i386/pc/multiboot.c	31 Oct 2007 22:14:50 -0000	1.14
+++ loader/i386/pc/multiboot.c	19 Nov 2007 09:51:25 -0000
@@ -42,7 +42,6 @@
 #include <grub/dl.h>
 #include <grub/mm.h>
 #include <grub/misc.h>
-#include <grub/gzio.h>
 
 extern grub_dl_t my_mod;
 static struct grub_multiboot_info *mbi;
@@ -253,7 +252,7 @@ grub_multiboot (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (! file)
     {
       grub_error (GRUB_ERR_BAD_ARGUMENT, "Couldn't open file");
@@ -362,7 +361,7 @@ grub_module  (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_gzfile_open (argv[0], 1);
+  file = grub_file_open (argv[0]);
   if (! file)
     goto fail;
 
