It avoids macro messiness. Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- lib/xattr.c | 67 +++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 35 deletions(-)
diff --git a/lib/xattr.c b/lib/xattr.c index 68a96cc..b382ee4 100644 --- a/lib/xattr.c +++ b/lib/xattr.c @@ -75,6 +75,28 @@ #define OVL_XATTR_ORIGIN OVL_XATTR_TRUSTED_PREFIX OVL_XATTR_ORIGIN_POSTFIX #endif +static ssize_t erofs_sys_llistxattr(const char *path, char *list, size_t size) +{ +#ifdef HAVE_LLISTXATTR + return llistxattr(path, list, size); +#elif defined(__APPLE__) + return listxattr(path, list, size, XATTR_NOFOLLOW); +#endif + return 0; +} + +static ssize_t erofs_sys_lgetxattr(const char *path, const char *name, + void *value, size_t size) +{ +#ifdef HAVE_LGETXATTR + return lgetxattr(path, name, value, size); +#elif defined(__APPLE__) + return getxattr(path, name, value, size, 0, XATTR_NOFOLLOW); +#endif + errno = ENODATA; + return -1; +} + #define EA_HASHTABLE_BITS 16 /* one extra byte for the trailing `\0` of attribute name */ @@ -241,13 +263,7 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key, len[0] = keylen; /* determine length of the value */ -#ifdef HAVE_LGETXATTR - ret = lgetxattr(path, key, NULL, 0); -#elif defined(__APPLE__) - ret = getxattr(path, key, NULL, 0, 0, XATTR_NOFOLLOW); -#else - return ERR_PTR(-EOPNOTSUPP); -#endif + ret = erofs_sys_lgetxattr(path, key, NULL, 0); if (ret < 0) return ERR_PTR(-errno); len[1] = ret; @@ -259,16 +275,9 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key, memcpy(kvbuf, key, EROFS_XATTR_KSIZE(len)); if (len[1]) { /* copy value to buffer */ -#ifdef HAVE_LGETXATTR - ret = lgetxattr(path, key, kvbuf + EROFS_XATTR_KSIZE(len), - len[1]); -#elif defined(__APPLE__) - ret = getxattr(path, key, kvbuf + EROFS_XATTR_KSIZE(len), - len[1], 0, XATTR_NOFOLLOW); -#else - ret = -EOPNOTSUPP; - goto out; -#endif + ret = erofs_sys_lgetxattr(path, key, + kvbuf + EROFS_XATTR_KSIZE(len), + len[1]); if (ret < 0) { ret = -errno; goto out; @@ -392,21 +401,15 @@ static bool erofs_is_skipped_xattr(const char *key) static int read_xattrs_from_file(const char *path, mode_t mode, struct list_head *ixattrs) { -#ifdef HAVE_LLISTXATTR - ssize_t kllen = llistxattr(path, NULL, 0); -#elif defined(__APPLE__) - ssize_t kllen = listxattr(path, NULL, 0, XATTR_NOFOLLOW); -#else - ssize_t kllen = 0; -#endif - int ret; + ssize_t kllen = erofs_sys_llistxattr(path, NULL, 0); char *keylst, *key, *klend; unsigned int keylen; struct xattr_item *item; + int ret; if (kllen < 0 && errno != ENODATA && errno != EOPNOTSUPP) { - erofs_err("llistxattr to get the size of names for %s failed", - path); + erofs_err("failed to get the size of the xattr list for %s: %s", + path, strerror(errno)); return -errno; } @@ -419,19 +422,13 @@ static int read_xattrs_from_file(const char *path, mode_t mode, return -ENOMEM; /* copy the list of attribute keys to the buffer.*/ -#ifdef HAVE_LLISTXATTR - kllen = llistxattr(path, keylst, kllen); -#elif defined(__APPLE__) - kllen = listxattr(path, keylst, kllen, XATTR_NOFOLLOW); + kllen = erofs_sys_llistxattr(path, keylst, kllen); if (kllen < 0) { erofs_err("llistxattr to get names for %s failed", path); ret = -errno; goto err; } -#else - ret = -EOPNOTSUPP; - goto err; -#endif + /* * loop over the list of zero terminated strings with the * attribute keys. Use the remaining buffer length to determine -- 2.43.5