From 53dd3135f13728fbcfce4c85773d9fc97cfce714 Mon Sep 17 00:00:00 2001 From: David Dykstra Date: Tue, 24 Nov 1998 19:01:24 +0000 Subject: [PATCH] Backup deleted files when using --delete and --backup. Based on a suggested patch from Kanai Makoto (kanai@hallab.co.jp). --- receiver.c | 13 +++++++++++-- rsync.c | 34 ++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/receiver.c b/receiver.c index 9701303b..e7a164b9 100644 --- a/receiver.c +++ b/receiver.c @@ -33,6 +33,8 @@ extern int cvs_exclude; extern int io_error; extern char *tmpdir; extern char *compare_dest; +extern int make_backups; +extern char *backup_suffix; static struct delete_list { @@ -139,8 +141,15 @@ static void delete_files(struct file_list *flist) S_ISDIR(local_file_list->files[i]->mode)) add_delete_entry(local_file_list->files[i]); if (-1 == flist_find(flist,local_file_list->files[i])) { - delete_one(local_file_list->files[i]); - } + char *f = f_name(local_file_list->files[i]); + int k = strlen(f) - strlen(backup_suffix); + if (make_backups && ((k <= 0) || + (strcmp(f+k,backup_suffix) != 0))) { + (void) make_backup(f); + } else { + delete_one(local_file_list->files[i]); + } + } } flist_free(local_file_list); free(name); diff --git a/rsync.c b/rsync.c index 0f8d33b4..0bb9f743 100644 --- a/rsync.c +++ b/rsync.c @@ -191,23 +191,33 @@ void sig_int(void) exit_cleanup(RERR_SIGNAL); } +int make_backup(char *fname) +{ + char fnamebak[MAXPATHLEN]; + if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) { + rprintf(FERROR,"backup filename too long\n"); + return 0; + } + + slprintf(fnamebak,sizeof(fnamebak)-1,"%s%s",fname,backup_suffix); + if (do_rename(fname,fnamebak) != 0) { + if (errno != ENOENT) { + rprintf(FERROR,"rename %s %s : s\n",fname,fnamebak,strerror(errno)); + return 0; + } + } else if (verbose > 1) { + rprintf(FINFO,"backed up %s to %s\n",fname,fnamebak); + } + return 1; +} + /* finish off a file transfer, renaming the file and setting the permissions and ownership */ void finish_transfer(char *fname, char *fnametmp, struct file_struct *file) { - if (make_backups) { - char fnamebak[MAXPATHLEN]; - if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) { - rprintf(FERROR,"backup filename too long\n"); - return; - } - slprintf(fnamebak,sizeof(fnamebak),"%s%s",fname,backup_suffix); - if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) { - rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno)); - return; - } - } + if (make_backups && !make_backup(fname)) + return; /* move tmp file over real file */ if (do_rename(fnametmp,fname) != 0) { -- 2.34.1