extern struct chmod_mode_struct *chmod_modes;
extern struct filter_list_struct filter_list;
-extern struct filter_list_struct server_filter_list;
+extern struct filter_list_struct daemon_filter_list;
#ifdef ICONV_OPTION
extern int filesfrom_convert;
#endif
}
+static inline int is_daemon_excluded(const char *fname, int is_dir)
+{
+ if (daemon_filter_list.head
+ && check_filter(&daemon_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)
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;
bp += FILE_STRUCT_LEN;
memcpy(bp, basename, basename_len);
- bp += basename_len;
#ifdef SUPPORT_HARD_LINKS
if (xflags & XMIT_HLINKED)
#ifdef SUPPORT_LINKS
if (linkname_len) {
+ bp += basename_len;
if (first_hlink_ndx >= flist->ndx_start) {
struct file_struct *first = flist->files[first_hlink_ndx - flist->ndx_start];
memcpy(bp, F_SYMLINK(first), linkname_len);
bp += FILE_STRUCT_LEN;
memcpy(bp, basename, basename_len);
- bp += basename_len;
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && flist && flist->prev) {
#ifdef SUPPORT_LINKS
if (linkname_len)
- memcpy(bp, linkname, linkname_len);
+ memcpy(bp + basename_len, linkname, linkname_len);
#endif
if (always_checksum && am_sender && S_ISREG(st.st_mode))
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));