#endif
}
-int sys_getxattrfd(const char *path, const char *uname, int oflag, ...)
+int sys_getxattrfd(int fd, const char *uname, int oflag, ...)
{
#if defined HAVE_ATTROPEN
int eafd;
va_list args;
- mode_t mode;
+ mode_t mode = 0;
if (oflag & O_CREAT) {
va_start(args, oflag);
}
if (oflag & O_CREAT)
- eafd = attropen(path, uname, oflag, mode);
+ eafd = solaris_openat(fd, uname, oflag | O_XATTR, mode);
else
- eafd = attropen(path, uname, oflag);
+ eafd = solaris_openat(fd, uname, oflag | O_XATTR, mode);
return eafd;
#else
static int solaris_attropen(const char *path, const char *attrpath, int oflag, mode_t mode)
{
- int filedes = attropen(path, attrpath, oflag, mode);
- if (filedes == -1) {
- if (errno != ENOENT)
+ int filedes;
+
+ if ((filedes = attropen(path, attrpath, oflag, mode)) == -1) {
+ switch (errno) {
+ case ENOENT:
+ case EEXIST:
+ break;
+ default:
LOG(log_error, logtype_default, "attropen(\"%s\", ea:'%s'): %s",
path, attrpath, strerror(errno));
- errno = ENOATTR;
+ errno = ENOATTR;
+ break;
+ }
}
return filedes;
}
static int solaris_openat(int fildes, const char *path, int oflag, mode_t mode)
{
- int filedes = openat(fildes, path, oflag, mode);
- if (filedes == -1) {
- if (errno != ENOENT)
+ int filedes;
+
+ if ((filedes = openat(fildes, path, oflag, mode)) == -1) {
+ switch (errno) {
+ case ENOENT:
+ case EEXIST:
+ break;
+ default:
LOG(log_error, logtype_default, "openat(\"%s\"): %s",
path, strerror(errno));
- errno = ENOATTR;
+ errno = ENOATTR;
+ break;
+ }
}
return filedes;
}