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 #include +#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; }