X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d6c9c3319b191d196c323174c0dc11c834ae9e75..83a8ca7b14483826c85f7cc0e0e38ed9ce387d83:/flist.c diff --git a/flist.c b/flist.c index 489d92c1..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; @@ -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 += basename_len; #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) { + 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); @@ -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 += basename_len; #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) - memcpy(bp, linkname, linkname_len); + memcpy(bp + basename_len, linkname, linkname_len); #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 (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));