diff --git a/test/compare_file.c b/test/compare_file.c index 207c906d..63a7ff5a 100644 --- a/test/compare_file.c +++ b/test/compare_file.c @@ -22,6 +22,49 @@ #include #include #include +#include + + +char *Ftypetxt(mode_t st_mode, int flag) +{ + if(S_ISDIR(st_mode)) + return("directory"); + else if(S_ISREG(st_mode)) + return("regular_file"); + else if(S_ISLNK(st_mode)) + return("symbolic_link"); + else if(S_ISBLK(st_mode)) + return("block_device"); + else if(S_ISCHR(st_mode)) + return("char_device"); + else if(S_ISFIFO(st_mode)) + return("name_pipe"); + else if(S_ISSOCK(st_mode)) + return("unix_socket"); + return("unknown"); +} + + +char *Ftimetxt(time_t t, char timetext[40], int flag) +{ + char *rpt; + struct tm tms, *tmpt; + static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + + tmpt= localtime_r(&t, &tms); + rpt= timetext; + rpt[0]= 0; + if(tmpt==0) + sprintf(rpt+strlen(rpt), "%12.f", (double) t); + else if(time(NULL)-t < 180*86400 && time(NULL)-t >= 0) + sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d", + months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min); + else + sprintf(rpt+strlen(rpt), "%3s %2d %4.4d", + months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year); + return(timetext); +} /* @param flag bit0= compare atime @@ -31,7 +74,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) { struct stat s1, s2; int ret, differs= 0, r1, r2, fd1= -1, fd2= -1, i, done; - char buf1[4096], buf2[4096], a[4096]; + char buf1[4096], buf2[4096], a[4096], ttx1[40], ttx2[40]; off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1; ret= lstat(adr1, &s1); @@ -39,22 +82,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) printf("? %s : cannot lstat() : %s\n", adr1, strerror(errno)); return(0); } - if(S_ISDIR(s1.st_mode)) - strcpy(a, "d"); - else if(S_ISREG(s1.st_mode)) - strcpy(a, "-"); - else if(S_ISLNK(s1.st_mode)) - strcpy(a, "l"); - else if(S_ISBLK(s1.st_mode)) - strcpy(a, "b"); - else if(S_ISCHR(s1.st_mode)) - strcpy(a, "c"); - else if(S_ISFIFO(s1.st_mode)) - strcpy(a, "p"); - else if(S_ISSOCK(s1.st_mode)) - strcpy(a, "s"); - else - strcpy(a, "?"); + strcpy(a, Ftypetxt(s1.st_mode, 0)); strcat(a, " "); if(adrc[0]) strcat(a, adrc); @@ -69,47 +97,58 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) /* Attributes */ if(s1.st_mode != s2.st_mode) { - printf("%s : st_mode : %7.7o <> %7.7o\n", a, s1.st_mode, s2.st_mode); + if((s1.st_mode&~S_IFMT)!=(s2.st_mode&~S_IFMT)) + printf("%s : st_mode : %7.7o <> %7.7o\n", a, s1.st_mode, s2.st_mode); + if((s1.st_mode&S_IFMT)!=(s2.st_mode&S_IFMT)) + printf("%s : type : %s <> %s\n", + a, Ftypetxt(s1.st_mode, 0), Ftypetxt(s2.st_mode, 0)); differs= 1; } if(s1.st_uid != s2.st_uid) { - printf("%s : st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid); + printf("%s : st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid); differs= 1; } if(s1.st_gid != s2.st_gid) { - printf("%s : st_gid : %d <> %d\n", a, s1.st_gid, s2.st_gid); + printf("%s : st_gid : %d <> %d\n", a, s1.st_gid, s2.st_gid); differs= 1; } if((S_ISCHR(s1.st_mode) && S_ISCHR(s2.st_mode)) || (S_ISBLK(s1.st_mode) && S_ISBLK(s2.st_mode))) { if(s1.st_rdev != s2.st_rdev) { - printf("%s : %s st_rdev : %lu <> %lu\n", a, + printf("%s : %s st_rdev : %lu <> %lu\n", a, (S_ISCHR(s1.st_mode) ? "S_IFCHR" : "S_IFBLK"), (unsigned long) s1.st_rdev, (unsigned long) s1.st_rdev); differs= 1; } } if(S_ISREG(s2.st_mode) && s1.st_size != s2.st_size) { - printf("%s : st_size : %.f <> %.f\n", - a, (double) s1.st_size, (double) s2.st_size); + printf("%s : st_size : %.f <> %.f diff= %.f\n", + a, (double) s1.st_size, (double) s2.st_size, + ((double) s1.st_size) - (double) s2.st_size); differs= 1; } if(s1.st_mtime != s2.st_mtime) { - printf("%s : st_mtime : %u <> %u\n", - a, (unsigned int) s1.st_mtime, (unsigned int) s2.st_mtime); + printf("%s : st_mtime : %s <> %s diff= %.f s\n", + a, Ftimetxt(s1.st_mtime, ttx1, 0), + Ftimetxt(s2.st_mtime, ttx2, 0), + ((double) s1.st_mtime) - (double) s2.st_mtime); differs= 1; } if(flag&1) { if(s1.st_atime != s2.st_atime) { - printf("%s : st_atime : %u <> %u\n", - a, (unsigned int) s1.st_atime, (unsigned int) s2.st_atime); + printf("%s : st_atime : %s <> %s diff= %.f s\n", + a, Ftimetxt(s1.st_atime, ttx1, 0), + Ftimetxt(s2.st_atime, ttx2, 0), + ((double) s1.st_atime) - (double) s2.st_atime); differs= 1; } } if(flag&2) { if(s1.st_ctime != s2.st_ctime) { - printf("%s : st_ctime : %u <> %u\n", - a, (unsigned int) s1.st_ctime, (unsigned int) s2.st_ctime); + printf("%s : st_ctime : %s <> %s diff= %.f s\n", + a, Ftimetxt(s1.st_ctime, ttx1, 0), + Ftimetxt(s2.st_ctime, ttx2, 0), + ((double) s1.st_ctime) - (double) s2.st_ctime); differs= 1; } } @@ -169,7 +208,7 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag) if(diffcount>0 || r1count!=r2count) { if(first_diff<0) first_diff= (r1count>r2count ? r2count : r1count); - printf("%s : %s : differs by at least %.f bytes. First at %.f\n", a, + printf("%s : %s : differs by at least %.f bytes. First at %.f\n", a, (s1.st_mtime==s2.st_mtime ? "CONTENT":"content"), (double) (diffcount + abs(r1count-r2count)), (double) first_diff); differs= 1;