--- sender.c.orig 2006-01-09 12:35:38.000000000 -0600 +++ sender.c 2006-01-09 12:35:52.000000000 -0600 @@ -19,6 +19,10 @@ #include "rsync.h" +#ifdef HAVE_COPYFILE_H +#include +#endif + extern int verbose; extern int do_xfers; extern int am_server; @@ -41,6 +45,9 @@ extern struct file_list *the_file_list; extern char *log_format; +#ifdef EA_SUPPORT +extern int extended_attributes; +#endif /** * @file @@ -286,6 +293,41 @@ return; } +#ifdef HAVE_COPYFILE + if (extended_attributes + && !strncmp(file->basename, "._", 2)) { + char fname_tmp[MAXPATHLEN]; + char fname_src[MAXPATHLEN]; + extern char *tmpdir; + + if (tmpdir == NULL) + tmpdir = "/tmp"; + + strlcpy(fname_src, fname, MAXPATHLEN); + + if (file->dirname) + sprintf(fname_src + offset, "%s/%s", + file->dirname, file->basename + 2); + else + strlcpy(fname_src + offset, file->basename + 2, MAXPATHLEN); + + if(!get_tmpname(fname_tmp, file->basename)) + continue; + + if(mktemp(fname_tmp) + && !copyfile(fname_src, fname_tmp, NULL, + COPYFILE_PACK | COPYFILE_METADATA)) { + fd = do_open(fname_tmp, O_RDONLY, 0); + unlink(fname_tmp); + } + else + { + rprintf(FERROR, "send_files failed to open %s: %s\n", + full_fname(fname_tmp), strerror(errno)); + continue; + } + } else +#endif fd = do_open(fname, O_RDONLY, 0); if (fd == -1) { if (errno == ENOENT) {