Commit 93e28fbd authored by Wayne Davison's avatar Wayne Davison

Fixed a problem in the backing up of symlinks and devices: we

need to remove any old symlink/device/file to create the backup.
Also fixed a couple minor logic errors in the handling of symlinks
and devices.  NOTE:  the code still doesn't handle the changing of
a name from a dir to a non-dir or visa versa (which is a very old
deficiency in the code).
parent 87a57a30
...@@ -188,18 +188,16 @@ static int keep_backup(char *fname) ...@@ -188,18 +188,16 @@ static int keep_backup(char *fname)
return 0; return 0;
/* Check to see if this is a device file, or link */ /* Check to see if this is a device file, or link */
if (IS_DEVICE(file->mode)) { if (IS_DEVICE(file->mode) && am_root && preserve_devices) {
if (am_root && preserve_devices) { do_unlink(buf);
if (do_mknod(buf, file->mode, file->u.rdev) < 0 if (do_mknod(buf, file->mode, file->u.rdev) < 0
&& (errno != ENOENT || make_bak_dir(buf) < 0 && (errno != ENOENT || make_bak_dir(buf) < 0
|| do_mknod(buf, file->mode, file->u.rdev) < 0)) { || do_mknod(buf, file->mode, file->u.rdev) < 0)) {
rsyserr(FERROR, errno, "mknod %s failed", rsyserr(FERROR, errno, "mknod %s failed",
full_fname(buf)); full_fname(buf));
} else if (verbose > 2) { } else if (verbose > 2) {
rprintf(FINFO, rprintf(FINFO, "make_backup: DEVICE %s successful.\n",
"make_backup: DEVICE %s successful.\n", safe_fname(fname));
safe_fname(fname));
}
} }
kept = 1; kept = 1;
do_unlink(fname); do_unlink(fname);
...@@ -230,15 +228,18 @@ static int keep_backup(char *fname) ...@@ -230,15 +228,18 @@ static int keep_backup(char *fname)
full_fname(buf), file->u.link); full_fname(buf), file->u.link);
} }
kept = 1; kept = 1;
} else {
do_unlink(buf);
if (do_symlink(file->u.link, buf) < 0
&& (errno != ENOENT || make_bak_dir(buf) < 0
|| do_symlink(file->u.link, buf) < 0)) {
rsyserr(FERROR, errno, "link %s -> \"%s\"",
full_fname(buf),
safe_fname(file->u.link));
}
do_unlink(fname);
kept = 1;
} }
if (do_symlink(file->u.link, buf) < 0
&& (errno != ENOENT || make_bak_dir(buf) < 0
|| do_symlink(file->u.link, buf) < 0)) {
rsyserr(FERROR, errno, "link %s -> \"%s\"",
full_fname(buf), safe_fname(file->u.link));
}
do_unlink(fname);
kept = 1;
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment