X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/baf3e5049e43659e24735bf893e4726f9074512a..896bd482c0c87d11e19f9bcffbcb35c6aba00e43:/rsync.c diff --git a/rsync.c b/rsync.c index 614e0c58..3f79f504 100644 --- a/rsync.c +++ b/rsync.c @@ -149,8 +149,8 @@ int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st, ((am_root && preserve_uid && st->st_uid != file->uid) || (preserve_gid && st->st_gid != file->gid))) { if (do_lchown(fname, - (am_root&&preserve_uid)?file->uid:-1, - preserve_gid?file->gid:-1) != 0) { + (am_root&&preserve_uid)?file->uid:st->st_uid, + preserve_gid?file->gid:st->st_gid) != 0) { if (preserve_uid && st->st_uid != file->uid) updated = 1; if (verbose>1 || preserve_uid) { @@ -191,24 +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),"%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) { -rprintf(FINFO,"finish_transfer(%s,%s)\n",fname,fnametmp); - 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) {