]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2005-08-22 Yoshinori K. Okuji <okuji@enbug.org>
authorokuji <okuji@localhost>
Mon, 22 Aug 2005 17:28:59 +0000 (17:28 +0000)
committerokuji <okuji@localhost>
Mon, 22 Aug 2005 17:28:59 +0000 (17:28 +0000)
        * gendistlist.sh (EXTRA_DISTFILES): Added genfslist.sh.
        (DISTDIRS): Added io and video.
        Rewrite the search routine to make an output consistently.

        * DISTLIST: Added conf/sparc64-ieee1275.mk,
        conf/sparc64-ieee1275.rmk, include/grub/gzio.h,
        include/grub/ieee1275/ieee1275.h, include/grub/ieee1275/ofdisk.h,
        io/gzio.c, kern/sparc64/cache.c, kern/sparc64/dl.c,
        kern/sparc64/ieee1275/init.c, kern/sparc64/ieee1275/openfw.c and
        util/powerpc/ieee1275/misc.c.

        * include/grub/gzio.h: New file.
        * io/gzio.c: Likewise.

        * kern/file.c (grub_file_close): Call grub_device_close only if
        FILE->DEVICE is not NULL.

        * include/grub/mm.h [!NULL] (NULL): New macro.

        * include/grub/err.h (GRUB_ERR_BAD_GZIP_DATA): New constant.

        * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Added io/gzip.c.
        (pkgdata_MODULES): Added gzio.mod.
        (gzio_mod_SOURCES): New variable.
        (gzio_mod_CFLAGS): Likewise.

        * conf/i386-pc.rmk (grub_emu_SOURCES): Added io/gzip.c.
        (pkgdata_MODULES): Added gzio.mod.
        (gzio_mod_SOURCES): New variable.
        (gzio_mod_CFLAGS): Likewise.

        * commands/cat.c: Include grub/gzio.h.
        (grub_cmd_cat): Use grub_gzfile_open instead of
        grub_file_open.

        * commands/cmp.c: Include grub/gzio.h.
        (grub_cmd_cmp): Use grub_gzfile_open instead of
        grub_file_open.

        * loader/i386/pc/multiboot.c: Include grub/gzio.h.
        (grub_rescue_cmd_multiboot): Use grub_gzfile_open instead of
        grub_file_open.
        (grub_rescue_cmd_module): Likewise.

16 files changed:
ChangeLog
DISTLIST
NEWS
commands/cat.c
commands/cmp.c
conf/i386-pc.mk
conf/i386-pc.rmk
conf/powerpc-ieee1275.mk
conf/powerpc-ieee1275.rmk
gendistlist.sh
include/grub/err.h
include/grub/gzio.h [new file with mode: 0644]
include/grub/mm.h
io/gzio.c [new file with mode: 0644]
kern/file.c
loader/i386/pc/multiboot.c

index 35258010640812e3aacfafaa4f8942ed4c825e4d..0dbbce32e96cc82148adeac835322ebb794edc66 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,49 @@
+2005-08-22  Yoshinori K. Okuji  <okuji@enbug.org>
+
+       * gendistlist.sh (EXTRA_DISTFILES): Added genfslist.sh.
+       (DISTDIRS): Added io and video.
+       Rewrite the search routine to make an output consistently.
+
+       * DISTLIST: Added conf/sparc64-ieee1275.mk,
+       conf/sparc64-ieee1275.rmk, include/grub/gzio.h,
+       include/grub/ieee1275/ieee1275.h, include/grub/ieee1275/ofdisk.h,
+       io/gzio.c, kern/sparc64/cache.c, kern/sparc64/dl.c,
+       kern/sparc64/ieee1275/init.c, kern/sparc64/ieee1275/openfw.c and
+       util/powerpc/ieee1275/misc.c.
+       
+       * include/grub/gzio.h: New file.
+       * io/gzio.c: Likewise.
+       
+       * kern/file.c (grub_file_close): Call grub_device_close only if
+       FILE->DEVICE is not NULL.
+
+       * include/grub/mm.h [!NULL] (NULL): New macro.
+
+       * include/grub/err.h (GRUB_ERR_BAD_GZIP_DATA): New constant.
+
+       * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Added io/gzip.c.
+       (pkgdata_MODULES): Added gzio.mod.
+       (gzio_mod_SOURCES): New variable.
+       (gzio_mod_CFLAGS): Likewise.
+
+       * conf/i386-pc.rmk (grub_emu_SOURCES): Added io/gzip.c.
+       (pkgdata_MODULES): Added gzio.mod.
+       (gzio_mod_SOURCES): New variable.
+       (gzio_mod_CFLAGS): Likewise.
+
+       * commands/cat.c: Include grub/gzio.h.
+       (grub_cmd_cat): Use grub_gzfile_open instead of
+       grub_file_open.
+       
+       * commands/cmp.c: Include grub/gzio.h.
+       (grub_cmd_cmp): Use grub_gzfile_open instead of
+       grub_file_open.
+
+       * loader/i386/pc/multiboot.c: Include grub/gzio.h.
+       (grub_rescue_cmd_multiboot): Use grub_gzfile_open instead of
+       grub_file_open.
+       (grub_rescue_cmd_module): Likewise.
+
 2005-08-21  Vincent Pelletier  <subdino2004@yahoo.fr>
 
        * conf/sparc64-ieee1275.rmk (grubof_SOURCES): The first file must be
index 732441e59abe6598d1672a02a0df7048a3bc6a15..3a101bf8c07de8d76c562fed1a3d8921eebd2435 100644 (file)
--- a/DISTLIST
+++ b/DISTLIST
@@ -30,13 +30,6 @@ boot/i386/pc/diskboot.S
 boot/i386/pc/pxeboot.S
 boot/powerpc/ieee1275/cmain.c
 boot/powerpc/ieee1275/crt0.S
-commands/i386/pc/halt.c
-commands/i386/pc/reboot.c
-commands/i386/pc/vbeinfo.c
-commands/i386/pc/vbetest.c
-commands/ieee1275/halt.c
-commands/ieee1275/reboot.c
-commands/ieee1275/suspend.c
 commands/boot.c
 commands/cat.c
 commands/cmp.c
@@ -47,13 +40,22 @@ commands/ls.c
 commands/search.c
 commands/terminal.c
 commands/timeout.c
+commands/i386/pc/halt.c
+commands/i386/pc/reboot.c
+commands/i386/pc/vbeinfo.c
+commands/i386/pc/vbetest.c
+commands/ieee1275/halt.c
+commands/ieee1275/reboot.c
+commands/ieee1275/suspend.c
 conf/i386-pc.mk
 conf/i386-pc.rmk
 conf/powerpc-ieee1275.mk
 conf/powerpc-ieee1275.rmk
+conf/sparc64-ieee1275.mk
+conf/sparc64-ieee1275.rmk
+disk/loopback.c
 disk/i386/pc/biosdisk.c
 disk/ieee1275/ofdisk.c
-disk/loopback.c
 font/manager.c
 fs/ext2.c
 fs/fat.c
@@ -64,36 +66,6 @@ fs/jfs.c
 fs/minix.c
 fs/ufs.c
 hello/hello.c
-include/grub/i386/pc/util/biosdisk.h
-include/grub/i386/pc/biosdisk.h
-include/grub/i386/pc/boot.h
-include/grub/i386/pc/chainloader.h
-include/grub/i386/pc/console.h
-include/grub/i386/pc/init.h
-include/grub/i386/pc/kernel.h
-include/grub/i386/pc/linux.h
-include/grub/i386/pc/loader.h
-include/grub/i386/pc/memory.h
-include/grub/i386/pc/multiboot.h
-include/grub/i386/pc/time.h
-include/grub/i386/pc/vbe.h
-include/grub/i386/pc/vga.h
-include/grub/i386/setjmp.h
-include/grub/i386/types.h
-include/grub/powerpc/ieee1275/util/biosdisk.h
-include/grub/powerpc/ieee1275/biosdisk.h
-include/grub/powerpc/ieee1275/console.h
-include/grub/powerpc/ieee1275/ieee1275.h
-include/grub/powerpc/ieee1275/kernel.h
-include/grub/powerpc/ieee1275/loader.h
-include/grub/powerpc/ieee1275/multiboot.h
-include/grub/powerpc/ieee1275/time.h
-include/grub/powerpc/libgcc.h
-include/grub/powerpc/setjmp.h
-include/grub/powerpc/types.h
-include/grub/util/getroot.h
-include/grub/util/misc.h
-include/grub/util/resolve.h
 include/grub/arg.h
 include/grub/boot.h
 include/grub/cache.h
@@ -107,6 +79,7 @@ include/grub/file.h
 include/grub/font.h
 include/grub/fs.h
 include/grub/fshelp.h
+include/grub/gzio.h
 include/grub/kernel.h
 include/grub/loader.h
 include/grub/misc.h
@@ -120,15 +93,45 @@ include/grub/setjmp.h
 include/grub/symbol.h
 include/grub/term.h
 include/grub/types.h
