2005-07-09 Vincent Pelletier <subdino2004@yahoo.fr>

* commands/cmp.c (BUFFER_SIZE): New macro.
	(grub_cmd_cmp): Close the right file at the right time.  Compare
	only data just read.  Don't report files of different  size as
	identical.  Dynamically allocate buffers.  Move variable
	declarations at the beginning of function.
This commit is contained in:
subdino 2005-07-09 16:29:02 +00:00
parent e6f3e61495
commit 68c864ebb6
2 changed files with 44 additions and 31 deletions

View file

@ -1,3 +1,11 @@
2005-07-09 Vincent Pelletier <subdino2004@yahoo.fr>
* commands/cmp.c (BUFFER_SIZE): New macro.
(grub_cmd_cmp): Close the right file at the right time. Compare
only data just read. Don't report files of different size as
identical. Dynamically allocate buffers. Move variable
declarations at the beginning of function.
2005-07-09 Yoshinori Okuji <okuji@enbug.org> 2005-07-09 Yoshinori Okuji <okuji@enbug.org>
* aclocal.m4 (grub_I386_CHECK_REGPARM_BUG): The return value was * aclocal.m4 (grub_I386_CHECK_REGPARM_BUG): The return value was

View file

@ -23,13 +23,21 @@
#include <grub/arg.h> #include <grub/arg.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/file.h> #include <grub/file.h>
#include <grub/mm.h>
#define BUFFER_SIZE 512
static grub_err_t static grub_err_t
grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)), grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
int argc, char **args) int argc, char **args)
{ {
grub_file_t file1; grub_err_t err;
grub_file_t file2; grub_ssize_t rd1, rd2;
grub_uint32_t pos;
grub_file_t file1 = 0;
grub_file_t file2 = 0;
char *buf1 = 0;
char *buf2 = 0;
if (argc != 2) if (argc != 2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "two arguments required"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "two arguments required");
@ -37,16 +45,9 @@ grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
grub_printf ("Compare `%s' and `%s':\n", args[0], grub_printf ("Compare `%s' and `%s':\n", args[0],
args[1]); args[1]);
file1 = grub_file_open (args[0]); if (! (file1 = grub_file_open (args[0]) ) ||
if (! file1) ! (file2 = grub_file_open (args[1]) ) )
return grub_errno; goto cleanup;
file2 = grub_file_open (args[1]);
if (! file2)
{
grub_file_close (file2);
return grub_errno;
}
if (grub_file_size (file1) != grub_file_size (file2)) if (grub_file_size (file1) != grub_file_size (file2))
grub_printf ("Differ in size: %d [%s], %d [%s]\n", grub_printf ("Differ in size: %d [%s], %d [%s]\n",
@ -55,44 +56,48 @@ grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
else else
{ {
char buf1[512]; pos = 0;
char buf2[512];
grub_ssize_t rd1, rd2;
grub_uint32_t pos = 0;
if (! (buf1 = (char *) grub_malloc (BUFFER_SIZE) ) ||
! (buf2 = (char *) grub_malloc (BUFFER_SIZE) ) )
goto cleanup;
do do
{ {
int i; int i;
rd1 = grub_file_read (file1, buf1, 512); rd1 = grub_file_read (file1, buf1, BUFFER_SIZE);
rd2 = grub_file_read (file2, buf2, 512); rd2 = grub_file_read (file2, buf2, BUFFER_SIZE);
if (rd1 != rd2) if (rd1 != rd2)
return 0; goto cleanup;
for (i = 0; i < 512; i++) for (i = 0; i < rd2; i++)
{ {
if (buf1[i] != buf2[i]) if (buf1[i] != buf2[i])
{ {
grub_printf ("Differ at the offset %d: 0x%x [%s], 0x%x [%s]\n", grub_printf ("Differ at the offset %d: 0x%x [%s], 0x%x [%s]\n",
i + pos, buf1[i], args[0], i + pos, buf1[i], args[0],
buf2[i], args[1]); buf2[i], args[1]);
goto cleanup;
grub_file_close (file1);
grub_file_close (file2);
return 0;
} }
} }
pos += 512; pos += BUFFER_SIZE;
} while (rd2); } while (rd2);
grub_printf ("The files are identical.\n");
} }
grub_file_close (file1); cleanup:
grub_file_close (file2); err=grub_errno;
if (buf1)
grub_free (buf1);
if (buf2)
grub_free (buf2);
if (file1)
grub_file_close (file1);
if (file2)
grub_file_close (file2);
grub_printf ("The files are identical.\n"); return err;
return 0;
} }