$NetBSD: patch-ab,v 1.1.1.1 2004/04/17 13:21:48 minskim Exp $ --- same.c.orig 2000-10-16 10:04:15.000000000 +0200 +++ same.c 2004-01-31 20:14:29.000000000 +0100 @@ -143,6 +143,9 @@ dev_t device; ino_t inode; nlink_t nlink; + mode_t mode; + uid_t owner; + gid_t group; long crc; struct inode_entry *next; struct name_entry *names; @@ -254,11 +257,19 @@ fprintf(stderr, "%-60s: %10.2f s\n", "*** Total execution time ***", (double)total_time/CLK_TCK); fputs("Statistics:\n", stderr); - fprintf(stderr, " Merged %lu hard links\n", stat_merge); - fprintf(stderr, " Calculated %lu CRCs\n", stat_crc); - fprintf(stderr, " Compared %lu files\n", stat_cmp); - fprintf(stderr, " Linked %lu names for %lu identical files\n", - stat_link_name, stat_link_inode); + if (o_dryrun) { + fprintf(stderr, " Would have merged %lu hard links\n", stat_merge); + fprintf(stderr, " Calculated %lu CRCs\n", stat_crc); + fprintf(stderr, " Compared %lu files\n", stat_cmp); + fprintf(stderr, " Would have linked %lu names for %lu identical files\n", + stat_link_name, stat_link_inode); + } else { + fprintf(stderr, " Merged %lu hard links\n", stat_merge); + fprintf(stderr, " Calculated %lu CRCs\n", stat_crc); + fprintf(stderr, " Compared %lu files\n", stat_cmp); + fprintf(stderr, " Linked %lu names for %lu identical files\n", + stat_link_name, stat_link_inode); + } } static void progress(int percent) @@ -292,10 +303,10 @@ { struct name_entry *names; - printf("%sentry %p size %ld device %lx inode %lx nlink %d crc %08lx\n", + printf("%sentry %p size %ld device %lx inode %lx nlink %d mode %06o owner %d group %d crc %08lx\n", indent, entry, (unsigned long)entry->size, (unsigned long)entry->device, (unsigned long)entry->inode, - entry->nlink, entry->crc); + entry->nlink, entry->mode, entry->owner, entry->group, entry->crc); for (names = entry->names; names; names = names->next) printf("%s %s\n", indent, names->name); } @@ -435,6 +446,9 @@ entry1 = entry0->next; while (!stop && entry1) { if ((entry0->size == entry1->size) && + (entry0->mode == entry1->mode) && + (entry0->owner == entry1->owner) && + (entry0->group == entry1->group) && (entry0->size != 0 || o_nullfiles)) { if (entry0->crc == -1) calc_crc(entry0); @@ -474,10 +488,16 @@ { int res = 0; - if (o_debug > 0) - printf("unlink %s\n", name); - if (!o_dryrun && ((res = unlink(name)) == -1)) + if (o_debug > 0) { + if (o_dryrun) { + printf("would unlink %s\n", name); + } else { + printf("unlink %s\n", name); + } + } + if (!o_dryrun && ((res = unlink(name)) == -1)) { fprintf(stderr, "unlink %s: %s\n", name, strerror(errno)); + } return res; } @@ -485,8 +505,13 @@ { int res = 0; - if (o_debug > 0) - printf("link %s %s\n", master, slave); + if (o_debug > 0) { + if (o_dryrun) { + printf("would link %s %s\n", master, slave); + } else { + printf("link %s %s\n", master, slave); + } + } if (!o_dryrun && ((res = link(master, slave)) == -1)) fprintf(stderr, "link %s %s: %s\n", master, slave, strerror(errno)); return res; @@ -496,8 +521,13 @@ { int res = 0; - if (o_debug > 0) - printf("symlink %s %s\n", master, slave); + if (o_debug > 0) { + if (o_dryrun) { + printf("would symlink %s %s\n", master, slave); + } else { + printf("symlink %s %s\n", master, slave); + } + } if (!o_dryrun && ((res = symlink(master, slave)) == -1)) fprintf(stderr, "symlink %s %s: %s\n", master, slave, strerror(errno)); return res; @@ -618,7 +648,7 @@ return NULL; buf[strlen(buf)-1] = '\0'; if (lstat(buf, &sb) < 0) { - fprintf(stderr, "stat %s: %s", buf, strerror(errno)); + fprintf(stderr, "stat %s: %s\n", buf, strerror(errno)); exit (1); } } while (!S_ISREG(sb.st_mode)); @@ -630,6 +660,9 @@ entry->device = sb.st_dev; entry->inode = sb.st_ino; entry->nlink = sb.st_nlink; + entry->mode = sb.st_mode; + entry->owner = sb.st_uid; + entry->group = sb.st_gid; entry->crc = -1; return entry;