grub-devel
[Top][All Lists]
Advanced

[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;
 }
 
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]