X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f1ca7c4429f2a8e9de72f91d95218bb324df6a9e..b3bf9b9df95137a3a43248be9599d919b04877af:/backup.c diff --git a/backup.c b/backup.c index 22cfc712..8907b25d 100644 --- a/backup.c +++ b/backup.c @@ -2,7 +2,7 @@ * Backup handling code. * * Copyright (C) 1999 Andrew Tridgell - * Copyright (C) 2003-2008 Wayne Davison + * Copyright (C) 2003-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +19,8 @@ */ #include "rsync.h" +#include "ifuncs.h" -extern int verbose; extern int am_root; extern int preserve_acls; extern int preserve_xattrs; @@ -62,7 +62,7 @@ static int make_simple_backup(const char *fname) 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); } @@ -132,17 +132,12 @@ int make_bak_dir(const char *fullpath) if (p >= rel) { /* Try to transfer the directory settings of the * actual dir that the files are coming from. */ + init_stat_x(&sx); if (x_stat(rel, &sx.st, NULL) < 0) { rsyserr(FERROR, errno, "make_bak_dir stat %s failed", full_fname(rel)); } else { -#ifdef SUPPORT_ACLS - sx.acc_acl = sx.def_acl = NULL; -#endif -#ifdef SUPPORT_XATTRS - sx.xattr = NULL; -#endif if (!(file = make_file(rel, NULL, NULL, 0, NO_FILTERS))) continue; #ifdef SUPPORT_ACLS @@ -204,18 +199,14 @@ 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; - /* return if no file to keep */ + init_stat_x(&sx); + /* Return success if no file to keep. */ if (x_lstat(fname, &sx.st, NULL) < 0) return 1; -#ifdef SUPPORT_ACLS - sx.acc_acl = sx.def_acl = NULL; -#endif -#ifdef SUPPORT_XATTRS - sx.xattr = NULL; -#endif if (!(file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) return 1; /* the file could have disappeared */ @@ -243,13 +234,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 +248,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 (DEBUG_GTE(BACKUP, 1) && save_errno == 0) { rprintf(FINFO, "make_backup: DEVICE %s successful.\n", fname); } @@ -283,7 +275,7 @@ static int keep_backup(const char *fname) } 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); } @@ -294,7 +286,7 @@ static int keep_backup(const char *fname) 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); } @@ -338,10 +330,12 @@ 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) { + if (INFO_GTE(BACKUP, 1)) { rprintf(FINFO, "backed up %s to %s\n", fname, buf); }