diff options
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/compat.c | 28 | ||||
-rw-r--r-- | libglusterfs/src/compat.h | 3 | ||||
-rw-r--r-- | libglusterfs/src/syscall.c | 10 |
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 |