From 6c9e824ce52554abd04bf4c7f8e20485ccbe2dc4 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 22 Sep 2001 00:47:09 +0000 Subject: [PATCH] (extract_archive): When marking a directory to be updated after symlinks, stat all directories after it in the delayed-set-stat list too, since they will be checked after symlinks. Add support for --overwrite-dir. --- src/extract.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) 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), -- 2.45.2