From 0a3a9744f771daf0331e0c6d7c2facb1c53f3406 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 10 Jul 2004 06:13:28 +0000 Subject: [PATCH] (extract_archive): Do not report an error when hard-linking X to X when X exists. --- src/extract.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/extract.c b/src/extract.c index 65b9a35..49ed029 100644 --- a/src/extract.c +++ b/src/extract.c @@ -925,11 +925,12 @@ extract_archive (void) /* MSDOS does not implement links. However, djgpp's link() actually copies the file. */ status = link (link_name, file_name); + e = errno; if (status == 0) { struct delayed_symlink *ds = delayed_symlink_head; - if (ds && stat (link_name, &st1) == 0) + if (ds && lstat (link_name, &st1) == 0) for (; ds; ds = ds->next) if (ds->dev == st1.st_dev && ds->ino == st1.st_ino @@ -945,17 +946,20 @@ extract_archive (void) } break; } + + if ((e == EEXIST && strcmp (link_name, file_name) == 0) + || (lstat (link_name, &st1) == 0 + && lstat (file_name, &st2) == 0 + && st1.st_dev == st2.st_dev + && st1.st_ino == st2.st_ino)) + break; + + errno = e; if (maybe_recoverable (file_name, &interdir_made)) goto again_link; if (incremental_option && errno == EEXIST) break; - e = errno; - if (stat (link_name, &st1) == 0 - && stat (file_name, &st2) == 0 - && st1.st_dev == st2.st_dev - && st1.st_ino == st2.st_ino) - break; link_error (link_name, file_name); if (backup_option) -- 2.44.0