#include "rsync.h"
-extern int verbose;
extern int am_root;
extern int preserve_acls;
extern int preserve_xattrs;
while (1) {
if (do_rename(fname, fnamebak) == 0) {
- if (verbose > 1) {
+ if (INFO_GTE(BACKUP, 1)) {
rprintf(FINFO, "backed up %s to %s\n",
fname, fnamebak);
}
/* robustly move a file, creating new directory structures if necessary */
static int robust_move(const char *src, char *dst)
{
- if (robust_rename(src, dst, NULL, 0755) < 0
- && (errno != ENOENT || make_bak_dir(dst) < 0
- || robust_rename(src, dst, NULL, 0755) < 0))
- return -1;
+ if (robust_rename(src, dst, NULL, 0755) < 0) {
+ int save_errno = errno ? errno : EINVAL; /* 0 paranoia */
+ if (errno == ENOENT && make_bak_dir(dst) == 0) {
+ if (robust_rename(src, dst, NULL, 0755) < 0)
+ save_errno = errno ? errno : save_errno;
+ else
+ save_errno = 0;
+ }
+ if (save_errno) {
+ errno = save_errno;
+ return -1;
+ }
+ }
return 0;
}
stat_x sx;
struct file_struct *file;
char *buf;
+ int save_preserve_xattrs = preserve_xattrs;
int kept = 0;
int ret_code;
/* 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
- && (errno != ENOENT || make_bak_dir(buf) < 0
- || do_mknod(buf, file->mode, rdev) < 0)) {
- rsyserr(FERROR, errno, "mknod %s failed",
- full_fname(buf));
- } else if (verbose > 2) {
+ 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, sx.st.st_rdev) < 0)
+ save_errno = errno ? errno : save_errno;
+ else
+ save_errno = 0;
+ }
+ if (save_errno) {
+ rsyserr(FERROR, save_errno, "mknod %s failed",
+ full_fname(buf));
+ }
+ } else
+ save_errno = 0;
+ if (DEBUG_GTE(BACKUP, 1) && save_errno == 0) {
rprintf(FINFO, "make_backup: DEVICE %s successful.\n",
fname);
}
if (!kept && S_ISDIR(file->mode)) {
/* make an empty directory */
- if (do_mkdir(buf, file->mode) < 0
- && (errno != ENOENT || make_bak_dir(buf) < 0
- || do_mkdir(buf, file->mode) < 0)) {
- rsyserr(FINFO, errno, "mkdir %s failed",
- full_fname(buf));
+ if (do_mkdir(buf, file->mode) < 0) {
+ int save_errno = errno ? errno : EINVAL; /* 0 paranoia */
+ if (errno == ENOENT && make_bak_dir(buf) == 0) {
+ if (do_mkdir(buf, file->mode) < 0)
+ save_errno = errno ? errno : save_errno;
+ else
+ save_errno = 0;
+ }
+ if (save_errno) {
+ rsyserr(FINFO, save_errno, "mkdir %s failed",
+ full_fname(buf));
+ }
}
ret_code = do_rmdir(fname);
- if (verbose > 2) {
+ if (DEBUG_GTE(BACKUP, 1)) {
rprintf(FINFO, "make_backup: RMDIR %s returns %i\n",
full_fname(fname), ret_code);
}
if (!kept && preserve_links && S_ISLNK(file->mode)) {
const char *sl = F_SYMLINK(file);
if (safe_symlinks && unsafe_symlink(sl, buf)) {
- if (verbose) {
+ if (INFO_GTE(SYMSAFE, 1)) {
rprintf(FINFO, "ignoring unsafe symlink %s -> %s\n",
full_fname(buf), sl);
}
kept = 1;
} else {
do_unlink(buf);
- if (do_symlink(sl, buf) < 0
- && (errno != ENOENT || make_bak_dir(buf) < 0
- || do_symlink(sl, buf) < 0)) {
- rsyserr(FERROR, errno, "link %s -> \"%s\"",
- full_fname(buf), sl);
+ if (do_symlink(sl, buf) < 0) {
+ int save_errno = errno ? errno : EINVAL; /* 0 paranoia */
+ if (errno == ENOENT && make_bak_dir(buf) == 0) {
+ if (do_symlink(sl, buf) < 0)
+ save_errno = errno ? errno : save_errno;
+ else
+ save_errno = 0;
+ }
+ if (save_errno) {
+ rsyserr(FERROR, save_errno, "link %s -> \"%s\"",
+ full_fname(buf), sl);
+ }
}
do_unlink(fname);
kept = 1;
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) {
+ if (INFO_GTE(BACKUP, 1)) {
rprintf(FINFO, "backed up %s to %s\n",
fname, buf);
}