-kern/i386/pc/init.c
-kern/i386/pc/lzo1x.S
-kern/i386/pc/startup.S
-kern/i386/dl.c
-kern/ieee1275/ieee1275.c
-kern/powerpc/ieee1275/init.c
-kern/powerpc/ieee1275/openfw.c
-kern/powerpc/cache.S
-kern/powerpc/dl.c
+include/grub/i386/setjmp.h
+include/grub/i386/types.h
+include/grub/i386/pc/biosdisk.h
+include/grub/i386/pc/boot.h
+include/grub/i386/pc/chainloader.h
+include/grub/i386/pc/console.h
+include/grub/i386/pc/init.h
+include/grub/i386/pc/kernel.h
+include/grub/i386/pc/linux.h
+include/grub/i386/pc/loader.h
+include/grub/i386/pc/memory.h
+include/grub/i386/pc/multiboot.h
+include/grub/i386/pc/time.h
+include/grub/i386/pc/vbe.h
+include/grub/i386/pc/vga.h
+include/grub/i386/pc/util/biosdisk.h
+include/grub/ieee1275/ieee1275.h
+include/grub/ieee1275/ofdisk.h
+include/grub/powerpc/libgcc.h
+include/grub/powerpc/setjmp.h
+include/grub/powerpc/types.h
+include/grub/powerpc/ieee1275/biosdisk.h
+include/grub/powerpc/ieee1275/console.h
+include/grub/powerpc/ieee1275/ieee1275.h
+include/grub/powerpc/ieee1275/kernel.h
+include/grub/powerpc/ieee1275/loader.h
+include/grub/powerpc/ieee1275/multiboot.h
+include/grub/powerpc/ieee1275/time.h
+include/grub/powerpc/ieee1275/util/biosdisk.h
+include/grub/sparc64/setjmp.h
+include/grub/sparc64/types.h
+include/grub/sparc64/ieee1275/console.h
+include/grub/sparc64/ieee1275/ieee1275.h
+include/grub/sparc64/ieee1275/kernel.h
+include/grub/sparc64/ieee1275/time.h
+include/grub/util/getroot.h
+include/grub/util/misc.h
+include/grub/util/resolve.h
+io/gzio.c
 kern/device.c
 kern/disk.c
 kern/dl.c
@@ -143,6 +146,19 @@ kern/mm.c
 kern/partition.c
 kern/rescue.c
 kern/term.c
+kern/i386/dl.c
+kern/i386/pc/init.c
+kern/i386/pc/lzo1x.S
+kern/i386/pc/startup.S
+kern/ieee1275/ieee1275.c
+kern/powerpc/cache.S
+kern/powerpc/dl.c
+kern/powerpc/ieee1275/init.c
+kern/powerpc/ieee1275/openfw.c
+kern/sparc64/cache.c
+kern/sparc64/dl.c
+kern/sparc64/ieee1275/init.c
+kern/sparc64/ieee1275/openfw.c
 loader/i386/pc/chainloader.c
 loader/i386/pc/chainloader_normal.c
 loader/i386/pc/linux.c
@@ -151,8 +167,6 @@ loader/i386/pc/multiboot.c
 loader/i386/pc/multiboot_normal.c
 loader/powerpc/ieee1275/linux.c
 loader/powerpc/ieee1275/linux_normal.c
-normal/i386/setjmp.S
-normal/powerpc/setjmp.S
 normal/arg.c
 normal/cmdline.c
 normal/command.c
@@ -162,6 +176,8 @@ normal/main.c
 normal/menu.c
 normal/menu_entry.c
 normal/misc.c
+normal/i386/setjmp.S
+normal/powerpc/setjmp.S
 partmap/amiga.c
 partmap/apple.c
 partmap/pc.c
@@ -170,6 +186,12 @@ term/i386/pc/console.c
 term/i386/pc/vesafb.c
 term/i386/pc/vga.c
 term/ieee1275/ofconsole.c
+util/console.c
+util/genmoddep.c
+util/grub-emu.c
+util/misc.c
+util/resolve.c
+util/unifont2pff.rb
 util/i386/pc/biosdisk.c
 util/i386/pc/getroot.c
 util/i386/pc/grub-install.in
@@ -179,10 +201,5 @@ util/i386/pc/grub-probefs.c
 util/i386/pc/grub-setup.c
 util/i386/pc/misc.c
 util/powerpc/ieee1275/grub-mkimage.c
-util/console.c
-util/genmoddep.c
-util/grub-emu.c
-util/misc.c
-util/resolve.c
-util/unifont2pff.rb
+util/powerpc/ieee1275/misc.c
 video/i386/pc/vbe.c
diff --git a/NEWS b/NEWS
index eefddbccaf0b2c59d7d9672f44d8507298797962..061f85767559d8ce9d31100d9bf99a63a2600d37 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ New in 1.91:
 
 * The option BOOT_IMAGE is passed to Linux.
 
+* Add support for automatic decompression for gzip.
+
 
 New in 1.90 - 2005-08-07:
 
index ca945a9a1ebac65e282da73c507eaeebed62af0d..0c3a2dda34936ae5f82be0b2c6c87388e4f6c53c 100644 (file)
@@ -25,6 +25,7 @@
 #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 +39,7 @@ grub_cmd_cat (struct grub_arg_list *state __attribute__ ((unused)),
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
 
-  file = grub_file_open (args[0]);
+  file = grub_gzfile_open (args[0], 1);
   if (! file)
     return 0;
   
index cf5bd7e09d9d542e50de22da165a21ce48961239..05b5582bbc25e3754ffb07860947661c5e485a2e 100644 (file)
@@ -24,6 +24,7 @@
 #include <grub/misc.h>
 #include <grub/file.h>
 #include <grub/mm.h>
+#include <grub/gzio.h>
 
 #define BUFFER_SIZE 512
 
@@ -45,8 +46,8 @@ grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
   grub_printf ("Compare `%s' and `%s':\n", args[0],
               args[1]);
 
-  if (! (file1 = grub_file_open (args[0]) ) ||
-      ! (file2 = grub_file_open (args[1]) ) )
+  if (! (file1 = grub_gzfile_open (args[0], 1) ) ||
+      ! (file2 = grub_gzfile_open (args[1], 1) ) )
     goto cleanup;
 
   if (grub_file_size (file1) != grub_file_size (file2))
index 9e0f00dfe2ff20b7a80fa60798822bc8a0db6f00..9b899da5e894b04c18e5358abf340126d807f8b4 100644 (file)
@@ -680,6 +680,7 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c    \
        disk/loopback.c                                                 \
        fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c fs/jfs.c   \
        fs/minix.c fs/ufs.c                                             \
+       io/gzio.c                                                       \
        kern/device.c kern/disk.c kern/dl.c kern/env.c kern/err.c       \
        kern/file.c kern/fs.c kern/loader.c kern/main.c kern/misc.c     \
        kern/partition.c kern/rescue.c kern/term.c                      \
@@ -690,10 +691,10 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c  \
        util/console.c util/grub-emu.c util/misc.c                      \
        util/i386/pc/biosdisk.c util/i386/pc/getroot.c                  \
        util/i386/pc/misc.c
-CLEANFILES += grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_search.o grub_emu-commands_timeout.o grub_emu-commands_i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_pc_misc.o
-MOSTLYCLEANFILES += grub_emu-commands_boot.d grub_emu-commands_cat.d grub_emu-commands_cmp.d grub_emu-commands_configfile.d grub_emu-commands_default.d grub_emu-commands_help.d grub_emu-commands_terminal.d grub_emu-commands_ls.d grub_emu-commands_search.d grub_emu-commands_timeout.d grub_emu-commands_i386_pc_halt.d grub_emu-commands_i386_pc_reboot.d grub_emu-disk_loopback.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.d grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_minix.d grub_emu-fs_ufs.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_emu-kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_completion.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_menu_entry.d grub_emu-normal_misc.d grub_emu-partmap_amiga.d grub_emu-partmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_i386_pc_misc.d
+CLEANFILES += grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_search.o grub_emu-commands_timeout.o grub_emu-commands_i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-io_gzio.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_pc_misc.o
+MOSTLYCLEANFILES += grub_emu-commands_boot.d grub_emu-commands_cat.d grub_emu-commands_cmp.d grub_emu-commands_configfile.d grub_emu-commands_default.d grub_emu-commands_help.d grub_emu-commands_terminal.d grub_emu-commands_ls.d grub_emu-commands_search.d grub_emu-commands_timeout.d grub_emu-commands_i386_pc_halt.d grub_emu-commands_i386_pc_reboot.d grub_emu-disk_loopback.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.d grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_minix.d grub_emu-fs_ufs.d grub_emu-io_gzio.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_emu-kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_completion.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_menu_entry.d grub_emu-normal_misc.d grub_emu-partmap_amiga.d grub_emu-partmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_i386_pc_misc.d
 
-grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_search.o grub_emu-commands_timeout.o grub_emu-commands_i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_pc_misc.o
+grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_search.o grub_emu-commands_timeout.o grub_emu-commands_i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-io_gzio.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_pc_misc.o
        $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS)
 
 grub_emu-commands_boot.o: commands/boot.c
@@ -864,6 +865,14 @@ grub_emu-fs_ufs.d: fs/ufs.c
 
 -include grub_emu-fs_ufs.d
 
