Moved deletion_count here so that we honor --max-delete in
authorWayne Davison <wayned@samba.org>
Sat, 19 Feb 2005 23:24:41 +0000 (23:24 +0000)
committerWayne Davison <wayned@samba.org>
Sat, 19 Feb 2005 23:24:41 +0000 (23:24 +0000)
delete_file().

rsync.c

diff --git a/rsync.c b/rsync.c
index 4bf8b8ab06aa82a68c4eb41819ff9d3491a5be46..408f4716bd160dd6b78b86e154c225b716876ce3 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -36,6 +36,7 @@ extern int preserve_gid;
 extern int force_delete;
 extern int inplace;
 extern int recurse;
+extern int max_delete;
 extern int keep_dirlinks;
 extern int make_backups;
 extern struct stats stats;
@@ -53,6 +54,8 @@ void free_sums(struct sum_struct *s)
 }
 
 
+int deletion_count = 0; /* used to implement --max-delete */
+
 /*
  * delete a file or directory. If force_delete is set then delete
  * recursively
@@ -65,10 +68,14 @@ int delete_file(char *fname, int mode, int flags)
        STRUCT_STAT st;
        int zap_dir;
 
+       if (max_delete && deletion_count >= max_delete)
+               return -1;
+
        if (!S_ISDIR(mode)) {
                if (robust_unlink(fname) == 0) {
                        if ((verbose || log_format) && !(flags & DEL_TERSE))
                                log_delete(fname, mode);
+                       deletion_count++;
                        return 0;
                }
                if (errno == ENOENT)
@@ -85,6 +92,7 @@ int delete_file(char *fname, int mode, int flags)
        else if (do_rmdir(fname) == 0) {
                if ((verbose || log_format) && !(flags & DEL_TERSE))
                        log_delete(fname, mode);
+               deletion_count++;
                return 0;
        }
        if (errno == ENOENT)
@@ -133,11 +141,14 @@ int delete_file(char *fname, int mode, int flags)
 
        closedir(d);
 
+       if (max_delete && deletion_count >= max_delete)
+               return -1;
        if (do_rmdir(fname) != 0 && errno != ENOENT) {
                rsyserr(FERROR, errno, "delete_file: rmdir %s failed",
                        full_fname(fname));
                return -1;
        }
+       deletion_count++;
 
        return 0;
 }