This patch makes the xattr functions skip devices and special files,
because OS X returns the wrong errno when getting/setting xattrs on
them (it returns EPERM instead of ENOTSUP).

To use this patch, run these commands for a successful build:

    patch -p1 <patches/osx-xattr-nodev.diff
    ./configure                         (optional if already run)
    make

based-on: 181c9faf928faad08ef095f4667afe460ec3bef6
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
@@ -1476,6 +1476,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
 #endif
 #ifdef SUPPORT_XATTRS
 		if (preserve_xattrs) {
+			sx.st.st_mode = file->mode;
 			if (get_xattr(fname, &sx) < 0) {
 				io_error |= IOERR_GENERAL;
 				return NULL;
diff --git a/xattrs.c b/xattrs.c
--- a/xattrs.c
+++ b/xattrs.c
@@ -284,6 +284,10 @@ int get_xattr(const char *fname, stat_x *sxp)
 {
 	sxp->xattr = new(item_list);
 	*sxp->xattr = empty_xattr;
+
+	if (IS_SPECIAL(sxp->st.st_mode) || IS_DEVICE(sxp->st.st_mode))
+		return 0;
+
 	if (rsync_xal_get(fname, sxp->xattr) < 0) {
 		free_xattr(sxp);
 		return -1;
@@ -884,6 +888,11 @@ int set_xattr(const char *fname, const struct file_struct *file,
 		return -1;
 	}
 
+	if (IS_SPECIAL(sxp->st.st_mode) || IS_DEVICE(sxp->st.st_mode)) {
+		errno = ENOTSUP;
+		return -1;
+	}
+
 	ndx = F_XATTR(file);
 	return rsync_xal_set(fname, lst + ndx, fnamecmp, sxp);
 }