+grub_emu-io_gzio.o: io/gzio.c
+       $(BUILD_CC) -Iio -I$(srcdir)/io $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
+
+grub_emu-io_gzio.d: io/gzio.c
+       set -e;           $(BUILD_CC) -Iio -I$(srcdir)/io $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $<        | sed 's,gzio\.o[ :]*,grub_emu-io_gzio.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include grub_emu-io_gzio.d
+
 grub_emu-kern_device.o: kern/device.c
        $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
 
@@ -1159,7 +1168,7 @@ pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod \
        terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod       \
        apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod       \
        help.mod default.mod timeout.mod configfile.mod vbe.mod         \
-       vesafb.mod vbetest.mod vbeinfo.mod search.mod
+       vesafb.mod vbetest.mod vbeinfo.mod search.mod gzio.mod
 
 # For _chain.mod.
 _chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -3239,6 +3248,56 @@ fs-search.lst: commands/search.c genfslist.sh
 
 
 search_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For gzio.mod.
+gzio_mod_SOURCES = io/gzio.c
+CLEANFILES += gzio.mod mod-gzio.o mod-gzio.c pre-gzio.o gzio_mod-io_gzio.o def-gzio.lst und-gzio.lst
+MOSTLYCLEANFILES += gzio_mod-io_gzio.d
+DEFSYMFILES += def-gzio.lst
+UNDSYMFILES += und-gzio.lst
+
+gzio.mod: pre-gzio.o mod-gzio.o
+       -rm -f $@
+       $(LD) -r -d -o $@ $^
+       $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
+
+pre-gzio.o: gzio_mod-io_gzio.o
+       -rm -f $@
+       $(LD) -r -d -o $@ $^
+
+mod-gzio.o: mod-gzio.c
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(gzio_mod_CFLAGS) -c -o $@ $<
+
+mod-gzio.c: moddep.lst genmodsrc.sh
+       sh $(srcdir)/genmodsrc.sh 'gzio' $< > $@ || (rm -f $@; exit 1)
+
+def-gzio.lst: pre-gzio.o
+       $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 gzio/' > $@
+
+und-gzio.lst: pre-gzio.o
+       echo 'gzio' > $@
+       $(NM) -u -P -p $< | cut -f1 -d' ' >> $@
+
+gzio_mod-io_gzio.o: io/gzio.c
+       $(CC) -Iio -I$(srcdir)/io $(CPPFLAGS) $(CFLAGS) $(gzio_mod_CFLAGS) -c -o $@ $<
+
+gzio_mod-io_gzio.d: io/gzio.c
+       set -e;           $(CC) -Iio -I$(srcdir)/io $(CPPFLAGS) $(CFLAGS) $(gzio_mod_CFLAGS) -M $<        | sed 's,gzio\.o[ :]*,gzio_mod-io_gzio.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include gzio_mod-io_gzio.d
+
+CLEANFILES += cmd-gzio.lst fs-gzio.lst
+COMMANDFILES += cmd-gzio.lst
+FSFILES += fs-gzio.lst
+
+cmd-gzio.lst: io/gzio.c gencmdlist.sh
+       set -e;           $(CC) -Iio -I$(srcdir)/io $(CPPFLAGS) $(CFLAGS) $(gzio_mod_CFLAGS) -E $<        | sh $(srcdir)/gencmdlist.sh gzio > $@ || (rm -f $@; exit 1)
+
+fs-gzio.lst: io/gzio.c genfslist.sh
+       set -e;           $(CC) -Iio -I$(srcdir)/io $(CPPFLAGS) $(CFLAGS) $(gzio_mod_CFLAGS) -E $<        | sh $(srcdir)/genfslist.sh gzio > $@ || (rm -f $@; exit 1)
+
+
+gzio_mod_CFLAGS = $(COMMON_CFLAGS)
 CLEANFILES += moddep.lst command.lst fs.lst
 pkgdata_DATA += moddep.lst command.lst fs.lst
 moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep
index 4e7e41493e38b7141893895e9f1ff35fd6f888f6..16d6f5acc73591b220aa06d3a3d3cd27c951daed 100644 (file)
@@ -84,6 +84,7 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c      \
        disk/loopback.c                                                 \
        fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c fs/jfs.c   \
        fs/minix.c fs/ufs.c                                             \
+       io/gzio.c                                                       \
        kern/device.c kern/disk.c kern/dl.c kern/env.c kern/err.c       \
        kern/file.c kern/fs.c kern/loader.c kern/main.c kern/misc.c     \
        kern/partition.c kern/rescue.c kern/term.c                      \
@@ -113,7 +114,7 @@ pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod   \
        terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod       \
        apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod       \
        help.mod default.mod timeout.mod configfile.mod vbe.mod         \
-       vesafb.mod vbetest.mod vbeinfo.mod search.mod
+       vesafb.mod vbetest.mod vbeinfo.mod search.mod gzio.mod
 
 # For _chain.mod.
 _chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -274,3 +275,7 @@ vbetest_mod_CFLAGS = $(COMMON_CFLAGS)
 # For search.mod.
 search_mod_SOURCES = commands/search.c
 search_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For gzio.mod.
+gzio_mod_SOURCES = io/gzio.c
+gzio_mod_CFLAGS = $(COMMON_CFLAGS)
index d128e8d89b72c519d9700d832f65424996a0712b..4c130eefaba69773d33711cbbd84dad51241959f 100644 (file)
@@ -71,6 +71,7 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c      \
        disk/loopback.c                                                 \
        fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c fs/jfs.c   \
        fs/minix.c fs/ufs.c                                             \
+       io/gzio.c                                                       \
        kern/device.c kern/disk.c kern/dl.c kern/env.c kern/err.c       \
        kern/file.c kern/fs.c kern/loader.c kern/main.c kern/misc.c     \
        kern/partition.c kern/rescue.c kern/term.c                      \
@@ -81,10 +82,10 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c    \
        util/console.c util/grub-emu.c util/misc.c                      \
        util/i386/pc/biosdisk.c util/i386/pc/getroot.c                  \
        util/powerpc/ieee1275/misc.c
-CLEANFILES += grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_search.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands_ieee1275_halt.o grub_emu-commands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_powerpc_ieee1275_misc.o
-MOSTLYCLEANFILES += grub_emu-commands_boot.d grub_emu-commands_cat.d grub_emu-commands_cmp.d grub_emu-commands_configfile.d grub_emu-commands_default.d grub_emu-commands_help.d grub_emu-commands_search.d grub_emu-commands_terminal.d grub_emu-commands_ls.d grub_emu-commands_timeout.d grub_emu-commands_ieee1275_halt.d grub_emu-commands_ieee1275_reboot.d grub_emu-disk_loopback.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.d grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_minix.d grub_emu-fs_ufs.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_emu-kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_completion.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_menu_entry.d grub_emu-normal_misc.d grub_emu-partmap_amiga.d grub_emu-partmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_powerpc_ieee1275_misc.d
+CLEANFILES += grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_search.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands_ieee1275_halt.o grub_emu-commands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-io_gzio.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_powerpc_ieee1275_misc.o
+MOSTLYCLEANFILES += grub_emu-commands_boot.d grub_emu-commands_cat.d grub_emu-commands_cmp.d grub_emu-commands_configfile.d grub_emu-commands_default.d grub_emu-commands_help.d grub_emu-commands_search.d grub_emu-commands_terminal.d grub_emu-commands_ls.d grub_emu-commands_timeout.d grub_emu-commands_ieee1275_halt.d grub_emu-commands_ieee1275_reboot.d grub_emu-disk_loopback.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.d grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_minix.d grub_emu-fs_ufs.d grub_emu-io_gzio.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_emu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file.d grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_emu-kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu-kern_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-normal_command.d grub_emu-normal_completion.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-normal_menu.d grub_emu-normal_menu_entry.d grub_emu-normal_misc.d grub_emu-partmap_amiga.d grub_emu-partmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i386_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_powerpc_ieee1275_misc.d
 
-grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_search.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands_ieee1275_halt.o grub_emu-commands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_powerpc_ieee1275_misc.o
+grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_search.o grub_emu-commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands_ieee1275_halt.o grub_emu-commands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_emu-fs_ufs.o grub_emu-io_gzio.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.o grub_emu-normal_completion.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o grub_emu-normal_menu_entry.o grub_emu-normal_misc.o grub_emu-partmap_amiga.o grub_emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_powerpc_ieee1275_misc.o
        $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS)
 
 grub_emu-commands_boot.o: commands/boot.c
@@ -255,6 +256,14 @@ grub_emu-fs_ufs.d: fs/ufs.c
 
 -include grub_emu-fs_ufs.d
 
+grub_emu-io_gzio.o: io/gzio.c
+       $(BUILD_CC) -Iio -I$(srcdir)/io $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
+
+grub_emu-io_gzio.d: io/gzio.c
+       set -e;           $(BUILD_CC) -Iio -I$(srcdir)/io $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -M $<        | sed 's,gzio\.o[ :]*,grub_emu-io_gzio.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include grub_emu-io_gzio.d
+
 grub_emu-kern_device.o: kern/device.c
        $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DGRUB_UTIL=1 $(grub_emu_CFLAGS) -c -o $@ $<
 
