9
0
Fork 0

libfile: add compare_file function

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2014-10-08 14:11:55 +02:00
parent a3993a38da
commit 6cf5b986d9
2 changed files with 73 additions and 0 deletions

View File

@ -15,4 +15,6 @@ int write_file(const char *filename, void *buf, size_t size);
int copy_file(const char *src, const char *dst, int verbose);
int compare_file(const char *f1, const char *f2);
#endif /* __LIBFILE_H */

View File

@ -331,3 +331,74 @@ out:
return ret;
}
EXPORT_SYMBOL(copy_file);
/**
* compare_file - Compare two files
* @f1: The first file
* @f2: The second file
*
* Return: 0 if both files are identical, 1 if they differ,
* a negative error code if some error occured
*/
int compare_file(const char *f1, const char *f2)
{
int fd1, fd2, ret;
struct stat s1, s2;
void *buf1, *buf2;
loff_t left;
fd1 = open(f1, O_RDONLY);
if (fd1 < 0)
return -errno;
fd2 = open(f2, O_RDONLY);
if (fd2 < 0) {
ret = -errno;
goto err_out1;
}
ret = fstat(fd1, &s1);
if (ret)
goto err_out2;
ret = fstat(fd2, &s2);
if (ret)
goto err_out2;
if (s1.st_size != s2.st_size)
return 1;
buf1 = xmalloc(RW_BUF_SIZE);
buf2 = xmalloc(RW_BUF_SIZE);
left = s1.st_size;
while (left) {
loff_t now = min(left, (loff_t)RW_BUF_SIZE);
ret = read_full(fd1, buf1, now);
if (ret < 0)
goto err_out3;
ret = read_full(fd2, buf2, now);
if (ret < 0)
goto err_out3;
if (memcmp(buf1, buf2, now)) {
ret = 1;
goto err_out3;
}
left -= now;
}
ret = 0;
err_out3:
free(buf1);
free(buf2);
err_out2:
close(fd2);
err_out1:
close(fd1);
return ret;
}