--- receiver.c.orig 2006-01-09 12:35:38.000000000 -0600 +++ receiver.c 2006-01-09 12:35:51.000000000 -0600 @@ -20,6 +20,10 @@ #include "rsync.h" +#ifdef HAVE_COPYFILE +#include +#endif + extern int verbose; extern int do_xfers; extern int am_daemon; @@ -56,6 +60,9 @@ extern char *basis_dir[]; extern struct file_list *the_file_list; extern struct filter_list_struct server_filter_list; +#ifdef HAVE_COPYFILE +extern int extended_attributes; +#endif #define SLOT_SIZE (16*1024) /* Desired size in bytes */ #define PER_SLOT_BITS (SLOT_SIZE * 8) /* Number of bits per slot */ @@ -143,7 +150,7 @@ * As long as it's unique, rsync will work. */ -static int get_tmpname(char *fnametmp, char *fname) +int get_tmpname(char *fnametmp, char *fname) { char *f; int length = 0; @@ -426,7 +433,27 @@ continue; file = flist->files[i]; - fname = local_name ? local_name : f_name_to(file, fbuf); + if (local_name) +#ifdef HAVE_COPYFILE + { + if (extended_attributes + && !strncmp(file->basename, "._", 2)) { + if (dirname(local_name)) { + snprintf(fbuf, MAXPATHLEN, "%s/._%s", + dirname(local_name), basename(local_name)); + } else { + snprintf(fbuf, MAXPATHLEN, "._%s", local_name); + errno = 0; + } + fname = fbuf; + } else + fname = local_name; + } +#else + fname = local_name; +#endif + else + fname = f_name_to(file, fbuf); if (verbose > 2) rprintf(FINFO, "recv_files(%s)\n", safe_fname(fname));