--- a/lib/xattr-at.c	2014-02-10 18:42:45.000000000 +0100
+++ b/lib/xattr-at.c	2016-02-07 17:41:33.000000000 +0100
@@ -31,12 +31,40 @@

 #include "openat-priv.h"

+#ifdef __APPLE__
+# define AT_SETXATTR_NAME       setxattr
+# define AT_SETXATTR_ARGS       , name, value, size, 0, flags
+# define AT_LSETXATTR_NAME      setxattr
+# define AT_LSETXATTR_ARGS      , name, value, size, 0, flags | XATTR_NOFOLLOW
+# define AT_GETXATTR_NAME       getxattr
+# define AT_GETXATTR_ARGS       , name, value, size, 0, 0
+# define AT_LGETXATTR_NAME      getxattr
+# define AT_LGETXATTR_ARGS      , name, value, size, 0, XATTR_NOFOLLOW
+# define AT_LISTXATTR_NAME      listxattr
+# define AT_LISTXATTR_ARGS      , list, size, 0
+# define AT_LLISTXATTR_NAME     listxattr
+# define AT_LLISTXATTR_ARGS     , list , size, XATTR_NOFOLLOW
+#else
+# define AT_SETXATTR_NAME       setxattr
+# define AT_SETXATTR_ARGS       , name, value, size, flags
+# define AT_LSETXATTR_NAME      lsetxattr
+# define AT_LSETXATTR_ARGS      , name, value, size, flags
+# define AT_GETXATTR_NAME       getxattr
+# define AT_GETXATTR_ARGS       , name, value, size
+# define AT_LGETXATTR_NAME      lgetxattr
+# define AT_LGETXATTR_ARGS      , name, value, size
+# define AT_LISTXATTR_NAME      listxattr
+# define AT_LISTXATTR_ARGS      , list, size
+# define AT_LLISTXATTR_NAME     llistxattr
+# define AT_LLISTXATTR_ARGS     , list, size
+#endif
+
 /* setxattrat */
 #define AT_FUNC_NAME setxattrat
-#define AT_FUNC_F1 setxattr
+#define AT_FUNC_F1 AT_SETXATTR_NAME
 #define AT_FUNC_POST_FILE_PARAM_DECLS   , const char *name, const void *value \
                                         , size_t size, int flags
-#define AT_FUNC_POST_FILE_ARGS          , name, value, size, flags
+#define AT_FUNC_POST_FILE_ARGS          AT_SETXATTR_ARGS
 #include "at-func.c"
 #undef AT_FUNC_NAME
 #undef AT_FUNC_F1
@@ -45,10 +73,10 @@

 /* lsetxattrat */
 #define AT_FUNC_NAME lsetxattrat
-#define AT_FUNC_F1 lsetxattr
+#define AT_FUNC_F1 AT_LSETXATTR_NAME
 #define AT_FUNC_POST_FILE_PARAM_DECLS   , const char *name, const void *value \
                                         , size_t size, int flags
-#define AT_FUNC_POST_FILE_ARGS          , name, value, size, flags
+#define AT_FUNC_POST_FILE_ARGS          AT_LSETXATTR_ARGS
 #include "at-func.c"
 #undef AT_FUNC_NAME
 #undef AT_FUNC_F1
@@ -58,10 +86,10 @@
 /* getxattrat */
 #define AT_FUNC_NAME getxattrat
 #define AT_FUNC_RESULT ssize_t
-#define AT_FUNC_F1 getxattr
+#define AT_FUNC_F1 AT_GETXATTR_NAME
 #define AT_FUNC_POST_FILE_PARAM_DECLS   , const char *name, void *value \
                                         , size_t size
-#define AT_FUNC_POST_FILE_ARGS          , name, value, size
+#define AT_FUNC_POST_FILE_ARGS          AT_GETXATTR_ARGS
 #include "at-func.c"
 #undef AT_FUNC_NAME
 #undef AT_FUNC_F1
@@ -72,10 +100,10 @@
 /* lgetxattrat */
 #define AT_FUNC_NAME lgetxattrat
 #define AT_FUNC_RESULT ssize_t
-#define AT_FUNC_F1 lgetxattr
+#define AT_FUNC_F1 AT_LGETXATTR_NAME
 #define AT_FUNC_POST_FILE_PARAM_DECLS   , const char *name, void *value \
                                         , size_t size
-#define AT_FUNC_POST_FILE_ARGS          , name, value, size
+#define AT_FUNC_POST_FILE_ARGS          AT_LGETXATTR_ARGS
 #include "at-func.c"
 #undef AT_FUNC_NAME
 #undef AT_FUNC_F1
@@ -86,9 +114,9 @@
 /* listxattrat */
 #define AT_FUNC_NAME listxattrat
 #define AT_FUNC_RESULT ssize_t
-#define AT_FUNC_F1 listxattr
+#define AT_FUNC_F1 AT_LISTXATTR_NAME
 #define AT_FUNC_POST_FILE_PARAM_DECLS   , char *list , size_t size
-#define AT_FUNC_POST_FILE_ARGS          , list , size
+#define AT_FUNC_POST_FILE_ARGS          AT_LISTXATTR_ARGS
 #include "at-func.c"
 #undef AT_FUNC_NAME
 #undef AT_FUNC_F1
@@ -99,9 +127,9 @@
 /* llistxattrat */
 #define AT_FUNC_NAME llistxattrat
 #define AT_FUNC_RESULT ssize_t
-#define AT_FUNC_F1 llistxattr
+#define AT_FUNC_F1 AT_LLISTXATTR_NAME
 #define AT_FUNC_POST_FILE_PARAM_DECLS   , char *list , size_t size
-#define AT_FUNC_POST_FILE_ARGS          , list , size
+#define AT_FUNC_POST_FILE_ARGS          AT_LLISTXATTR_ARGS
 #include "at-func.c"
 #undef AT_FUNC_NAME
 #undef AT_FUNC_F1
--- a/src/xattrs.c	2014-02-14 23:13:27.000000000 +0100
+++ b/src/xattrs.c	2016-02-07 17:46:43.000000000 +0100
@@ -30,6 +30,14 @@
 #include "xattr-at.h"
 #include "selinux-at.h"

+#ifdef __APPLE__
+# define FGETXATTR_EXTRA_ARGS   , 0, 0
+# define FLISTXATTR_EXTRA_ARGS  , 0
+#else
+# define FGETXATTR_EXTRA_ARGS   /* none */
+# define FLISTXATTR_EXTRA_ARGS  /* none */
+#endif
+
 struct xattrs_mask_map
 {
   const char **masks;
@@ -458,7 +466,7 @@
       while (((fd == 0) ?
               ((xret =
                 llistxattrat (parentfd, file_name, xatrs, xsz)) == -1) :
-	      ((xret = flistxattr (fd, xatrs, xsz)) == -1))
+	      ((xret = flistxattr (fd, xatrs, xsz FLISTXATTR_EXTRA_ARGS)) == -1))
              && (errno == ERANGE))
         {
 	  xatrs = x2nrealloc (xatrs, &xsz, 1);
@@ -485,7 +493,7 @@
               while (((fd == 0)
                       ? ((aret = lgetxattrat (parentfd, file_name, attr,
                                               val, asz)) == -1)
-                      : ((aret = fgetxattr (fd, attr, val, asz)) == -1))
+                      : ((aret = fgetxattr (fd, attr, val, asz FGETXATTR_EXTRA_ARGS)) == -1))
                      && (errno == ERANGE))
                 {
 		  val = x2nrealloc (val, &asz, 1);
