- int i;
-
- if (!hlink_list) return;
-
- for (i=1;i<hlink_count;i++) {
- if (S_ISREG(hlink_list[i].mode) &&
- S_ISREG(hlink_list[i-1].mode) &&
- hlink_list[i].name && hlink_list[i-1].name &&
- hlink_list[i].dev == hlink_list[i-1].dev &&
- hlink_list[i].inode == hlink_list[i-1].inode) {
- struct stat st1,st2;
-
- if (link_stat(hlink_list[i-1].name,&st1) != 0) continue;
- if (link_stat(hlink_list[i].name,&st2) != 0) {
- if (!dry_run && link(hlink_list[i-1].name,hlink_list[i].name) != 0) {
- if (verbose > 0)
- fprintf(FINFO,"link %s => %s : %s\n",
- hlink_list[i].name,
- hlink_list[i-1].name,strerror(errno));
- continue;
+static void hard_link_one(int i)
+{
+ STRUCT_STAT st1, st2;
+
+ if (link_stat(f_name(&hlink_list[i - 1]), &st1) != 0)
+ return;
+
+ if (link_stat(f_name(&hlink_list[i]), &st2) != 0) {
+ if (do_link
+ (f_name(&hlink_list[i - 1]),
+ f_name(&hlink_list[i])) != 0) {
+ if (verbose > 0)
+ rprintf(FINFO, "link %s => %s : %s\n",
+ f_name(&hlink_list[i]),
+ f_name(&hlink_list[i - 1]),
+ strerror(errno));
+ return;
+ }
+ } else {
+ if (st2.st_dev == st1.st_dev && st2.st_ino == st1.st_ino)
+ return;
+
+ if (robust_unlink(f_name(&hlink_list[i])) != 0 ||
+ do_link(f_name(&hlink_list[i - 1]),
+ f_name(&hlink_list[i])) != 0) {
+ if (verbose > 0)
+ rprintf(FINFO, "link %s => %s : %s\n",
+ f_name(&hlink_list[i]),
+ f_name(&hlink_list[i - 1]),
+ strerror(errno));
+ return;
+ }