summaryrefslogtreecommitdiff
path: root/flist.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2008-03-18 08:43:43 -0700
committerWayne Davison <wayned@samba.org>2008-03-18 09:16:24 -0700
commit1aefb7ef73751878d13eff717de61e76f690b57e (patch)
tree5e396cddccd96d7c73fbfce8ef3be570610aeb11 /flist.c
parentd7b6774d82ae234978542c43c9ad655c8ade101e (diff)
downloadrsync-1aefb7ef73751878d13eff717de61e76f690b57e.tar.gz
Output a non-existent-file error for server-excluded files instead of
silently ignoring them.
Diffstat (limited to 'flist.c')
-rw-r--r--flist.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/flist.c b/flist.c
index dd3b3b1d..8eaebd1a 100644
--- a/flist.c
+++ b/flist.c
@@ -232,10 +232,20 @@ int link_stat(const char *path, STRUCT_STAT *stp, int follow_dirlinks)
#endif
}
+static inline int is_daemon_excluded(const char *fname, int is_dir)
+{
+ if (server_filter_list.head
+ && check_filter(&server_filter_list, fname, is_dir) < 0) {
+ errno = ENOENT;
+ return 1;
+ }
+ return 0;
+}
+
/* This function is used to check if a file should be included/excluded
* from the list of files based on its name and type etc. The value of
* filter_level is set to either SERVER_FILTERS or ALL_FILTERS. */
-static int is_excluded(char *fname, int is_dir, int filter_level)
+static int is_excluded(const char *fname, int is_dir, int filter_level)
{
#if 0 /* This currently never happens, so avoid a useless compare. */
if (filter_level == NO_FILTERS)
@@ -252,8 +262,7 @@ static int is_excluded(char *fname, int is_dir, int filter_level)
return 0;
}
}
- if (server_filter_list.head
- && check_filter(&server_filter_list, fname, is_dir) < 0)
+ if (is_daemon_excluded(fname, is_dir))
return 1;
if (filter_level != ALL_FILTERS)
return 0;
@@ -1939,7 +1948,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
if (fn != fbuf)
memmove(fbuf, fn, len + 1);
- if (link_stat(fbuf, &st, copy_dirlinks || name_type != NORMAL_NAME) != 0) {
+ if (link_stat(fbuf, &st, copy_dirlinks || name_type != NORMAL_NAME) != 0
+ || is_daemon_excluded(fbuf, S_ISDIR(st.st_mode) != 0)) {
io_error |= IOERR_GENERAL;
rsyserr(FERROR_XFER, errno, "link_stat %s failed",
full_fname(fbuf));