X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c4b4df4fb4cc748c1368e0c833dd5415d85071e2..cb7fb45e4269761ad773cf04594a3284ce951b30:/hlink.c diff --git a/hlink.c b/hlink.c index 5a617208..402f6c52 100644 --- a/hlink.c +++ b/hlink.c @@ -29,11 +29,11 @@ static int hlink_compare(struct file_struct **file1, struct file_struct **file2) struct file_struct *f1 = *file1; struct file_struct *f2 = *file2; - if (f1->dev != f2->dev) - return (int) (f1->dev > f2->dev ? 1 : -1); + if (f1->F_DEV != f2->F_DEV) + return (int) (f1->F_DEV > f2->F_DEV ? 1 : -1); - if (f1->inode != f2->inode) - return (int) (f1->inode > f2->inode ? 1 : -1); + if (f1->F_INODE != f2->F_INODE) + return (int) (f1->F_INODE > f2->F_INODE ? 1 : -1); return file_compare(file1, file2); } @@ -62,7 +62,7 @@ void init_hard_links(struct file_list *flist) */ hlink_count = 0; for (i = 0; i < flist->count; i++) { - if (flist->files[i]->flags & HAS_INODE_DATA) + if (flist->files[i]->link_u.idev) hlink_list[hlink_count++] = flist->files[i]; } @@ -86,7 +86,7 @@ int check_hard_link(struct file_struct *file) int low = 0, high = hlink_count - 1; int ret = 0; - if (!hlink_list || !(file->flags & HAS_INODE_DATA)) + if (!hlink_list || !file->link_u.idev) return 0; while (low != high) { @@ -102,14 +102,15 @@ int check_hard_link(struct file_struct *file) low = mid + 1; } - /* XXX: To me this looks kind of dodgy -- why do we use [low] - * here and [low-1] below? -- mbp */ + /* Check if we ended up finding the file struct or not. */ if (hlink_compare(&hlink_list[low], &file) != 0) return 0; + /* Now check if the previous item shares the current one's device + * and inode. If so, we're not the "master", so return 1. */ if (low > 0 && - file->dev == hlink_list[low - 1]->dev && - file->inode == hlink_list[low - 1]->inode) { + file->F_DEV == hlink_list[low - 1]->F_DEV && + file->F_INODE == hlink_list[low - 1]->F_INODE) { if (verbose >= 2) { rprintf(FINFO, "check_hard_link: \"%s\" is a hard link to file %d, \"%s\"\n", f_name(file), low-1, f_name(hlink_list[low-1])); @@ -173,8 +174,8 @@ void do_hard_links(void) for (i = 1; i < hlink_count; i++) { if (hlink_list[i]->basename && hlink_list[i - 1]->basename && - hlink_list[i]->dev == hlink_list[i - 1]->dev && - hlink_list[i]->inode == hlink_list[i - 1]->inode) { + hlink_list[i]->F_DEV == hlink_list[i - 1]->F_DEV && + hlink_list[i]->F_INODE == hlink_list[i - 1]->F_INODE) { hard_link_one(i); } }