summaryrefslogtreecommitdiff
path: root/lib/replace/xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/replace/xattr.c')
-rw-r--r--lib/replace/xattr.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/lib/replace/xattr.c b/lib/replace/xattr.c
index 2420ee1f808..f142ed61723 100644
--- a/lib/replace/xattr.c
+++ b/lib/replace/xattr.c
@@ -515,19 +515,31 @@ int rep_fremovexattr (int filedes, const char *name)
int rep_setxattr (const char *path, const char *name, const void *value, size_t size, int flags)
{
+ int retval = -1;
#if defined(HAVE_XATTR_XATTR)
#ifndef XATTR_ADDITIONAL_OPTIONS
- return setxattr(path, name, value, size, flags);
+ retval = setxattr(path, name, value, size, flags);
+ if (retval < 0) {
+ if (errno == ENOSPC || errno == E2BIG) {
+ errno = ENAMETOOLONG;
+ }
+ }
+ return retval;
#else
/* So that we do not recursivly call this function */
#undef setxattr
int options = 0;
- return setxattr(path, name, value, size, 0, options);
+ retval = setxattr(path, name, value, size, 0, options);
+ if (retval < 0) {
+ if (errno == E2BIG) {
+ errno = ENAMETOOLONG;
+ }
+ }
+ return retval;
#endif
#elif defined(HAVE_XATTR_EA)
return setea(path, name, value, size, flags);
#elif defined(HAVE_XATTR_EXTATTR)
- int retval = 0;
int attrnamespace;
const char *attrname;
@@ -571,19 +583,24 @@ int rep_setxattr (const char *path, const char *name, const void *value, size_t
if (flags & XATTR_CREATE) myflags |= ATTR_CREATE;
if (flags & XATTR_REPLACE) myflags |= ATTR_REPLACE;
- return attr_set(path, attrname, (const char *)value, size, myflags);
+ retval = attr_set(path, attrname, (const char *)value, size, myflags);
+ if (retval < 0) {
+ if (errno == E2BIG) {
+ errno = ENAMETOOLONG;
+ }
+ }
+ return retval;
#elif defined(HAVE_ATTROPEN)
- int ret = -1;
int myflags = O_RDWR;
int attrfd;
if (flags & XATTR_CREATE) myflags |= O_EXCL;
if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
attrfd = solaris_attropen(path, name, myflags, (mode_t) SOLARIS_ATTRMODE);
if (attrfd >= 0) {
- ret = solaris_write_xattr(attrfd, value, size);
+ retval = solaris_write_xattr(attrfd, value, size);
close(attrfd);
}
- return ret;
+ return retval;
#else
errno = ENOSYS;
return -1;
@@ -592,19 +609,31 @@ int rep_setxattr (const char *path, const char *name, const void *value, size_t
int rep_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags)
{
+ int retval = -1;
#if defined(HAVE_XATTR_XATTR)
#ifndef XATTR_ADDITIONAL_OPTIONS
- return fsetxattr(filedes, name, value, size, flags);
+ retval = fsetxattr(filedes, name, value, size, flags);
+ if (retval < 0) {
+ if (errno == ENOSPC) {
+ errno = ENAMETOOLONG;
+ }
+ }
+ return retval;
#else
/* So that we do not recursivly call this function */
#undef fsetxattr
int options = 0;
- return fsetxattr(filedes, name, value, size, 0, options);
+ retval = fsetxattr(filedes, name, value, size, 0, options);
+ if (retval < 0) {
+ if (errno == E2BIG) {
+ errno = ENAMETOOLONG;
+ }
+ }
+ return retval;
#endif
#elif defined(HAVE_XATTR_EA)
return fsetea(filedes, name, value, size, flags);
#elif defined(HAVE_XATTR_EXTATTR)
- int retval = 0;
int attrnamespace;
const char *attrname;
@@ -650,17 +679,16 @@ int rep_fsetxattr (int filedes, const char *name, const void *value, size_t size
return attr_setf(filedes, attrname, (const char *)value, size, myflags);
#elif defined(HAVE_ATTROPEN)
- int ret = -1;
int myflags = O_RDWR | O_XATTR;
int attrfd;
if (flags & XATTR_CREATE) myflags |= O_EXCL;
if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
attrfd = solaris_openat(filedes, name, myflags, (mode_t) SOLARIS_ATTRMODE);
if (attrfd >= 0) {
- ret = solaris_write_xattr(attrfd, value, size);
+ retval = solaris_write_xattr(attrfd, value, size);
close(attrfd);
}
- return ret;
+ return retval;
#else
errno = ENOSYS;
return -1;