Moved the xattr-skipping on device/special files out of the
authorWayne Davison <wayned@samba.org>
Tue, 17 Jun 2008 14:18:21 +0000 (07:18 -0700)
committerWayne Davison <wayned@samba.org>
Tue, 17 Jun 2008 14:25:17 +0000 (07:25 -0700)
fileflags.diff into its own patch (osx-xattr-nodev.diff).

fileflags.diff
osx-xattr-nodev.diff [new file with mode: 0644]

index 17eb0c0b36686728e22cc77d1a93bb342d87591f..11661db3ec7b3f128c8ad5ae496575618218f7ce 100644 (file)
@@ -164,14 +164,6 @@ diff --git a/flist.c b/flist.c
        if (uid_ndx) /* Check uid_ndx instead of preserve_uid for del support */
                F_OWNER(file) = st.st_uid;
        if (gid_ndx) /* Check gid_ndx instead of preserve_gid for del support */
-@@ -1342,6 +1373,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;
-                       sx.xattr = NULL;
-                       if (get_xattr(fname, &sx) < 0)
-                               return NULL;
 diff --git a/generator.c b/generator.c
 --- a/generator.c
 +++ b/generator.c
@@ -1049,29 +1041,6 @@ diff --git a/util.c b/util.c
 diff --git a/xattrs.c b/xattrs.c
 --- a/xattrs.c
 +++ b/xattrs.c
-@@ -281,6 +281,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;
-@@ -856,6 +860,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);
- }
 @@ -972,7 +981,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
        mode = (fst.st_mode & _S_IFMT) | (fmode & ACCESSPERMS)
             | (S_ISDIR(fst.st_mode) ? 0700 : 0600);
diff --git a/osx-xattr-nodev.diff b/osx-xattr-nodev.diff
new file mode 100644 (file)
index 0000000..2e3e0de
--- /dev/null
@@ -0,0 +1,47 @@
+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
+
+diff --git a/flist.c b/flist.c
+--- a/flist.c
++++ b/flist.c
+@@ -1342,6 +1373,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;
+                       sx.xattr = NULL;
+                       if (get_xattr(fname, &sx) < 0)
+                               return NULL;
+diff --git a/xattrs.c b/xattrs.c
+--- a/xattrs.c
++++ b/xattrs.c
+@@ -281,6 +281,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;
+@@ -856,6 +860,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);
+ }