@@ -747,7 +756,7 @@ pkgdata_MODULES = _linux.mod linux.mod fat.mod ufs.mod ext2.mod minix.mod \
        hfs.mod jfs.mod normal.mod hello.mod font.mod ls.mod \
        boot.mod cmp.mod cat.mod terminal.mod fshelp.mod amiga.mod apple.mod \
        pc.mod suspend.mod loopback.mod help.mod reboot.mod halt.mod sun.mod \
-       default.mod timeout.mod configfile.mod search.mod
+       default.mod timeout.mod configfile.mod search.mod io.mod
 
 # For fshelp.mod.
 fshelp_mod_SOURCES = fs/fshelp.c
@@ -2427,6 +2436,10 @@ fs-search.lst: commands/search.c genfslist.sh
 
 
 search_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For gzio.mod.
+gzio_mod_SOURCES = io/gzio.c
+gzio_mod_CFLAGS = $(COMMON_CFLAGS)
 CLEANFILES += moddep.lst command.lst fs.lst
 pkgdata_DATA += moddep.lst command.lst fs.lst
 moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep
index 9b9026a1e462da173ca3c6681c29366f3d3f0ed8..c155d633456ebc10f262959183d0f9455bd9f704 100644 (file)
@@ -41,6 +41,7 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c      \
        disk/loopback.c                                                 \
        fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c fs/jfs.c   \
        fs/minix.c fs/ufs.c                                             \
+       io/gzio.c                                                       \
        kern/device.c kern/disk.c kern/dl.c kern/env.c kern/err.c       \
        kern/file.c kern/fs.c kern/loader.c kern/main.c kern/misc.c     \
        kern/partition.c kern/rescue.c kern/term.c                      \
@@ -75,7 +76,7 @@ pkgdata_MODULES = _linux.mod linux.mod fat.mod ufs.mod ext2.mod minix.mod \
        hfs.mod jfs.mod normal.mod hello.mod font.mod ls.mod \
        boot.mod cmp.mod cat.mod terminal.mod fshelp.mod amiga.mod apple.mod \
        pc.mod suspend.mod loopback.mod help.mod reboot.mod halt.mod sun.mod \
-       default.mod timeout.mod configfile.mod search.mod
+       default.mod timeout.mod configfile.mod search.mod io.mod
 
 # For fshelp.mod.
 fshelp_mod_SOURCES = fs/fshelp.c
@@ -204,3 +205,7 @@ configfile_mod_CFLAGS = $(COMMON_CFLAGS)
 # For search.mod.
 search_mod_SOURCES = commands/search.c
 search_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For gzio.mod.
+gzio_mod_SOURCES = io/gzio.c
+gzio_mod_CFLAGS = $(COMMON_CFLAGS)
index 4f99beacac15b1389f7ad6852dbbdae9a5bf65d7..f89365a1a12c4dba94ddd4f192749780a3f403fe 100644 (file)
 EXTRA_DISTFILES="AUTHORS COPYING ChangeLog DISTLIST INSTALL NEWS README \
        THANKS TODO Makefile.in aclocal.m4 autogen.sh config.guess \
        config.h.in config.sub configure configure.ac gencmdlist.sh \
-       gendistlist.sh genkernsyms.sh genmk.rb genmodsrc.sh gensymlist.sh \
-       install-sh mkinstalldirs stamp-h.in"
+       gendistlist.sh genfslist.sh genkernsyms.sh genmk.rb \
+       genmodsrc.sh gensymlist.sh install-sh mkinstalldirs stamp-h.in"
 
-DISTDIRS="boot commands conf disk font fs hello include kern loader \
-       normal partmap term util"
+DISTDIRS="boot commands conf disk font fs hello include io kern loader \
+       normal partmap term util video"
 
 for f in $EXTRA_DISTFILES; do
     echo $f
@@ -29,4 +29,10 @@ done
 dir=`dirname $0`
 cd $dir
 
-find $DISTDIRS -name '*.[chS]' -o -name '*.mk' -o -name '*.rmk' -o -name '*.rb'
\ No newline at end of file
+for dir in $DISTDIRS; do
+  for d in `find $dir -type d | sort`; do
+    find $d -maxdepth 1 -name '*.[chS]' -o -name '*.mk' -o -name '*.rmk' \
+      -o -name '*.rb' -o -name '*.in' \
+      | sort
+  done
+done
index 04a96de1141e127321a41964969871ea0a71c2d8..636009033d5774e1790aacd613f7fc48cee381e2 100644 (file)
@@ -49,7 +49,8 @@ typedef enum
     GRUB_ERR_NO_KERNEL,
     GRUB_ERR_BAD_FONT,
     GRUB_ERR_NOT_IMPLEMENTED_YET,
-    GRUB_ERR_SYMLINK_LOOP
+    GRUB_ERR_SYMLINK_LOOP,
+    GRUB_ERR_BAD_GZIP_DATA,
   }
 grub_err_t;
 
diff --git a/include/grub/gzio.h b/include/grub/gzio.h
new file mode 100644 (file)
index 0000000..21058d3
--- /dev/null
@@ -0,0 +1,29 @@
+/* gzio.h - prototypes for gzio */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  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 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
+ */
+
+#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 876d4c201a9a89b546e6632281e8db1aeef63083..e3193d2ff07bda3593cc78ecca9f86b2c22c8596 100644 (file)
 #include <grub/types.h>
 #include <grub/symbol.h>
 
+#ifndef NULL
+# define NULL  ((void *) 0)
+#endif
+
 void grub_mm_init_region (void *addr, grub_size_t size);
 void *EXPORT_FUNC(grub_malloc) (grub_size_t size);
 void EXPORT_FUNC(grub_free) (void *ptr);
@@ -31,7 +35,7 @@ void *EXPORT_FUNC(grub_realloc) (void *ptr, grub_size_t size);
 void *EXPORT_FUNC(grub_memalign) (grub_size_t align, grub_size_t size);
 
 /* For debugging.  */
-#define MM_DEBUG       1
+#define MM_DEBUG       1
 #if MM_DEBUG
 void grub_mm_dump (unsigned lineno);
 #endif
