Use umask kluge from rsync.fns to try to get rid of a potential
[rsync/rsync.git] / generator.c
index 7636784..c061386 100644 (file)
@@ -150,7 +150,7 @@ static int delete_item(char *fname, int mode, int flags)
                deletion_count--;
                return 0;
        }
-       if (!zap_dir || (errno != ENOTEMPTY && errno != EEXIST)) {
+       if (!zap_dir) {
                rsyserr(FERROR, errno, "delete_file: rmdir %s failed",
                        full_fname(fname));
                return -1;
@@ -169,10 +169,7 @@ static int delete_item(char *fname, int mode, int flags)
                        continue;
 
                f_name_to(fp, buf);
-               if (delete_item(buf, fp->mode, flags & ~DEL_TERSE) != 0) {
-                       flist_free(dirlist);
-                       return -1;
-               }
+               delete_item(buf, fp->mode, flags & ~DEL_TERSE);
        }
        flist_free(dirlist);
 
@@ -260,13 +257,12 @@ static void delete_in_dir(struct file_list *flist, char *fbuf,
         * from the filesystem. */
        for (i = dirlist->count; i--; ) {
                struct file_struct *fp = dirlist->files[i];
-               if (!fp->basename)
+               if (!fp->basename || fp->flags & FLAG_MOUNT_POINT)
                        continue;
                if (flist_find(flist, fp) < 0) {
                        int mode = fp->mode;
                        f_name_to(fp, delbuf);
-                       if (delete_item(delbuf, mode, DEL_FORCE_RECURSE) < 0)
-                               break;
+                       delete_item(delbuf, mode, DEL_FORCE_RECURSE);
                }
        }
 
@@ -327,7 +323,8 @@ void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st,
                            : S_ISDIR(file->mode) ? !omit_dir_times
                            : !S_ISLNK(file->mode);
 
-                       if ((iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !keep_time)
+                       if ((iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !keep_time
+                            && (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
                            || (keep_time && file->modtime != st->st_mtime))
                                iflags |= ITEM_REPORT_TIME;
                        if (preserve_perms && file->mode != st->st_mode)