diff: fix small bug; don't make a copy for "/dev/null" case

This commit is contained in:
Denis Vlasenko 2008-03-24 16:28:47 +00:00
parent 7fe0ebac5f
commit e9d67a81c8

View File

@ -283,7 +283,7 @@ static char *make_temp(FILE *f, struct stat *sb)
char *name; char *name;
int fd; int fd;
if (S_ISREG(sb->st_mode)) if (S_ISREG(sb->st_mode) || S_ISBLK(sb->st_mode))
return NULL; return NULL;
name = xstrdup("/tmp/difXXXXXX"); name = xstrdup("/tmp/difXXXXXX");
fd = mkstemp(name); fd = mkstemp(name);
@ -312,9 +312,15 @@ static NOINLINE int files_differ(FILE *f1, FILE *f2, int flags)
{ {
size_t i, j; size_t i, j;
/* Prevent making copies for "/dev/null" (too common) */
tempname1 = tempname2 = NULL;
if (flags & (D_EMPTY1 | D_EMPTY2)) {
return 1;
}
/* Deal with input from pipes etc */
tempname1 = make_temp(f1, &stb1); tempname1 = make_temp(f1, &stb1);
tempname2 = make_temp(f2, &stb2); tempname2 = make_temp(f2, &stb2);
if ((flags & (D_EMPTY1 | D_EMPTY2)) || stb1.st_size != stb2.st_size) { if (stb1.st_size != stb2.st_size) {
return 1; return 1;
} }
while (1) { while (1) {
@ -631,8 +637,8 @@ static NOINLINE void check(FILE *f1, FILE *f2)
J[i] = 0; J[i] = 0;
if (c != '\n' && c != EOF) if (c != '\n' && c != EOF)
ctold += skipline(f1); ctold += skipline(f1);
// BUG? Should be "if (d != '\n' && d != EOF)" ? /* was buggy? "if (d != '\n' && c != EOF)" */
if (d != '\n' && c != EOF) if (d != '\n' && d != EOF)
ctnew += skipline(f2); ctnew += skipline(f2);
break; break;
} }