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;
extern char *backup_dir;
extern char *log_format;
+extern char *backup_suffix;
+extern int backup_suffix_len;
+
+
+static int is_backup_file(char *fn)
+{
+ int k = strlen(fn) - backup_suffix_len;
+ return k > 0 && strcmp(fn+k, backup_suffix) == 0;
+}
/*
}
+int deletion_count = 0; /* used to implement --max-delete */
+
/*
* delete a file or directory. If force_delete is set then delete
* recursively
STRUCT_STAT st;
int zap_dir;
+ if (max_delete && deletion_count >= max_delete)
+ return -1;
+
if (!S_ISDIR(mode)) {
- if (robust_unlink(fname) == 0) {
+ int ok;
+ if (make_backups && (backup_dir || !is_backup_file(fname)))
+ ok = make_backup(fname);
+ else
+ ok = robust_unlink(fname) == 0;
+ if (ok) {
if ((verbose || log_format) && !(flags & DEL_TERSE))
log_delete(fname, mode);
+ deletion_count++;
return 0;
}
if (errno == ENOENT)
else if (do_rmdir(fname) == 0) {
if ((verbose || log_format) && !(flags & DEL_TERSE))
log_delete(fname, mode);
+ deletion_count++;
return 0;
}
if (errno == ENOENT)
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;
}