--- 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 <libgen.h>
+#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));