Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Unsnarl missing_below/dry_run logic.
[rsync/rsync.git]
/
flist.c
diff --git
a/flist.c
b/flist.c
index
489d92c
..
8eaebd1
100644
(file)
--- a/
flist.c
+++ b/
flist.c
@@
-232,10
+232,20
@@
int link_stat(const char *path, STRUCT_STAT *stp, int follow_dirlinks)
#endif
}
#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. */
/* 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(c
onst c
har *fname, int is_dir, int filter_level)
{
#if 0 /* This currently never happens, so avoid a useless compare. */
if (filter_level == NO_FILTERS)
{
#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;
}
}
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;
return 1;
if (filter_level != ALL_FILTERS)
return 0;
@@
-854,7
+863,6
@@
static struct file_struct *recv_file_entry(struct file_list *flist,
bp += FILE_STRUCT_LEN;
memcpy(bp, basename, basename_len);
bp += FILE_STRUCT_LEN;
memcpy(bp, basename, basename_len);
- bp += basename_len;
#ifdef SUPPORT_HARD_LINKS
if (xflags & XMIT_HLINKED)
#ifdef SUPPORT_HARD_LINKS
if (xflags & XMIT_HLINKED)
@@
-919,6
+927,7
@@
static struct file_struct *recv_file_entry(struct file_list *flist,
#ifdef SUPPORT_LINKS
if (linkname_len) {
#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);
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);
@@
-1177,7
+1186,6
@@
struct file_struct *make_file(const char *fname, struct file_list *flist,
bp += FILE_STRUCT_LEN;
memcpy(bp, basename, basename_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_HARD_LINKS
if (preserve_hard_links && flist && flist->prev) {
@@
-1216,7
+1224,7
@@
struct file_struct *make_file(const char *fname, struct file_list *flist,
#ifdef SUPPORT_LINKS
if (linkname_len)
#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))
#endif
if (always_checksum && am_sender && S_ISREG(st.st_mode))
@@
-1940,7
+1948,8
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
if (fn != fbuf)
memmove(fbuf, fn, len + 1);
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));
io_error |= IOERR_GENERAL;
rsyserr(FERROR_XFER, errno, "link_stat %s failed",
full_fname(fbuf));