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

	* conf/common.rmk (pkgdata_MODULES): Add hexdump.mod.
	(hexdump_mod_SOURCES): New variable.
	(hexdump_mod_CFLAGS): Likewise.
	(hexdump_mod_LDFLAGS): Likewise.
	
	* conf/i386-pc.rmk (grub_emu_SOURCES): Add command/hexdump.c.

	* conf/i386-efi.rmk (grub_emu_SOURCES): Add command/hexdump.c.

	* conf/i386-linuxbios.rmk (grub_emu_SOURCES): Add command/hexdump.c.

	* conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Add command/hexdump.c.

	* include/grub/hexdump.h: New file.

	* commands/hexdump.c: New file.


Index: conf/common.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/common.rmk,v
retrieving revision 1.16
diff -u -p -r1.16 common.rmk
--- conf/common.rmk	2 Aug 2007 19:12:52 -0000	1.16
+++ conf/common.rmk	14 Nov 2007 05:40:16 -0000
@@ -199,7 +199,7 @@ lvm_mod_LDFLAGS = $(COMMON_LDFLAGS)
 pkgdata_MODULES += hello.mod boot.mod terminal.mod ls.mod	\
 	cmp.mod cat.mod help.mod font.mod search.mod		\
 	loopback.mod configfile.mod				\
-	terminfo.mod test.mod blocklist.mod
+	terminfo.mod test.mod blocklist.mod hexdump.mod
 
 # For hello.mod.
 hello_mod_SOURCES = hello/hello.c
@@ -276,6 +276,11 @@ blocklist_mod_SOURCES = commands/blockli
 blocklist_mod_CFLAGS = $(COMMON_CFLAGS)
 blocklist_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+# For hexdump.mod.
+hexdump_mod_SOURCES = commands/hexdump.c
+hexdump_mod_CFLAGS = $(COMMON_CFLAGS)
+hexdump_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 # Misc.
 pkgdata_MODULES += gzio.mod elf.mod
 
Index: conf/i386-pc.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/i386-pc.rmk,v
retrieving revision 1.93
diff -u -p -r1.93 i386-pc.rmk
--- conf/i386-pc.rmk	10 Nov 2007 18:34:48 -0000	1.93
+++ conf/i386-pc.rmk	14 Nov 2007 05:40:40 -0000
@@ -91,7 +91,7 @@ grub_emu_DEPENDENCIES = grub_script.tab.
 grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c	\
 	commands/configfile.c commands/echo.c commands/help.c		\
 	commands/terminal.c commands/ls.c commands/test.c 		\
-	commands/search.c commands/blocklist.c				\
+	commands/search.c commands/blocklist.c commands/hexdump.c	\
 	commands/i386/pc/halt.c commands/i386/pc/reboot.c		\
 	commands/i386/cpuid.c						\
 	disk/host.c disk/loopback.c	disk/raid.c disk/lvm.c		\
Index: conf/i386-efi.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/i386-efi.rmk,v
retrieving revision 1.23
diff -u -p -r1.23 i386-efi.rmk
--- conf/i386-efi.rmk	22 Oct 2007 19:59:32 -0000	1.23
+++ conf/i386-efi.rmk	14 Nov 2007 06:17:15 -0000
@@ -44,7 +44,7 @@ grub_emu_DEPENDENCIES = grub_script.tab.
 grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c 	\
 	commands/configfile.c commands/help.c				\
 	commands/terminal.c commands/ls.c commands/test.c 		\
-	commands/search.c						\
+	commands/search.c commands/hexdump.c				\
 	commands/i386/pc/halt.c commands/i386/pc/reboot.c		\
 	commands/i386/cpuid.c						\
 	disk/loopback.c							\
Index: conf/i386-linuxbios.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/i386-linuxbios.rmk,v
retrieving revision 1.2
diff -u -p -r1.2 i386-linuxbios.rmk
--- conf/i386-linuxbios.rmk	5 Nov 2007 16:15:25 -0000	1.2
+++ conf/i386-linuxbios.rmk	14 Nov 2007 06:17:15 -0000
@@ -68,7 +68,7 @@ grub_emu_DEPENDENCIES = grub_script.tab.
 grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c	\
 	commands/configfile.c commands/echo.c commands/help.c		\
 	commands/terminal.c commands/ls.c commands/test.c 		\
-	commands/search.c commands/blocklist.c				\
+	commands/search.c commands/blocklist.c commands/hexdump.c	\
 	commands/i386/pc/halt.c commands/i386/pc/reboot.c		\
 	commands/i386/cpuid.c						\
 	disk/host.c disk/loopback.c	disk/raid.c disk/lvm.c		\
Index: conf/powerpc-ieee1275.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/powerpc-ieee1275.rmk,v
retrieving revision 1.74
diff -u -p -r1.74 powerpc-ieee1275.rmk
--- conf/powerpc-ieee1275.rmk	22 Oct 2007 19:59:32 -0000	1.74
+++ conf/powerpc-ieee1275.rmk	14 Nov 2007 06:17:18 -0000
@@ -56,7 +56,7 @@ grub_emu_DEPENDENCIES = grub_script.tab.
 grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c 	\
 	commands/configfile.c commands/help.c				\
 	commands/search.c commands/terminal.c commands/test.c 		\
