From d07884894310b349e445f4892f6065f131e33079 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 8 Feb 2008 09:49:44 +0000 Subject: [PATCH] Fixed an endless cycle with early EOF --- test/compare_file.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/test/compare_file.c b/test/compare_file.c index b2f5fd10..207c906d 100644 --- a/test/compare_file.c +++ b/test/compare_file.c @@ -1,5 +1,6 @@ /* - Compare two copies of a file object in as many aspects as i can imagine. + Compare two copies of a file object in as many aspects as i can imagine + to make sense. (E.g.: comparing atime makes no sense.) To compare tree /media/dvd and /original/dir : find /media/dvd -exec compare_file '{}' /media/dvd /original/dir ';' @@ -29,7 +30,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) { struct stat s1, s2; - int ret, differs= 0, r1, r2, fd1, fd2, i; + int ret, differs= 0, r1, r2, fd1= -1, fd2= -1, i, done; char buf1[4096], buf2[4096], a[4096]; off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1; @@ -126,7 +127,8 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) } /* Content */ - while(1) { + done= 0; + while(!done) { r1= read(fd1, buf1, sizeof(buf1)); r2= read(fd2, buf2, sizeof(buf2)); if((r1==EOF && r2==EOF) || (r1==0 && r2==0)) @@ -135,7 +137,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) if(r1==EOF) r1= 0; if(s1.st_size > r1count + r1) - printf("- %s : early EOF after %d bytes\n", adr1, r1count); + printf("- %s : early EOF after %.f bytes\n", adr1, (double) r1count); differs= 1; } r1count+= r1; @@ -143,13 +145,15 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) if(r2==EOF) r2= 0; if(s2.st_size > r2count + r2) - printf("- %s : early EOF after %d bytes\n", adr2, r2count); + printf("- %s : early EOF after %.f bytes\n", adr2, (double) r2count); differs= 1; + done= 1; } if(r2>r1) { if(s1.st_size > r1count + r1) - printf("- %s : early EOF after %d bytes\n", adr1, r1count); + printf("- %s : early EOF after %.f bytes\n", adr1, (double) r1count); differs= 1; + done= 1; } r2count+= r2; if(r1>r2) @@ -166,14 +170,15 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) if(first_diff<0) first_diff= (r1count>r2count ? r2count : r1count); printf("%s : %s : differs by at least %.f bytes. First at %.f\n", a, - (s1.st_size==s2.st_size || s1.st_mtime==s2.st_mtime ? - "CONTENT":"content"), + (s1.st_mtime==s2.st_mtime ? "CONTENT":"content"), (double) (diffcount + abs(r1count-r2count)), (double) first_diff); differs= 1; } } - close(fd1); - close(fd2); + if(fd1!=-1) + close(fd1); + if(fd2!=-1) + close(fd2); return(!differs); }