return 0;
case DEFAULT_OLD_FILES:
+ case OVERWRITE_OLD_DIRS:
case OVERWRITE_OLD_FILES:
{
int r = remove_any_file (file_name, 0);
{
struct delayed_set_stat *data = delayed_set_stat_head;
bool skip_this_one = 0;
- check_for_renamed_directories |= data->after_symlinks;
struct stat st;
struct stat const *current_stat_info = 0;
+ check_for_renamed_directories |= data->after_symlinks;
+
if (after_symlinks < data->after_symlinks
|| (data->file_name_len < file_name_len
&& file_name[data->file_name_len]
&& (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;
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)
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),