From e7d13fe532814cc4741066b770a6182b07c2dcc4 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Wed, 28 Jul 2004 10:04:06 +0000 Subject: [PATCH] - Explicitly save the stat()'s errno so that we can be sure we're testing the right thing lower down (and so that future code doesn't always have to remember to save it off and restore it). - Improved a chunk of link_dest code. - Handle the removal of a non-regular file without so much duplicated code. --- generator.c | 61 ++++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/generator.c b/generator.c index b576b138..c1b46a66 100644 --- a/generator.c +++ b/generator.c @@ -262,7 +262,7 @@ static void recv_generator(char *fname, struct file_struct *file, int i, { int fd; STRUCT_STAT st; - int statret; + int statret, stat_errno; char *fnamecmp; char fnamecmpbuf[MAXPATHLEN]; @@ -283,6 +283,7 @@ static void recv_generator(char *fname, struct file_struct *file, int i, } statret = link_stat(fname, &st, keep_dirlinks && S_ISDIR(file->mode)); + stat_errno = errno; if (only_existing && statret == -1 && errno == ENOENT) { /* we only want to update existing files */ @@ -422,57 +423,49 @@ static void recv_generator(char *fname, struct file_struct *file, int i, if (statret == -1 && compare_dest != NULL) { /* try the file at compare_dest instead */ - int saveerrno = errno; pathjoin(fnamecmpbuf, sizeof fnamecmpbuf, compare_dest, fname); - statret = link_stat(fnamecmpbuf, &st, 0); - if (!S_ISREG(st.st_mode)) - statret = -1; - if (statret == -1) - errno = saveerrno; + if (link_stat(fnamecmpbuf, &st, 0) == 0 + && S_ISREG(st.st_mode)) { #if HAVE_LINK - else if (link_dest && !dry_run) { - if (do_link(fnamecmpbuf, fname) != 0) { - if (verbose > 0) { - rsyserr(FINFO, errno, "link %s => %s", - fnamecmpbuf, safe_fname(fname)); + if (link_dest && !dry_run) { + if (do_link(fnamecmpbuf, fname) < 0) { + if (verbose) { + rsyserr(FINFO, errno, + "link %s => %s", + fnamecmpbuf, + safe_fname(fname)); + } + fnamecmp = fnamecmpbuf; } - } - fnamecmp = fnamecmpbuf; - } + } else #endif - else - fnamecmp = fnamecmpbuf; + fnamecmp = fnamecmpbuf; + statret = 0; + } + } + + if (statret == 0 && !S_ISREG(st.st_mode)) { + if (delete_file(fname) != 0) + return; + statret = -1; + stat_errno = ENOENT; } if (statret == -1) { if (preserve_hard_links && hard_link_check(file, HL_SKIP)) return; - if (errno == ENOENT) { + if (stat_errno == ENOENT) { write_int(f_out,i); if (!dry_run && !read_batch) write_sum_head(f_out, NULL); } else if (verbose > 1) { - rsyserr(FERROR, errno, - "recv_generator: failed to open %s", + rsyserr(FERROR, stat_errno, + "recv_generator: failed to stat %s", full_fname(fname)); } return; } - if (!S_ISREG(st.st_mode)) { - if (delete_file(fname) != 0) { - return; - } - - /* now pretend the file didn't exist */ - if (preserve_hard_links && hard_link_check(file, HL_SKIP)) - return; - write_int(f_out,i); - if (!dry_run && !read_batch) - write_sum_head(f_out, NULL); - return; - } - if (opt_ignore_existing && fnamecmp == fname) { if (verbose > 1) rprintf(FINFO, "%s exists\n", safe_fname(fname)); -- 2.34.1