X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f1ca7c4429f2a8e9de72f91d95218bb324df6a9e..d1f66d8d796965d90552db75d63bdbbf0b98c3f9:/backup.c diff --git a/backup.c b/backup.c index 22cfc712..934f838d 100644 --- a/backup.c +++ b/backup.c @@ -204,6 +204,7 @@ static int keep_backup(const char *fname) stat_x sx; struct file_struct *file; char *buf; + int save_preserve_xattrs = preserve_xattrs; int kept = 0; int ret_code; @@ -243,13 +244,12 @@ static int keep_backup(const char *fname) /* Check to see if this is a device file, or link */ if ((am_root && preserve_devices && IS_DEVICE(file->mode)) || (preserve_specials && IS_SPECIAL(file->mode))) { - uint32 *devp = F_RDEV_P(file); - dev_t rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp)); + int save_errno; do_unlink(buf); - if (do_mknod(buf, file->mode, rdev) < 0) { - int save_errno = errno ? errno : EINVAL; /* 0 paranoia */ + if (do_mknod(buf, file->mode, sx.st.st_rdev) < 0) { + save_errno = errno ? errno : EINVAL; /* 0 paranoia */ if (errno == ENOENT && make_bak_dir(buf) == 0) { - if (do_mknod(buf, file->mode, rdev) < 0) + if (do_mknod(buf, file->mode, sx.st.st_rdev) < 0) save_errno = errno ? errno : save_errno; else save_errno = 0; @@ -258,7 +258,9 @@ static int keep_backup(const char *fname) rsyserr(FERROR, save_errno, "mknod %s failed", full_fname(buf)); } - } else if (verbose > 2) { + } else + save_errno = 0; + if (verbose > 2 && save_errno == 0) { rprintf(FINFO, "make_backup: DEVICE %s successful.\n", fname); } @@ -338,7 +340,9 @@ static int keep_backup(const char *fname) robust_unlink(fname); /* Just in case... */ } } + preserve_xattrs = 0; set_file_attrs(buf, file, NULL, fname, 0); + preserve_xattrs = save_preserve_xattrs; unmake_file(file); if (verbose > 1) {