- 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].basename && hlink_list[i-1].basename &&
- 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(f_name(&hlink_list[i-1]),&st1) != 0) continue;
- 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)
- fprintf(FINFO,"link %s => %s : %s\n",
- f_name(&hlink_list[i]),
- f_name(&hlink_list[i-1]),strerror(errno));
- continue;
- }
- } else {
- if (st2.st_dev == st1.st_dev && st2.st_ino == st1.st_ino) continue;
-
- if (do_unlink(f_name(&hlink_list[i])) != 0 ||
- do_link(f_name(&hlink_list[i-1]),f_name(&hlink_list[i])) != 0) {
- if (verbose > 0)
- fprintf(FINFO,"link %s => %s : %s\n",
- f_name(&hlink_list[i]),
- f_name(&hlink_list[i-1]),strerror(errno));
- continue;
+ struct file_struct *file;
+ char hlink1[MAXPATHLEN];
+ char *hlink2;
+ STRUCT_STAT st1, st2;
+ int i;
+
+ if (!hlink_list)
+ return;
+
+ for (i = 0; i < hlink_count; i++) {
+ file = hlink_list[i];
+ if (link_stat(f_name_to(file, hlink1), &st1) != 0)
+ continue;
+ while ((file = file->F_NEXT) != NULL) {
+ hlink2 = f_name(file);
+ if (link_stat(hlink2, &st2) == 0) {
+ if (st2.st_dev == st1.st_dev
+ && st2.st_ino == st1.st_ino)
+ continue;
+ if (robust_unlink(hlink2)) {
+ if (verbose > 0) {
+ rprintf(FINFO,
+ "unlink %s failed: %s\n",
+ full_fname(hlink2),
+ strerror(errno));
+ }
+ continue;
+ }
+ }
+ hard_link_one(hlink1, hlink2);
+ }