[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] grub2: commands/cmp.c: grub_cmd_cmp()
From: |
Vincent Pelletier |
Subject: |
[PATCH] grub2: commands/cmp.c: grub_cmd_cmp() |
Date: |
Wed, 29 Jun 2005 17:59:27 +0200 |
User-agent: |
Debian Thunderbird 1.0.2 (X11/20050602) |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Vincent Pelletier wrote:
> nb: I haven't tested these changes beyond "make", but I think they are
> trivial enough to be trusted...
My baaad...
There were 2 bugs left :
- -If the file size isn't a multiple of 512 bytes, we would read
non-initialised or non-updated memory (so it only affects results on
files whom size is < 512)
- -"The files are identical." is displayed when file size differ (was
corrected in Wanderley's version)
Reminds me Hagakure :
"Matters of small concern should be considered seriously".
I'm not sure if it is right to add a macro definition for block size,
and wether the name is good.
2005-06-29 Vincent Pelletier <address@hidden>
* commands/cmp.c
(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. (BLOCK_SIZE): New macro.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
iD8DBQFCwsVfFEQoKRQyjtURApNOAKC4bO41ca3vX/m64aIy4hIvjIwW1QCgmbyg
AIn3yvP072FMa0LlDFo1CYM=
=o8fq
-----END PGP SIGNATURE-----
Index: commands/cmp.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/cmp.c,v
retrieving revision 1.2
diff -u -p -r1.2 cmp.c
--- commands/cmp.c 4 Apr 2004 13:46:00 -0000 1.2
+++ commands/cmp.c 29 Jun 2005 15:47:36 -0000
@@ -24,6 +24,8 @@
#include <grub/misc.h>
#include <grub/file.h>
+#define BLOCK_SIZE 512
+
static grub_err_t
grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
int argc, char **args)
@@ -44,54 +46,53 @@ grub_cmd_cmp (struct grub_arg_list *stat
file2 = grub_file_open (args[1]);
if (! file2)
{
- grub_file_close (file2);
+ grub_file_close (file1);
return grub_errno;
}
if (grub_file_size (file1) != grub_file_size (file2))
- grub_printf ("Differ in size: %d [%s], %d [%s]\n",
- grub_file_size (file1), args[0],
- grub_file_size (file2), args[1]);
+ {
+ grub_printf ("Differ in size: %d [%s], %d [%s]\n",
+ grub_file_size (file1), args[0],
+ grub_file_size (file2), args[1]);
+ }
else
{
- char buf1[512];
- char buf2[512];
+ char buf1[BLOCK_SIZE];
+ char buf2[BLOCK_SIZE];
grub_ssize_t rd1, rd2;
grub_uint32_t pos = 0;
do
{
int i;
- rd1 = grub_file_read (file1, buf1, 512);
- rd2 = grub_file_read (file2, buf2, 512);
+ rd1 = grub_file_read (file1, buf1, BLOCK_SIZE);
+ rd2 = grub_file_read (file2, buf2, BLOCK_SIZE);
if (rd1 != rd2)
- return 0;
+ goto cleanup;
- for (i = 0; i < 512; i++)
+ for (i = 0; i < rd1; i++)
{
if (buf1[i] != buf2[i])
{
grub_printf ("Differ at the offset %d: 0x%x [%s], 0x%x
[%s]\n",
i + pos, buf1[i], args[0],
buf2[i], args[1]);
-
- grub_file_close (file1);
- grub_file_close (file2);
- return 0;
+ goto cleanup;
}
}
- pos += 512;
+ pos += BLOCK_SIZE;
} while (rd2);
+ grub_printf ("The files are identical.\n");
}
+cleanup:
grub_file_close (file1);
grub_file_close (file2);
- grub_printf ("The files are identical.\n");
-
return 0;
}