diff options
author | Björn Jacke <bj@sernet.de> | 2019-03-02 05:39:54 +0100 |
---|---|---|
committer | Bjoern Jacke <bjacke@samba.org> | 2019-08-29 15:53:30 +0000 |
commit | 56e0ffa11319eebbe0d8b07502aa3ec8971435d0 (patch) | |
tree | 40415654a3b643f4f8456134f40b6b9e69756034 | |
parent | b8f4be98f5d22eb034a953ebefab88752bf4a099 (diff) | |
download | samba-56e0ffa11319eebbe0d8b07502aa3ec8971435d0.tar.gz |
xattr/setxattr: fix flag support on AIX
AIX requires the flags to be 0, we need to do those checks manually.
Signed-off-by: Bjoern Jacke <bjacke@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
-rw-r--r-- | lib/replace/xattr.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/lib/replace/xattr.c b/lib/replace/xattr.c index f142ed61723..b7fbde2a2ca 100644 --- a/lib/replace/xattr.c +++ b/lib/replace/xattr.c @@ -538,7 +538,21 @@ int rep_setxattr (const char *path, const char *name, const void *value, size_t return retval; #endif #elif defined(HAVE_XATTR_EA) - return setea(path, name, value, size, flags); + if (flags) { + retval = getea(path, name, NULL, 0); + if (retval < 0) { + if (flags & XATTR_REPLACE && errno == ENOATTR) { + return -1; + } + } else { + if (flags & XATTR_CREATE) { + errno = EEXIST; + return -1; + } + } + } + retval = setea(path, name, value, size, 0); + return retval; #elif defined(HAVE_XATTR_EXTATTR) int attrnamespace; const char *attrname; @@ -632,7 +646,21 @@ int rep_fsetxattr (int filedes, const char *name, const void *value, size_t size return retval; #endif #elif defined(HAVE_XATTR_EA) - return fsetea(filedes, name, value, size, flags); + if (flags) { + retval = fgetea(filedes, name, NULL, 0); + if (retval < 0) { + if (flags & XATTR_REPLACE && errno == ENOATTR) { + return -1; + } + } else { + if (flags & XATTR_CREATE) { + errno = EEXIST; + return -1; + } + } + } + retval = fsetea(filedes, name, value, size, 0); + return retval; #elif defined(HAVE_XATTR_EXTATTR) int attrnamespace; const char *attrname; |