-/* Compares two mounted NTFS filesystems. */
+/*
+ * A program to compare two mounted NTFS filesystems.
+ */
#include <stdarg.h>
#include <stdio.h>
exit(2);
}
+/* This is just a binary tree that maps inode numbers in one NTFS tree to inode
+ * numbers in the other NTFS tree. This is so we can tell if the hard link
+ * groups are the same between the two NTFS trees. */
struct node {
u64 ino_from;
u64 ino_to;
}
+/* Compares the "normal" contents of two files of size @size. */
static void cmp(const char *file1, const char *file2, size_t size)
{
int fd1, fd2;
close(fd2);
}
+/* Compares an extended attribute of the files. */
static void cmp_xattr(const char *file1, const char *file2,
const char *xattr_name, ssize_t max_size,
bool missingok)
if (errno == ENOATTR)
return;
else
- error("xattr `%s' exists on file `%s' "
+ difference("xattr `%s' exists on file `%s' "
"but not on file `%s'",
xattr_name, file1, file2);
} else {
free(buf2);
}
+/* Compares all alternate data streams of the files */
static void cmp_ads(const char *file1, const char *file2)
{
char _list1[256], _list2[sizeof(_list1)];
pe = list1 + len1 - 1;
while (p < pe) {
cmp_xattr(file1, file2, p, 0, false);
- p += strlen(p);
+ p += strlen(p) + 1;
}
if (list1 != _list1) {
free(list1);
}
}
+/* Compares special NTFS data of the files, as accessed through extended
+ * attributes. */
static void special_cmp(const char *file1, const char *file2)
{
cmp_xattr(file1, file2, "system.ntfs_acl", 0, false);
}
+/* Compares file1 on one NTFS volume to file2 on another NTFS volume. */
static void ntfs_cmp(char file1[], int file1_len, char file2[], int file2_len)
{
struct stat st1, st2;
if ! imagex apply ntfs.wim 1 out.ntfs; then
error "Failed to apply WIM to NTFS volume"
fi
- __do_mount in.ntfs in.mnt
- __do_mount out.ntfs out.mnt
- ./ntfs-cmp in.mnt out.mnt
+ __do_mount in.ntfs in.mnt noatime
+ __do_mount out.ntfs out.mnt noatime
+ if [ -x /usr/bin/tree ]; then
+ tree in.mnt --inodes -F -s --noreport
+ fi
+ if ! ./ntfs-cmp in.mnt out.mnt; then
+ if [ -x /usr/bin/tree ]; then
+ echo "Dumping tree of applied image"
+ tree out.mnt --inodes -F -s --noreport
+ error 'Information was lost or corrupted while capturing
+ and then applying a NTFS volume'
+ fi
+ fi
rm -rf out.mnt/* in.mnt/*
__do_unmount out.mnt
}
do_test 'mkdir dir;
echo 888 > dir/file;
echo 888 > dir/idfile2;
- ln -s dir dir/circle; ln -s file dir/filelink'
+ ln -s ../dir dir/circle; ln -s file dir/filelink'
msg "NTFS volume containing hard link group and identical files not hard linked"
do_test 'echo 888 > file;
do_test 'echo 1 > file;
setfattr -n user.ads -v 2 file'
+msg "NTFS volume containing file with multiple named data streams"
+do_test 'echo 1 > file;
+ setfattr -n user.a -v 1 file;
+ setfattr -n user.aa -v 11 file;
+ setfattr -n user.aaa -v 111 file;
+ setfattr -n user.aaaa -v 1111 file'
+
+msg "NTFS volume containing file with multiple named data streams with same contents"
+do_test 'echo 1 > file;
+ setfattr -n user.a -v 1111 file;
+ setfattr -n user.aa -v 1111 file;
+ setfattr -n user.aaa -v 1111 file;
+ setfattr -n user.aaaa -v 1111 file;'
+msg "NTFS volume containing file with named data streams with same contents as other file"
+do_test 'echo -n > file;
+ setfattr -n user.a -v 1111 file;
+ echo -n 1111 > otherfile;'
+msg "NTFS volume containing file with empty named data stream and non-empty unnamed data stream"
+do_test 'echo 1 > file;
+ setfattr -n user.ads -v "" file;'
+
+msg "NTFS volume containing file with empty named data stream and empty unnamed data stream"
+do_test 'echo -n > file;
+ setfattr -n user.ads -v "" file;'
+
+msg "NTFS volume containing file with named data stream with hardlink"
+do_test 'echo 999 > file;
+ setfattr -n user.ads -v "888" file;
+ ln file link;'
+
+msg "NTFS volume containing file with named data stream with hardlink and DOS name"
+do_test 'echo 999 > file;
+ setfattr -n user.ads -v "888" file;
+ ln file link;
+ setfattr -v DOSNAME -n system.ntfs_dos_name file;'