diff --git a/io/gzio.c b/io/gzio.c
new file mode 100644 (file)
index 0000000..28aa521
--- /dev/null
+++ b/io/gzio.c
@@ -0,0 +1,1242 @@
+/* gzio.c - decompression support for gzip */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 1999,2005  Free Software Foundation, Inc.
+ *
+ *  This program 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 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Most of this file was originally the source file "inflate.c", written
+ * by Mark Adler.  It has been very heavily modified.  In particular, the
+ * original would run through the whole file at once, and this version can
+ * be stopped and restarted on any boundary during the decompression process.
+ *
+ * The license and header comments that file are included here.
+ */
+
+/* inflate.c -- Not copyrighted 1992 by Mark Adler
+   version c10p1, 10 January 1993 */
+
+/* You can do whatever you like with this source file, though I would
+   prefer that if you modify it and redistribute it that you include
+   comments to that effect with your name and the date.  Thank you.
+ */
+
+#include <grub/err.h>
+#include <grub/types.h>
+#include <grub/mm.h>
+#include <grub/misc.h>
+#include <grub/fs.h>
+#include <grub/file.h>
+#include <grub/gzio.h>
+
+/*
+ *  Window Size
+ *
+ *  This must be a power of two, and at least 32K for zip's deflate method
+ */
+
+#define WSIZE  0x8000
+
+
+#define INBUFSIZ  0x2000
+
+/* The state stored in filesystem-specific data.  */
+struct grub_gzio
+{
+  /* The underlyding file object.  */
+  grub_file_t file;
+  /* The offset at which the data starts in the underlyding file.  */
+  grub_ssize_t data_offset;
+  /* The type of current block.  */
+  int block_type;
+  /* The length of current block.  */
+  int block_len;
+  /* The flag of the last block.  */
+  int last_block;
+  /* The flag of codes.  */
+  int code_state;
+  /* The length of a copy.  */
+  unsigned inflate_n;
+  /* The index of a copy.  */
+  unsigned inflate_d;
+  /* The input buffer.  */
+  grub_uint8_t inbuf[INBUFSIZ];
+  int inbuf_d;
+  /* The bit buffer.  */
+  unsigned long bb;
+  /* The bits in the bit buffer.  */
+  unsigned bk;
+  /* Ths sliding window in uncompressed data.  */
+  grub_uint8_t slide[WSIZE];
+  /* Current position in the slide.  */
+  unsigned wp;
+  /* The literal/length code table.  */
+  struct huft *tl;
+  /* The distance code table.  */
+  struct huft *td;
+  /* The lookup bits for the literal/length code table. */
+  int bl;
+  /* The lookup bits for the distance code table.  */
+  int bd;
+  /* The original offset value.  */
+  grub_ssize_t saved_offset;
+};
+typedef struct grub_gzio *grub_gzio_t;
+
+/* Declare the filesystem structure for grub_gzio_open.  */
+static struct grub_fs grub_gzio_fs;
+
+/* Function prototypes */
+static void initialize_tables (grub_file_t file);
+
+/* Eat variable-length header fields.  */
+static int
+eat_field (grub_file_t file, int len)
+{
+  char ch = 1;
+  int not_retval = 1;
+
+  do
+    {
+      if (len >= 0)
+       {
+         if (! (len--))
+           break;
+       }
+      else
+       {
+         if (! ch)
+           break;
+       }
+    }
+  while ((not_retval = grub_file_read (file, &ch, 1)) == 1);
+
+  return ! not_retval;
+}
+
+
+/* Little-Endian defines for the 2-byte magic numbers for gzip files.  */
+#define GZIP_MAGIC     grub_le_to_cpu16 (0x8B1F)
+#define OLD_GZIP_MAGIC grub_le_to_cpu16 (0x9E1F)
+
+/* Compression methods (see algorithm.doc) */
+#define STORED      0
+#define COMPRESSED  1
+#define PACKED      2
+#define LZHED       3
+/* methods 4 to 7 reserved */
+#define DEFLATED    8
+#define MAX_METHODS 9
+
+/* gzip flag byte */
+#define ASCII_FLAG   0x01      /* bit 0 set: file probably ascii text */
+#define CONTINUATION 0x02      /* bit 1 set: continuation of multi-part gzip file */
+#define EXTRA_FIELD  0x04      /* bit 2 set: extra field present */
+#define ORIG_NAME    0x08      /* bit 3 set: original file name present */
+#define COMMENT      0x10      /* bit 4 set: file comment present */
+#define ENCRYPTED    0x20      /* bit 5 set: file is encrypted */
+#define RESERVED     0xC0      /* bit 6,7:   reserved */
+
+#define UNSUPPORTED_FLAGS      (CONTINUATION | ENCRYPTED | RESERVED)
+
+/* inflate block codes */
+#define INFLATE_STORED 0
+#define INFLATE_FIXED  1
+#define INFLATE_DYNAMIC        2
+
+typedef unsigned char uch;
+typedef unsigned short ush;
+typedef unsigned long ulg;
+
+static int
+test_header (grub_file_t file)
+{
+  unsigned char buf[10];
+  grub_gzio_t gzio = file->data;
+
+  if (grub_file_tell (gzio->file) != 0)
+    grub_file_seek (gzio->file, 0);
+  
+  /*
+   *  This checks if the file is gzipped.  If a problem occurs here
+   *  (other than a real error with the disk) then we don't think it
+   *  is a compressed file, and simply mark it as such.
+   */
+  if (grub_file_read (gzio->file, buf, 10) != 10
+      || ((*((grub_uint16_t *) buf) != GZIP_MAGIC)
+         && (*((grub_uint16_t *) buf) != OLD_GZIP_MAGIC)))
+    {
+      grub_error (GRUB_ERR_BAD_FILE_TYPE, "no gzip magic found");
+      return 0;
+    }
+
+  /*
+   *  This does consistency checking on the header data.  If a
+   *  problem occurs from here on, then we have corrupt or otherwise
+   *  bad data, and the error should be reported to the user.
+   */
+  if (buf[2] != DEFLATED
+      || (buf[3] & UNSUPPORTED_FLAGS)
+      || ((buf[3] & EXTRA_FIELD)
+         && (grub_file_read (gzio->file, buf, 2) != 2
+             || eat_field (gzio->file,
+                           grub_le_to_cpu16 (*((grub_uint16_t *) buf)))))
+      || ((buf[3] & ORIG_NAME) && eat_field (gzio->file, -1))
+      || ((buf[3] & COMMENT) && eat_field (gzio->file, -1)))
+    {
+      grub_error (GRUB_ERR_BAD_GZIP_DATA, "unsupported gzip format");
+      return 0;
+    }
+
+  gzio->data_offset = grub_file_tell (gzio->file);
+  
+  grub_file_seek (gzio->file, grub_file_size (gzio->file) - 8);
+  
+  if (grub_file_read (gzio->file, buf, 8) != 8)
+    {
+      grub_error (GRUB_ERR_BAD_FILE_TYPE, "unsupported gzip format");
+      return 0;
+    }
+
+  file->size = grub_le_to_cpu32 (*((grub_uint32_t *) (buf + 4)));
+
+  initialize_tables (file);
+
+  return 1;
+}
+
+
+/* Huffman code lookup table entry--this entry is four bytes for machines
+   that have 16-bit pointers (e.g. PC's in the small or medium model).
+   Valid extra bits are 0..13.  e == 15 is EOB (end of block), e == 16
+   means that v is a literal, 16 < e < 32 means that v is a pointer to
+   the next table, which codes e - 16 bits, and lastly e == 99 indicates
+   an unused code.  If a code with e == 99 is looked up, this implies an
+   error in the data. */
+struct huft
+{
+  uch e;                       /* number of extra bits or operation */
+  uch b;                       /* number of bits in this code or subcode */
+  union
+    {
+      ush n;                   /* literal, length base, or distance base */
+      struct huft *t;          /* pointer to next level of table */
+    }
+  v;
+};
+
+
+/* The inflate algorithm uses a sliding 32K byte window on the uncompressed
+   stream to find repeated byte strings.  This is implemented here as a
+   circular buffer.  The index is updated simply by incrementing and then
+   and'ing with 0x7fff (32K-1). */
+/* It is left to other modules to supply the 32K area.  It is assumed
+   to be usable as if it were declared "uch slide[32768];" or as just
+   "uch *slide;" and then malloc'ed in the latter case.  The definition
+   must be in unzip.h, included above. */
+
+
+/* Tables for deflate from PKZIP's appnote.txt. */
+static unsigned bitorder[] =
+{                              /* Order of the bit length code lengths */
+  16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+static ush cplens[] =
+{                              /* Copy lengths for literal codes 257..285 */
+  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+       /* note: see note #13 above about the 258 in this list. */
+static ush cplext[] =
+{                              /* Extra bits for literal codes 257..285 */
+  0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+  3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99};      /* 99==invalid */
+static ush cpdist[] =
+{                              /* Copy offsets for distance codes 0..29 */
+  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+  8193, 12289, 16385, 24577};
+static ush cpdext[] =
+{                              /* Extra bits for distance codes */
+  0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+  7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+  12, 12, 13, 13};
+
+
+/*
+   Huffman code decoding is performed using a multi-level table lookup.
+   The fastest way to decode is to simply build a lookup table whose
+   size is determined by the longest code.  However, the time it takes
+   to build this table can also be a factor if the data being decoded
+   is not very long.  The most common codes are necessarily the
+   shortest codes, so those codes dominate the decoding time, and hence
+   the speed.  The idea is you can have a shorter table that decodes the
+   shorter, more probable codes, and then point to subsidiary tables for
+   the longer codes.  The time it costs to decode the longer codes is
+   then traded against the time it takes to make longer tables.
+
+   This results of this trade are in the variables lbits and dbits
+   below.  lbits is the number of bits the first level table for literal/
+   length codes can decode in one step, and dbits is the same thing for
+   the distance codes.  Subsequent tables are also less than or equal to
+   those sizes.  These values may be adjusted either when all of the
+   codes are shorter than that, in which case the longest code length in
+   bits is used, or when the shortest code is *longer* than the requested
+   table size, in which case the length of the shortest code in bits is
+   used.
+
+   There are two different values for the two tables, since they code a
+   different number of possibilities each.  The literal/length table
+   codes 286 possible values, or in a flat code, a little over eight
+   bits.  The distance table codes 30 possible values, or a little less
+   than five bits, flat.  The optimum values for speed end up being
+   about one bit more than those, so lbits is 8+1 and dbits is 5+1.
+   The optimum values may differ though from machine to machine, and
+   possibly even between compilers.  Your mileage may vary.
+ */
+
+
+static int lbits = 9;          /* bits in base literal/length lookup table */
+static int dbits = 6;          /* bits in base distance lookup table */
+
+
+/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
+#define BMAX 16                        /* maximum bit length of any code (16 for explode) */
+#define N_MAX 288              /* maximum number of codes in any set */
+
+
+/* Macros for inflate() bit peeking and grabbing.
+   The usage is:
+
+        NEEDBITS(j)
+        x = b & mask_bits[j];
+        DUMPBITS(j)
+
+   where NEEDBITS makes sure that b has at least j bits in it, and
+   DUMPBITS removes the bits from b.  The macros use the variable k
+   for the number of bits in b.  Normally, b and k are register
+   variables for speed, and are initialized at the beginning of a
+   routine that uses these macros from a global bit buffer and count.
+
+   If we assume that EOB will be the longest code, then we will never
+   ask for bits with NEEDBITS that are beyond the end of the stream.
+   So, NEEDBITS should not read any more bytes than are needed to
+   meet the request.  Then no bytes need to be "returned" to the buffer
+   at the end of the last block.
+
+   However, this assumption is not true for fixed blocks--the EOB code
+   is 7 bits, but the other literal/length codes can be 8 or 9 bits.
+   (The EOB code is shorter than other codes because fixed blocks are
+   generally short.  So, while a block always has an EOB, many other
+   literal/length codes have a significantly lower probability of
+   showing up at all.)  However, by making the first table have a
+   lookup of seven bits, the EOB code will be found in that first
+   lookup, and so will not require that too many bits be pulled from
+   the stream.
+ */
+
+static ush mask_bits[] =
+{
+  0x0000,
+  0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
+  0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
+};
+
+#define NEEDBITS(n) do {while(k<(n)){b|=((ulg)get_byte(file))<<k;k+=8;}} while (0)
+#define DUMPBITS(n) do {b>>=(n);k-=(n);} while (0)
+
+static int
+get_byte (grub_file_t file)
+{
+  grub_gzio_t gzio = file->data;
+  
+  if (grub_file_tell (gzio->file) == gzio->data_offset
+      || gzio->inbuf_d == INBUFSIZ)
+    {
+      gzio->inbuf_d = 0;
+      grub_file_read (gzio->file, gzio->inbuf, INBUFSIZ);
+    }
+
+  return gzio->inbuf[gzio->inbuf_d++];
+}
+
+/* more function prototypes */
+static int huft_build (unsigned *, unsigned, unsigned, ush *, ush *,
+                      struct huft **, int *);
+static int huft_free (struct huft *);
+static int inflate_codes_in_window (grub_file_t);
+
+
+/* Given a list of code lengths and a maximum table size, make a set of
+   tables to decode that set of codes.  Return zero on success, one if
+   the given code set is incomplete (the tables are still built in this
+   case), two if the input is invalid (all zero length codes or an
+   oversubscribed set of lengths), and three if not enough memory. */
+
+static int
+huft_build (unsigned *b,       /* code lengths in bits (all assumed <= BMAX) */
+           unsigned n,         /* number of codes (assumed <= N_MAX) */
+           unsigned s,         /* number of simple-valued codes (0..s-1) */
+           ush * d,            /* list of base values for non-simple codes */
+           ush * e,            /* list of extra bits for non-simple codes */
+           struct huft **t,    /* result: starting table */
+           int *m)             /* maximum lookup bits, returns actual */
+{
+  unsigned a;                  /* counter for codes of length k */
+  unsigned c[BMAX + 1];                /* bit length count table */
+  unsigned f;                  /* i repeats in table every f entries */
+  int g;                       /* maximum code length */
+  int h;                       /* table level */
+  register unsigned i;         /* counter, current code */
+  register unsigned j;         /* counter */
+  register int k;              /* number of bits in current code */
+  int l;                       /* bits per table (returned in m) */
+  register unsigned *p;                /* pointer into c[], b[], or v[] */
+  register struct huft *q;     /* points to current table */
+  struct huft r;               /* table entry for structure assignment */
+  struct huft *u[BMAX];                /* table stack */
+  unsigned v[N_MAX];           /* values in order of bit length */
+  register int w;              /* bits before this table == (l * h) */
+  unsigned x[BMAX + 1];                /* bit offsets, then code stack */
+  unsigned *xp;                        /* pointer into x */
+  int y;                       /* number of dummy codes added */
+  unsigned z;                  /* number of entries in current table */
+
+  /* Generate counts for each bit length */
+  grub_memset ((char *) c, 0, sizeof (c));
+  p = b;
+  i = n;
+  do
+    {
+      c[*p]++;                 /* assume all entries <= BMAX */
+      p++;                     /* Can't combine with above line (Solaris bug) */
+    }
+  while (--i);
+  if (c[0] == n)               /* null input--all zero length codes */
+    {
+      *t = (struct huft *) NULL;
+      *m = 0;
+      return 0;
+    }
+
+  /* Find minimum and maximum length, bound *m by those */
+  l = *m;
+  for (j = 1; j <= BMAX; j++)
+    if (c[j])
+      break;
+  k = j;                       /* minimum code length */
+  if ((unsigned) l < j)
+    l = j;
+  for (i = BMAX; i; i--)
+    if (c[i])
+      break;
+  g = i;                       /* maximum code length */
+  if ((unsigned) l > i)
+    l = i;
+  *m = l;
+
+  /* Adjust last length count to fill out codes, if needed */
+  for (y = 1 << j; j < i; j++, y <<= 1)
+    if ((y -= c[j]) < 0)
+      return 2;                        /* bad input: more codes than bits */
+  if ((y -= c[i]) < 0)
+    return 2;
+  c[i] += y;
+
+  /* Generate starting offsets into the value table for each length */
+  x[1] = j = 0;
+  p = c + 1;
+  xp = x + 2;
+  while (--i)
+    {                          /* note that i == g from above */
+      *xp++ = (j += *p++);
+    }
+
+  /* Make a table of values in order of bit lengths */
+  p = b;
+  i = 0;
+  do
+    {
+      if ((j = *p++) != 0)
+       v[x[j]++] = i;
+    }
+  while (++i < n);
+
+  /* Generate the Huffman codes and for each, make the table entries */
+  x[0] = i = 0;                        /* first Huffman code is zero */
+  p = v;                       /* grab values in bit order */
+  h = -1;                      /* no tables yet--level -1 */
+  w = -l;                      /* bits decoded == (l * h) */
+  u[0] = (struct huft *) NULL; /* just to keep compilers happy */
+  q = (struct huft *) NULL;    /* ditto */
+  z = 0;                       /* ditto */
+
+  /* go through the bit lengths (k already is bits in shortest code) */
+  for (; k <= g; k++)
+    {
+      a = c[k];
+      while (a--)
+       {
+         /* here i is the Huffman code of length k bits for value *p */
+         /* make tables up to required level */
+         while (k > w + l)
+           {
+             h++;
+             w += l;           /* previous table always l bits */
+
+             /* compute minimum size table less than or equal to l bits */
+             z = (z = (unsigned) (g - w)) > (unsigned) l ? (unsigned) l : z;   /* upper limit on table size */
+             if ((f = 1 << (j = k - w)) > a + 1)       /* try a k-w bit table */
+               {               /* too few codes for k-w bit table */
+                 f -= a + 1;   /* deduct codes from patterns left */
+                 xp = c + k;
+                 while (++j < z)       /* try smaller tables up to z bits */
+                   {
+                     if ((f <<= 1) <= *++xp)
+                       break;  /* enough codes to use up j bits */
+                     f -= *xp; /* else deduct codes from patterns */
+                   }
+               }
+             z = 1 << j;       /* table entries for j-bit table */
+
+             /* allocate and link in new table */
+             q = (struct huft *) grub_malloc ((z + 1) * sizeof (struct huft));
+             if (! q)
+               {
+                 if (h)
+                   huft_free (u[0]);
+                 return 3;
+               }
+
+             *t = q + 1;       /* link to list for huft_free() */
+             *(t = &(q->v.t)) = (struct huft *) NULL;
+             u[h] = ++q;       /* table starts after link */
+
+             /* connect to last table, if there is one */
+             if (h)
+               {
+                 x[h] = i;     /* save pattern for backing up */
+                 r.b = (uch) l;        /* bits to dump before this table */
+                 r.e = (uch) (16 + j);         /* bits in this table */
+                 r.v.t = q;    /* pointer to this table */
+                 j = i >> (w - l);     /* (get around Turbo C bug) */
+                 u[h - 1][j] = r;      /* connect to last table */
+               }
+           }
+
+         /* set up table entry in r */
+         r.b = (uch) (k - w);
+         if (p >= v + n)
+           r.e = 99;           /* out of values--invalid code */
+         else if (*p < s)
+           {
+             r.e = (uch) (*p < 256 ? 16 : 15);         /* 256 is end-of-block code */
+             r.v.n = (ush) (*p);       /* simple code is just the value */
+             p++;              /* one compiler does not like *p++ */
+           }
+         else
+           {
+             r.e = (uch) e[*p - s];    /* non-simple--look up in lists */
+             r.v.n = d[*p++ - s];
+           }
+
+         /* fill code-like entries with r */
+         f = 1 << (k - w);
+         for (j = i >> w; j < z; j += f)
+           q[j] = r;
+
+         /* backwards increment the k-bit code i */
+         for (j = 1 << (k - 1); i & j; j >>= 1)
+           i ^= j;
+         i ^= j;
+
+         /* backup over finished tables */
+         while ((i & ((1 << w) - 1)) != x[h])
+           {
+             h--;              /* don't need to update q */
+             w -= l;
+           }
+       }
+    }
+
+  /* Return true (1) if we were given an incomplete table */
+  return y != 0 && g != 1;
+}
+
+
+/* Free the malloc'ed tables built by huft_build(), which makes a linked
+   list of the tables it made, with the links in a dummy first entry of
+   each table.  */
+static int
+huft_free (struct huft *t)
+{
+  register struct huft *p, *q;
+
+
+  /* Go through linked list, freeing from the malloced (t[-1]) address. */
+  p = t;
+  while (p != (struct huft *) NULL)
+    {
+      q = (--p)->v.t;
+      grub_free ((char *) p);
+      p = q;
+    }
+  return 0;
+}
+
+
+/*
+ *  inflate (decompress) the codes in a deflated (compressed) block.
+ *  Return an error code or zero if it all goes ok.
+ */
+
+static int
+inflate_codes_in_window (grub_file_t file)
+{
+  register unsigned e;         /* table entry flag/number of extra bits */
+  unsigned n, d;               /* length and index for copy */
+  unsigned w;                  /* current window position */
+  struct huft *t;              /* pointer to table entry */
+  unsigned ml, md;             /* masks for bl and bd bits */
+  register ulg b;              /* bit buffer */
+  register unsigned k;         /* number of bits in bit buffer */
+  grub_gzio_t gzio = file->data;
+  
+  /* make local copies of globals */
+  d = gzio->inflate_d;
+  n = gzio->inflate_n;
+  b = gzio->bb;                        /* initialize bit buffer */
+  k = gzio->bk;
+  w = gzio->wp;                        /* initialize window position */
+
+  /* inflate the coded data */
+  ml = mask_bits[gzio->bl];            /* precompute masks for speed */
+  md = mask_bits[gzio->bd];
+  for (;;)                     /* do until end of block */
+    {
+      if (! gzio->code_state)
+       {
+         NEEDBITS ((unsigned) gzio->bl);
+         if ((e = (t = gzio->tl + ((unsigned) b & ml))->e) > 16)
+           do
+             {
+               if (e == 99)
+                 {
+                   grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                               "an unused code found");
+                   return 1;
+                 }
+               DUMPBITS (t->b);
+               e -= 16;
+               NEEDBITS (e);
+             }
+           while ((e = (t = t->v.t + ((unsigned) b & mask_bits[e]))->e) > 16);
+         DUMPBITS (t->b);
+
+         if (e == 16)          /* then it's a literal */
+           {
+             gzio->slide[w++] = (uch) t->v.n;
+             if (w == WSIZE)
+               break;
+           }
+         else
+           /* it's an EOB or a length */
+           {
+             /* exit if end of block */
+             if (e == 15)
+               {
+                 gzio->block_len = 0;
+                 break;
+               }
+
+             /* get length of block to copy */
+             NEEDBITS (e);
+             n = t->v.n + ((unsigned) b & mask_bits[e]);
+             DUMPBITS (e);
+
+             /* decode distance of block to copy */
+             NEEDBITS ((unsigned) gzio->bd);
+             if ((e = (t = gzio->td + ((unsigned) b & md))->e) > 16)
+               do
+                 {
+                   if (e == 99)
+                     {
+                       grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                                   "an unused code found");
+                       return 1;
+                     }
+                   DUMPBITS (t->b);
+                   e -= 16;
+                   NEEDBITS (e);
+                 }
+               while ((e = (t = t->v.t + ((unsigned) b & mask_bits[e]))->e)
+                      > 16);
+             DUMPBITS (t->b);
+             NEEDBITS (e);
+             d = w - t->v.n - ((unsigned) b & mask_bits[e]);
+             DUMPBITS (e);
+             gzio->code_state++;
+           }
+       }
+
+      if (gzio->code_state)
+       {
+         /* do the copy */
+         do
+           {
+             n -= (e = (e = WSIZE - ((d &= WSIZE - 1) > w ? d : w)) > n ? n
+                   : e);
+
+             if (w - d >= e)
+               {
+                 grub_memmove (gzio->slide + w, gzio->slide + d, e);
+                 w += e;
+                 d += e;
+               }
+             else
+               /* purposefully use the overlap for extra copies here!! */
+               {
+                 while (e--)
+                   gzio->slide[w++] = gzio->slide[d++];
+               }
+
+             if (w == WSIZE)
+               break;
+           }
+         while (n);
+
+         if (! n)
+           gzio->code_state--;
+
+         /* did we break from the loop too soon? */
+         if (w == WSIZE)
+           break;
+       }
+    }
+
+  /* restore the globals from the locals */
+  gzio->inflate_d = d;
+  gzio->inflate_n = n;
+  gzio->wp = w;                        /* restore global window pointer */
+  gzio->bb = b;                        /* restore global bit buffer */
+  gzio->bk = k;
+
+  return ! gzio->block_len;
+}
+
+
+/* get header for an inflated type 0 (stored) block. */
+
+static void
+init_stored_block (grub_file_t file)
+{
+  register ulg b;              /* bit buffer */
+  register unsigned k;         /* number of bits in bit buffer */
+  grub_gzio_t gzio = file->data;
+  
+  /* make local copies of globals */
+  b = gzio->bb;                        /* initialize bit buffer */
+  k = gzio->bk;
+
+  /* go to byte boundary */
+  DUMPBITS (k & 7);
+
+  /* get the length and its complement */
+  NEEDBITS (16);
+  gzio->block_len = ((unsigned) b & 0xffff);
+  DUMPBITS (16);
+  NEEDBITS (16);
+  if (gzio->block_len != (int) ((~b) & 0xffff))
+    grub_error (GRUB_ERR_BAD_GZIP_DATA,
+               "the length of a stored block does not match");
+  DUMPBITS (16);
+
+  /* restore global variables */
+  gzio->bb = b;
+  gzio->bk = k;
+}
+
+
+/* get header for an inflated type 1 (fixed Huffman codes) block.  We should
+   either replace this with a custom decoder, or at least precompute the
+   Huffman tables. */
+
+static void
+init_fixed_block (grub_file_t file)
+{
+  int i;                       /* temporary variable */
+  unsigned l[288];             /* length list for huft_build */
+  grub_gzio_t gzio = file->data;
+  
+  /* set up literal table */
+  for (i = 0; i < 144; i++)
+    l[i] = 8;
+  for (; i < 256; i++)
+    l[i] = 9;
+  for (; i < 280; i++)
+    l[i] = 7;
+  for (; i < 288; i++)         /* make a complete, but wrong code set */
+    l[i] = 8;
+  gzio->bl = 7;
+  if (huft_build (l, 288, 257, cplens, cplext, &gzio->tl, &gzio->bl) != 0)
+    {
+      if (grub_errno == GRUB_ERR_NONE)
+       grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                   "failed in building a Huffman code table");
+      return;
+    }
+
+  /* set up distance table */
+  for (i = 0; i < 30; i++)     /* make an incomplete code set */
+    l[i] = 5;
+  gzio->bd = 5;
+  if (huft_build (l, 30, 0, cpdist, cpdext, &gzio->td, &gzio->bd) > 1)
+    {
+      if (grub_errno == GRUB_ERR_NONE)
+       grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                   "failed in building a Huffman code table");
+      huft_free (gzio->tl);
+      gzio->tl = 0;
+      return;
+    }
+
+  /* indicate we're now working on a block */
+  gzio->code_state = 0;
+  gzio->block_len++;
+}
+
+
+/* get header for an inflated type 2 (dynamic Huffman codes) block. */
+
+static void
+init_dynamic_block (grub_file_t file)
+{
+  int i;                       /* temporary variables */
+  unsigned j;
+  unsigned l;                  /* last length */
+  unsigned m;                  /* mask for bit lengths table */
+  unsigned n;                  /* number of lengths to get */
+  unsigned nb;                 /* number of bit length codes */
+  unsigned nl;                 /* number of literal/length codes */
+  unsigned nd;                 /* number of distance codes */
+  unsigned ll[286 + 30];       /* literal/length and distance code lengths */
+  register ulg b;              /* bit buffer */
+  register unsigned k;         /* number of bits in bit buffer */
+  grub_gzio_t gzio = file->data;
+  
+  /* make local bit buffer */
+  b = gzio->bb;
+  k = gzio->bk;
+
+  /* read in table lengths */
+  NEEDBITS (5);
+  nl = 257 + ((unsigned) b & 0x1f);    /* number of literal/length codes */
+  DUMPBITS (5);
+  NEEDBITS (5);
+  nd = 1 + ((unsigned) b & 0x1f);      /* number of distance codes */
+  DUMPBITS (5);
+  NEEDBITS (4);
+  nb = 4 + ((unsigned) b & 0xf);       /* number of bit length codes */
+  DUMPBITS (4);
+  if (nl > 286 || nd > 30)
+    {
+      grub_error (GRUB_ERR_BAD_GZIP_DATA, "too much data");
+      return;
+    }
+
+  /* read in bit-length-code lengths */
+  for (j = 0; j < nb; j++)
+    {
+      NEEDBITS (3);
+      ll[bitorder[j]] = (unsigned) b & 7;
+      DUMPBITS (3);
+    }
+  for (; j < 19; j++)
+    ll[bitorder[j]] = 0;
+
+  /* build decoding table for trees--single level, 7 bit lookup */
+  gzio->bl = 7;
+  if (huft_build (ll, 19, 19, NULL, NULL, &gzio->tl, &gzio->bl) != 0)
+    {
+      grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                 "failed in building a Huffman code table");
+      return;
+    }
+
+  /* read in literal and distance code lengths */
+  n = nl + nd;
+  m = mask_bits[gzio->bl];
+  i = l = 0;
+  while ((unsigned) i < n)
+    {
+      NEEDBITS ((unsigned) gzio->bl);
+      j = (gzio->td = gzio->tl + ((unsigned) b & m))->b;
+      DUMPBITS (j);
+      j = gzio->td->v.n;
+      if (j < 16)              /* length of code in bits (0..15) */
+       ll[i++] = l = j;        /* save last length in l */
+      else if (j == 16)                /* repeat last length 3 to 6 times */
+       {
+         NEEDBITS (2);
+         j = 3 + ((unsigned) b & 3);
+         DUMPBITS (2);
+         if ((unsigned) i + j > n)
+           {
+             grub_error (GRUB_ERR_BAD_GZIP_DATA, "too many codes found");
+             return;
+           }
+         while (j--)
+           ll[i++] = l;
+       }
+      else if (j == 17)                /* 3 to 10 zero length codes */
+       {
+         NEEDBITS (3);
+         j = 3 + ((unsigned) b & 7);
+         DUMPBITS (3);
+         if ((unsigned) i + j > n)
+           {
+             grub_error (GRUB_ERR_BAD_GZIP_DATA, "too many codes found");
+             return;
+           }
+         while (j--)
+           ll[i++] = 0;
+         l = 0;
+       }
+      else
+       /* j == 18: 11 to 138 zero length codes */
+       {
+         NEEDBITS (7);
+         j = 11 + ((unsigned) b & 0x7f);
+         DUMPBITS (7);
+         if ((unsigned) i + j > n)
+           {
+             grub_error (GRUB_ERR_BAD_GZIP_DATA, "too many codes found");
+             return;
+           }
+         while (j--)
+           ll[i++] = 0;
+         l = 0;
+       }
+    }
+
+  /* free decoding table for trees */
+  huft_free (gzio->tl);
+  gzio->td = 0;
+  gzio->tl = 0;
+
+  /* restore the global bit buffer */
+  gzio->bb = b;
+  gzio->bk = k;
+
+  /* build the decoding tables for literal/length and distance codes */
+  gzio->bl = lbits;
+  if (huft_build (ll, nl, 257, cplens, cplext, &gzio->tl, &gzio->bl) != 0)
+    {
+      grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                 "failed in building a Huffman code table");
+      return;
+    }
+  gzio->bd = dbits;
+  if (huft_build (ll + nl, nd, 0, cpdist, cpdext, &gzio->td, &gzio->bd) != 0)
+    {
+      huft_free (gzio->tl);
+      gzio->tl = 0;
+      grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                 "failed in building a Huffman code table");
+      return;
+    }
+
+  /* indicate we're now working on a block */
+  gzio->code_state = 0;
+  gzio->block_len++;
+}
+
+
+static void
+get_new_block (grub_file_t file)
+{
+  register ulg b;              /* bit buffer */
+  register unsigned k;         /* number of bits in bit buffer */
+  grub_gzio_t gzio = file->data;
+  
+  /* make local bit buffer */
+  b = gzio->bb;
+  k = gzio->bk;
+
+  /* read in last block bit */
+  NEEDBITS (1);
+  gzio->last_block = (int) b & 1;
+  DUMPBITS (1);
+
+  /* read in block type */
+  NEEDBITS (2);
+  gzio->block_type = (unsigned) b & 3;
+  DUMPBITS (2);
+
+  /* restore the global bit buffer */
+  gzio->bb = b;
+  gzio->bk = k;
+
+  switch (gzio->block_type)
+    {
+    case INFLATE_STORED:
+      init_stored_block (file);
+      break;
+    case INFLATE_FIXED:
+      init_fixed_block (file);
+      break;
+    case INFLATE_DYNAMIC:
+      init_dynamic_block (file);
+      break;
+    default:
+      break;
+    }
+}
+
+
+static void
+inflate_window (grub_file_t file)
+{
+  grub_gzio_t gzio = file->data;
+  
+  /* initialize window */
+  gzio->wp = 0;
+
+  /*
+   *  Main decompression loop.
+   */
+
+  while (gzio->wp < WSIZE && grub_errno == GRUB_ERR_NONE)
+    {
+      if (! gzio->block_len)
+       {
+         if (gzio->last_block)
+           break;
+
+         get_new_block (file);
+       }
+
+      if (gzio->block_type > INFLATE_DYNAMIC)
+       grub_error (GRUB_ERR_BAD_GZIP_DATA,
+                   "unknown block type %d", gzio->block_type);
+
+      if (grub_errno != GRUB_ERR_NONE)
+       return;
+
+      /*
+       *  Expand stored block here.
+       */
+      if (gzio->block_type == INFLATE_STORED)
+       {
+         int w = gzio->wp;
+
+         /*
+          *  This is basically a glorified pass-through
+          */
+
+         while (gzio->block_len && w < WSIZE && grub_errno == GRUB_ERR_NONE)
+           {
+             gzio->slide[w++] = get_byte (file);
+             gzio->block_len--;
+           }
+
+         gzio->wp = w;
+
+         continue;
+       }
+
+      /*
+       *  Expand other kind of block.
+       */
+
+      if (inflate_codes_in_window (file))
+       {
+         huft_free (gzio->tl);
+         huft_free (gzio->td);
+         gzio->tl = 0;
+         gzio->td = 0;
+       }
+    }
+
+  gzio->saved_offset += WSIZE;
+
+  /* XXX do CRC calculation here! */
+}
+
+
+static void
+initialize_tables (grub_file_t file)
+{
+  grub_gzio_t gzio = file->data;
+  
+  gzio->saved_offset = 0;
+  grub_file_seek (gzio->file, gzio->data_offset);
+
+  /* Initialize the bit buffer.  */
+  gzio->bk = 0;
+  gzio->bb = 0;
+
+  /* Reset partial decompression code.  */
+  gzio->last_block = 0;
+  gzio->block_len = 0;
+
+  /* Reset memory allocation stuff.  */
+  huft_free (gzio->tl);
+  huft_free (gzio->td);
+}
+
+
+/* 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)
+{
+  grub_file_t file;
+  grub_gzio_t gzio = 0;
+  
+  file = (grub_file_t) grub_malloc (sizeof (*file));
+  if (! file)
+    return 0;
+
+  gzio = grub_malloc (sizeof (*gzio));
+  if (! gzio)
+    {
+      grub_free (file);
+      return 0;
+    }
+  
+  grub_memset (gzio, 0, sizeof (*gzio));
+  gzio->file = io;
+  
+  file->device = io->device;
+  file->offset = 0;
+  file->data = gzio;
+  file->read_hook = 0;
+  file->fs = &grub_gzio_fs;
+
+  if (! test_header (file))
+    {
+      grub_free (gzio);
+      grub_free (file);
+      grub_file_seek (io, 0);
+
+      if (grub_errno == GRUB_ERR_BAD_FILE_TYPE && transparent)
+       {
+         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;
+}
+
+static grub_ssize_t
+grub_gzio_read (grub_file_t file, char *buf, grub_ssize_t len)
+{
+  grub_ssize_t ret = 0;
+  grub_gzio_t gzio = file->data;
+  grub_ssize_t offset;
+  
+  /* Do we reset decompression to the beginning of the file?  */
+  if (gzio->saved_offset > file->offset + WSIZE)
+    initialize_tables (file);
+
+  /*
+   *  This loop operates upon uncompressed data only.  The only
+   *  special thing it does is to make sure the decompression
+   *  window is within the range of data it needs.
+   */
+
+  offset = file->offset;
+  
+  while (len > 0 && grub_errno == GRUB_ERR_NONE)
+    {
+      register grub_ssize_t size;
+      register char *srcaddr;
+
+      while (offset >= gzio->saved_offset)
+       inflate_window (file);
+
+      srcaddr = (char *) ((offset & (WSIZE - 1)) + gzio->slide);
+      size = gzio->saved_offset - file->offset;
+      if (size > len)
+       size = len;
+
+      grub_memmove (buf, srcaddr, size);
+
+      buf += size;
+      len -= size;
+      ret += size;
+      offset += size;
+    }
+
+  if (grub_errno != GRUB_ERR_NONE)
+    ret = -1;
+
+  return ret;
+}
+
+/* Release everything, including the underlying file object.  */
+static grub_err_t
+grub_gzio_close (grub_file_t file)
+{
+  grub_gzio_t gzio = file->data;
+  
+  grub_file_close (gzio->file);
+  huft_free (gzio->tl);
+  huft_free (gzio->td);
+  grub_free (gzio);
+
+  /* No need to close the same device twice.  */
+  file->device = 0;
+
+  return grub_errno;
+}
+
+\f
+
+static struct grub_fs grub_gzio_fs =
+  {
+    .name = "gzio",
+    .dir = 0,
+    .open = 0,
+    .read = grub_gzio_read,
+    .close = grub_gzio_close,
+    .label = 0,
+    .next = 0
+  };
index 029cd64756820a9aed99c1fd86bfe859b9cc2746..d7d625b3e605779c39d812b846edacd34d6dad46 100644 (file)
@@ -135,7 +135,8 @@ grub_file_close (grub_file_t file)
   if (file->fs->close)
     (file->fs->close) (file);
 
-  grub_device_close (file->device);
+  if (file->device)
+    grub_device_close (file->device);
   grub_free (file);
   return grub_errno;
 }
index ebe9aeb431d2c7a6de2aac2ead5d99ee90fd6365..cdf3ba79831904d9818fdc69a4c0a8dc4057c7d7 100644 (file)
@@ -42,6 +42,7 @@
 #include <grub/dl.h>
 #include <grub/mm.h>
 #include <grub/misc.h>
+#include <grub/gzio.h>
 
 static grub_dl_t my_mod;
 static struct grub_multiboot_info *mbi;
@@ -252,7 +253,7 @@ grub_rescue_cmd_multiboot (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_gzfile_open (argv[0], 1);
   if (! file)
     {
       grub_error (GRUB_ERR_BAD_ARGUMENT, "Couldn't open file");
@@ -361,7 +362,7 @@ grub_rescue_cmd_module  (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_gzfile_open (argv[0], 1);
   if (! file)
     goto fail;