rprintf(FINFO, " \r");
}
-int unchanged_attrs(const char *fname, struct file_struct *file, statx *sxp)
+int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
{
if (preserve_perms && !BITS_EQUAL(sxp->st.st_mode, file->mode, CHMOD_BITS))
return 0;
}
void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statret,
- statx *sxp, int32 iflags, uchar fnamecmp_type,
+ stat_x *sxp, int32 iflags, uchar fnamecmp_type,
const char *xname)
{
if (statret >= 0) { /* A from-dest-dir statret can == 1! */
* handling the file, -1 if no dest-linking occurred, or a non-negative
* value if we found an alternate basis file. */
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
- char *cmpbuf, statx *sxp, int itemizing,
+ char *cmpbuf, stat_x *sxp, int itemizing,
enum logcode code)
{
int best_match = -1;
#ifdef SUPPORT_HARD_LINKS
try_a_copy: /* Copy the file locally. */
#endif
- if (copy_file(cmpbuf, fname, file->mode) < 0) {
+ if (copy_file(cmpbuf, fname, file->mode, 0) < 0) {
if (verbose) {
rsyserr(FINFO, errno, "copy_file %s => %s",
full_fname(cmpbuf), fname);
* handling the file, or -1 if no dest-linking occurred, or a non-negative
* value if we found an alternate basis file. */
static int try_dests_non(struct file_struct *file, char *fname, int ndx,
- char *cmpbuf, statx *sxp, int itemizing,
+ char *cmpbuf, stat_x *sxp, int itemizing,
enum logcode code)
{
char lnk[MAXPATHLEN];
static int need_fuzzy_dirlist = 0;
struct file_struct *fuzzy_file = NULL;
int fd = -1, f_copy = -1;
- statx sx, real_sx;
+ stat_x sx, real_sx;
STRUCT_STAT partial_st;
struct file_struct *back_file = NULL;
int statret, real_ret, stat_errno;
rprintf(FINFO, "recv_generator(%s,%d)\n", fname, ndx);
if (list_only) {
- if (S_ISDIR(file->mode)
+ if (S_ISDIR(file->mode) && inc_recurse
&& ((!implied_dirs && !(file->flags & FLAG_XFER_DIR))
- || (inc_recurse && ndx != cur_flist->ndx_start - 1)))
+ || ndx != cur_flist->ndx_start - 1))
return;
list_file_entry(file);
return;
}
if (S_ISDIR(file->mode)) {
- if (!implied_dirs && !(file->flags & FLAG_XFER_DIR))
+ if (inc_recurse && !implied_dirs && !(file->flags & FLAG_XFER_DIR))
goto cleanup;
if (inc_recurse && ndx != cur_flist->ndx_start - 1) {
/* In inc_recurse mode we want ot make sure any missing
statret = 0;
}
- if (!do_xfers || read_batch || whole_file)
+ if (!do_xfers)
goto notify_others;
+ if (read_batch || whole_file) {
+ if (inplace && make_backups > 0 && fnamecmp_type == FNAMECMP_FNAME) {
+ if (!(backupptr = get_backup_name(fname)))
+ goto cleanup;
+ if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS)))
+ goto pretend_missing;
+ if (copy_file(fname, backupptr, back_file->mode, 1) < 0) {
+ unmake_file(back_file);
+ back_file = NULL;
+ goto cleanup;
+ }
+ }
+ goto notify_others;
+ }
+
if (fuzzy_dirlist) {
int j = flist_find(fuzzy_dirlist, file);
if (j >= 0) /* don't use changing file as future fuzzy basis */
}
/* open the file */
- fd = do_open(fnamecmp, O_RDONLY, 0);
-
- if (fd == -1) {
+ if ((fd = do_open(fnamecmp, O_RDONLY, 0)) < 0) {
rsyserr(FERROR, errno, "failed to open %s, continuing",
full_fname(fnamecmp));
pretend_missing:
rsyserr(FERROR, errno, "unlink %s",
full_fname(backupptr));
unmake_file(back_file);
+ back_file = NULL;
close(fd);
goto cleanup;
}
- if ((f_copy = do_open(backupptr,
- O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) {
+ if ((f_copy = do_open(backupptr, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0
+ && (errno != ENOENT || make_bak_dir(backupptr) < 0
+ || (f_copy = do_open(backupptr, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0)) {
rsyserr(FERROR, errno, "open %s",
full_fname(backupptr));
unmake_file(back_file);
+ back_file = NULL;
close(fd);
goto cleanup;
}
if (read_batch)
goto cleanup;
- if (statret != 0 || whole_file) {
+ if (statret != 0 || whole_file)
write_sum_head(f_out, NULL);
- goto cleanup;
+ else {
+ generate_and_send_sums(fd, sx.st.st_size, f_out, f_copy);
+ close(fd);
}
- generate_and_send_sums(fd, sx.st.st_size, f_out, f_copy);
-
- if (f_copy >= 0) {
- close(f_copy);
+ cleanup:
+ if (back_file) {
+ if (f_copy >= 0)
+ close(f_copy);
set_file_attrs(backupptr, back_file, NULL, NULL, 0);
if (verbose > 1) {
rprintf(FINFO, "backed up %s to %s\n",
unmake_file(back_file);
}
- close(fd);
-
- cleanup:
#ifdef SUPPORT_ACLS
if (preserve_acls)
free_acl(&sx);
for (i = start; i <= end; i++, counter++) {
file = flist->files[i];
if (!S_ISDIR(file->mode)
- || (relative_paths && !implied_dirs && !(file->flags & FLAG_XFER_DIR)))
+ || (inc_recurse && !implied_dirs && !(file->flags & FLAG_XFER_DIR)))
continue;
if (verbose > 3) {
fname = f_name(file, NULL);