summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBjörn Jacke <bj@sernet.de>2019-03-02 05:39:54 +0100
committerBjoern Jacke <bjacke@samba.org>2019-08-29 15:53:30 +0000
commit56e0ffa11319eebbe0d8b07502aa3ec8971435d0 (patch)
tree40415654a3b643f4f8456134f40b6b9e69756034 /lib
parentb8f4be98f5d22eb034a953ebefab88752bf4a099 (diff)
downloadsamba-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>
Diffstat (limited to 'lib')
-rw-r--r--lib/replace/xattr.c32
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;