X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fextract.c;h=3c35d80cec8630c14bd3299c6c4384fcb8f71830;hb=63db9071d21b749f6883346cdea820aa3426c422;hp=7f4628f93a2d9ac5aebf3a4722f20963d2cd3f47;hpb=8267e6ed02aea41ef334fcff84722fa0eacc0ecf;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 7f4628f..3c35d80 100644 --- a/src/extract.c +++ b/src/extract.c @@ -972,15 +972,19 @@ extract_archive (void) && (base_name (CURRENT_FILE_NAME) == CURRENT_FILE_NAME + h->file_name_len + 1)) { - h->after_symlinks = 1; - - if (stat (h->file_name, &st) != 0) - stat_error (h->file_name); - else + do { - h->stat_info.st_dev = st.st_dev; - h->stat_info.st_ino = st.st_ino; + h->after_symlinks = 1; + + if (stat (h->file_name, &st) != 0) + stat_error (h->file_name); + else + { + h->stat_info.st_dev = st.st_dev; + h->stat_info.st_ino = st.st_ino; + } } + while ((h = h->next) && ! h->after_symlinks); } status = 0; @@ -1144,7 +1148,9 @@ extract_archive (void) if (status != 0) { if (errno == EEXIST - && (interdir_made || old_files_option == OVERWRITE_OLD_FILES)) + && (interdir_made + || old_files_option == OVERWRITE_OLD_DIRS + || old_files_option == OVERWRITE_OLD_FILES)) { struct stat st; if (stat (CURRENT_FILE_NAME, &st) == 0) @@ -1177,6 +1183,7 @@ extract_archive (void) directory_exists: if (status == 0 + || old_files_option == OVERWRITE_OLD_DIRS || old_files_option == OVERWRITE_OLD_FILES) delay_set_stat (CURRENT_FILE_NAME, ¤t_stat, MODE_RWX & (mode ^ current_stat.st_mode),