-	commands/ls.c commands/blocklist.c				\
+	commands/ls.c commands/blocklist.c commands/hexdump.c		\
 	commands/ieee1275/halt.c commands/ieee1275/reboot.c		\
 	disk/loopback.c							\
 	fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c	\
Index: include/grub/hexdump.h
==========================================
RCS file: /sources/grub/grub2/include/grub/hexdump.h,v
diff -Nu include/grub/hexdump.h
--- /dev/null	2007-11-14 20:37:17.256044485 +0800
+++ include/grub/hexdump.h	2007-11-14 12:42:55.906250000 +0800
@@ -0,0 +1,25 @@
+/* hexdump.h - prototypes for dump */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 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_HEXDUMP_H
+#define GRUB_HEXDUMP_H	1
+
+void hexdump(unsigned long bse,char* buf,int len);
+
+#endif /* ! GRUB_HEXDUMP_H */
Index: commands/hexdump.c
===================================================================
RCS file: /sources/grub/grub2/commands/hexdump.c,v
diff -Nu commands/hexdump.c
--- /dev/null	2007-11-14 20:37:17.256044485 +0800
+++ commands/hexdump.c	2007-11-14 13:20:51.734375000 +0800
@@ -0,0 +1,144 @@
+/* hexdump.c - command to dump the contents of a file or memory */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 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/>.
+ */
+
+#include <grub/normal.h>
+#include <grub/dl.h>
+#include <grub/arg.h>
+#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[] = {
+  {"skip", 's', 0, "skip offset bytes from the beginning of file.", 0,
+   ARG_TYPE_INT},
+  {"length", 'n', 0, "read only length bytes", 0, ARG_TYPE_INT},
+  {0, 0, 0, 0, 0, 0}
+};
+
+void
+hexdump (unsigned long bse, char *buf, int len)
+{
+  int pos;
+  char line[80];
+
+  while (len > 0)
+    {
+      int cnt, i;
+
+      pos = grub_sprintf (line, "%08lx  ", bse);
+      cnt = 16;
+      if (cnt > len)
+	cnt = len;
+
+      for (i = 0; i < cnt; i++)
+	{
+	  pos += grub_sprintf (&line[pos], "%02x ", (unsigned char) buf[i]);
+	  if ((i & 7) == 7)
+	    line[pos++] = ' ';
+	}
+
+      for (; i < 16; i++)
+	{
+	  pos += grub_sprintf (&line[pos], "   ");
+	  if ((i & 7) == 7)
+	    line[pos++] = ' ';
+	}
+
+      line[pos++] = '|';
+
+      for (i = 0; i < cnt; i++)
+	line[pos++] = ((buf[i] >= 32) && (buf[i] < 127)) ? buf[i] : '.';
+
+      line[pos++] = '|';
+
+      line[pos] = 0;
+
+      grub_printf ("%s\n", line);
+
+      bse += 16;
+      buf += 16;
+      len -= cnt;
+    }
+}
+
+static grub_err_t
+grub_cmd_hexdump (struct grub_arg_list *state, int argc, char **args)
+{
+  grub_file_t file;
+  char buf[GRUB_DISK_SECTOR_SIZE];
+  grub_ssize_t size, length;
+  unsigned long skip;
+  int is_file;
+
+  if (argc != 1)
+    return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name required");
+
+  skip = (state[0].set) ? grub_strtoul (state[0].arg, 0, 0) : 0;
+  length = (state[1].set) ? grub_strtoul (state[1].arg, 0, 0) : 0;
+
+  is_file = (grub_strcmp (args[0], "(mem)"));
+  if ((!is_file) && (!length))
+    length = 256;
+
+  if (is_file)
+    {
+      file = grub_gzfile_open (args[0], 1);
+      if (!file)
+	return 0;
+
+      file->offset = skip;
+
+      while ((size = grub_file_read (file, buf, sizeof (buf))) > 0)
+	{
+	  unsigned long len;
+
+	  len = ((length) && (size > length)) ? length : size;
+	  hexdump (skip, buf, len);
+	  skip += len;
+	  if (length)
+	    {
+	      length -= len;
+	      if (!length)
+		break;
+	    }
+	}
+
+      grub_file_close (file);
+    }
+  else
+    hexdump (skip, (char *) skip, length);
+
+  return 0;
+}
+
+
+GRUB_MOD_INIT (hexdump)
+{
+  (void) mod;			/* To stop warning. */
+  grub_register_command ("hexdump", grub_cmd_hexdump, GRUB_COMMAND_FLAG_BOTH,
+			 "hexdump  [ -s offset ] [-n length] { FILE | (mem) }",
+			 "Dump the contents of a file or memory.", options);
+}
+
+GRUB_MOD_FINI (hexdump)
+{
+  grub_unregister_command ("hexdump");
+}
