xattr/setxattr: fix flag support on AIX
[gd/samba-autobuild/.git] / lib / replace / xattr.c
index f142ed61723481249714819e0593988f441b5721..b7fbde2a2cabc311632450eb64d4eb4624e8c517 100644 (file)
@@ -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;