summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/compat.c28
-rw-r--r--libglusterfs/src/compat.h3
-rw-r--r--libglusterfs/src/syscall.c10
3 files changed, 39 insertions, 2 deletions
diff --git a/libglusterfs/src/compat.c b/libglusterfs/src/compat.c
index 621ff5f54c9..a27fe20ce64 100644
--- a/libglusterfs/src/compat.c
+++ b/libglusterfs/src/compat.c
@@ -535,6 +535,34 @@ out:
#endif /* GF_SOLARIS_HOST_OS */
+#ifdef GF_BSD_HOST_OS
+void
+gf_extattr_list_reshape(char *bsd_list, ssize_t size)
+{
+ /*
+ * the format of bsd_list is
+ * <attr_len>attr<attr_len>attr...
+ * we try to reformat it as Linux's
+ * attr<\0>attr<\0>...
+ * */
+ if (NULL == bsd_list || size <= 0)
+ return;
+
+ size_t i = 0, j;
+
+ while (i < size) {
+ size_t attr_len = bsd_list[i];
+
+ for (j = i; j < i+attr_len; ++j)
+ bsd_list[j] = bsd_list[j+1];
+ bsd_list[j] = '\0';
+
+ i += attr_len + 1;
+ gf_msg_debug ("syscall", 0, "syscall debug: %lu", attr_len);
+ }
+}
+#endif /* GF_BSD_HOST_OS */
+
#ifndef HAVE_STRNLEN
size_t
strnlen(const char *string, size_t maxlen)
diff --git a/libglusterfs/src/compat.h b/libglusterfs/src/compat.h
index f4da4b2a0de..1d0ac27e836 100644
--- a/libglusterfs/src/compat.h
+++ b/libglusterfs/src/compat.h
@@ -189,6 +189,9 @@ enum {
#ifndef _PATH_UMOUNT
#define _PATH_UMOUNT "/sbin/umount"
#endif
+
+void gf_extattr_list_reshape(char *list, ssize_t size);
+
#endif /* GF_BSD_HOST_OS */
#ifdef GF_DARWIN_HOST_OS
diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c
index a7d4402808d..3a3d5318baa 100644
--- a/libglusterfs/src/syscall.c
+++ b/libglusterfs/src/syscall.c
@@ -492,7 +492,10 @@ sys_llistxattr (const char *path, char *list, size_t size)
#endif
#ifdef GF_BSD_HOST_OS
- return extattr_list_link (path, EXTATTR_NAMESPACE_USER, list, size);
+ ssize_t ret = extattr_list_link (path, EXTATTR_NAMESPACE_USER,
+ list, size);
+ gf_extattr_list_reshape (list, ret);
+ return ret;
#endif
#ifdef GF_SOLARIS_HOST_OS
@@ -608,7 +611,10 @@ sys_flistxattr (int filedes, char *list, size_t size)
#endif
#ifdef GF_BSD_HOST_OS
- return extattr_list_fd (filedes, EXTATTR_NAMESPACE_USER, list, size);
+ ssize_t ret = extattr_list_fd (filedes, EXTATTR_NAMESPACE_USER,
+ list, size);
+ gf_extattr_list_reshape (list, ret);
+ return ret;
#endif
#ifdef GF_SOLARIS_HOST_OS