[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2] commands/cmp.c: grub_cmd_cmp()
From: |
Vincent Pelletier |
Subject: |
[PATCH v2] commands/cmp.c: grub_cmd_cmp() |
Date: |
Sat, 02 Jul 2005 12:50:15 +0200 |
User-agent: |
Debian Thunderbird 1.0.2 (X11/20050602) |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
(hum)
Vincent Pelletier
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
iD8DBQFCxnFnFEQoKRQyjtURAp6rAJ9bk6yTKM+px9Ikh+4ByzT+Q01c/gCeLVJ1
3YHNI5TDbln9u0Aoz5i9R4M=
=jdzU
-----END PGP SIGNATURE-----
Index: cmp.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/cmp.c,v
retrieving revision 1.2
diff -u -p -r1.2 cmp.c
--- cmp.c 4 Apr 2004 13:46:00 -0000 1.2
+++ cmp.c 2 Jul 2005 10:10:40 -0000
@@ -23,13 +23,21 @@
#include <grub/arg.h>
#include <grub/misc.h>
#include <grub/file.h>
+#include <grub/mm.h>
+
+#define BUFFER_SIZE 512
static grub_err_t
grub_cmd_cmp (struct grub_arg_list *state __attribute__ ((unused)),
int argc, char **args)
{
- grub_file_t file1;
- grub_file_t file2;
+ grub_err_t err;
+ 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)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "two arguments required");
@@ -37,16 +45,9 @@ grub_cmd_cmp (struct grub_arg_list *stat
grub_printf ("Compare `%s' and `%s':\n", args[0],
args[1]);
- file1 = grub_file_open (args[0]);
- if (! file1)
- return grub_errno;
-
- file2 = grub_file_open (args[1]);
- if (! file2)
- {
- grub_file_close (file2);
- return grub_errno;
- }
+ if (! (file1 = grub_file_open (args[0]) ) ||
+ ! (file2 = grub_file_open (args[1]) ) )
+ goto cleanup;
if (grub_file_size (file1) != grub_file_size (file2))
grub_printf ("Differ in size: %d [%s], %d [%s]\n",
@@ -55,44 +56,48 @@ grub_cmd_cmp (struct grub_arg_list *stat
else
{
- char buf1[512];
- char buf2[512];
- grub_ssize_t rd1, rd2;
- grub_uint32_t pos = 0;
-
+ pos = 0;
+
+ if (! (buf1 = (char *) grub_malloc (BUFFER_SIZE) ) ||
+ ! (buf2 = (char *) grub_malloc (BUFFER_SIZE) ) )
+ goto cleanup;
do
{
int i;
- rd1 = grub_file_read (file1, buf1, 512);
- rd2 = grub_file_read (file2, buf2, 512);
+ rd1 = grub_file_read (file1, buf1, BUFFER_SIZE);
+ rd2 = grub_file_read (file2, buf2, BUFFER_SIZE);
if (rd1 != rd2)
- return 0;
+ goto cleanup;
- for (i = 0; i < 512; i++)
+ for (i = 0; i < rd2; 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 += BUFFER_SIZE;
} while (rd2);
+ grub_printf ("The files are identical.\n");
}
- grub_file_close (file1);
- grub_file_close (file2);
-
- grub_printf ("The files are identical.\n");
+cleanup:
+ 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);
- return 0;
+ return err;
}