summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
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;