]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/vfs/extattr.c
Don't force errno ENOATTR on Solaris
[netatalk.git] / libatalk / vfs / extattr.c
index db325328550c6a74d6f2e0905becd1d0ca5397ec..5206aa6d69d16698f62f8c2d9fd4c2c770ab7bf3 100644 (file)
@@ -60,6 +60,7 @@
 #include <atalk/logger.h>
 #include <atalk/ea.h>
 #include <atalk/compat.h>
+#include <atalk/errchk.h>
 
 /******** Solaris EA helper function prototypes ********/
 #ifdef HAVE_ATTROPEN
@@ -189,7 +190,7 @@ ssize_t sys_fgetxattr (int filedes, const char *uname, void *value, size_t size)
     ssize_t retval;
     int attrnamespace = (strncmp(name, "system", 6) == 0) ? 
         EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
-    const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
+    const char *attrname = ((s=strchr(name, '.')) == NULL) ? name : s + 1;
 
     if((retval=extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0)) >= 0) {
         if(retval > size) {
@@ -200,8 +201,7 @@ ssize_t sys_fgetxattr (int filedes, const char *uname, void *value, size_t size)
             return retval;
     }
 
-    LOG(log_debug, logtype_default, "sys_fgetxattr: extattr_get_fd(): %s",
-        strerror(errno)));
+    LOG(log_debug, logtype_default, "sys_fgetxattr: extattr_get_fd(): %s", strerror(errno));
     return -1;
 #elif defined(HAVE_ATTR_GETF)
     int retval, flags = 0;
@@ -263,7 +263,7 @@ ssize_t sys_lgetxattr (const char *path, const char *uname, void *value, size_t
        return retval ? retval : valuelength;
 #elif defined(HAVE_ATTROPEN)
        ssize_t ret = -1;
-       int attrfd = solaris_attropen(path, name, O_RDONLY|AT_SYMLINK_NOFOLLOW, 0);
+       int attrfd = solaris_attropen(path, name, O_RDONLY | O_NOFOLLOW, 0);
        if (attrfd >= 0) {
                ret = solaris_read_xattr(attrfd, value, size);
                close(attrfd);
@@ -513,7 +513,7 @@ ssize_t sys_llistxattr (const char *path, char *list, size_t size)
        return irix_attr_list(path, 0, list, size, ATTR_DONTFOLLOW);
 #elif defined(HAVE_ATTROPEN)
        ssize_t ret = -1;
-       int attrdirfd = solaris_attropen(path, ".", O_RDONLY|AT_SYMLINK_NOFOLLOW, 0);
+       int attrdirfd = solaris_attropen(path, ".", O_RDONLY | O_NOFOLLOW, 0);
        if (attrdirfd >= 0) {
                ret = solaris_list_xattr(attrdirfd, list, size);
                close(attrdirfd);
@@ -581,7 +581,7 @@ int sys_lremovexattr (const char *path, const char *uname)
        return attr_remove(path, attrname, flags);
 #elif defined(HAVE_ATTROPEN)
        int ret = -1;
-       int attrdirfd = solaris_attropen(path, ".", O_RDONLY|AT_SYMLINK_NOFOLLOW, 0);
+       int attrdirfd = solaris_attropen(path, ".", O_RDONLY | O_NOFOLLOW, 0);
        if (attrdirfd >= 0) {
                ret = solaris_unlinkat(attrdirfd, name);
                close(attrdirfd);
@@ -673,7 +673,7 @@ int sys_fsetxattr (int filedes, const char *uname, const void *value, size_t siz
     int retval = 0;
     int attrnamespace = (strncmp(name, "system", 6) == 0) ? 
         EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
-    const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
+    const char *attrname = ((s=strchr(name, '.')) == NULL) ? name : s + 1;
     if (flags) {
         /* Check attribute existence */
         retval = extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0);
@@ -686,7 +686,6 @@ int sys_fsetxattr (int filedes, const char *uname, const void *value, size_t siz
             /* Ignore other errors */
         }
         else {
-            log_error, logtype_default            /* CREATE attribute, that already exists */
             if (flags & XATTR_CREATE) {
                 errno = EEXIST;
                 return -1;
@@ -767,7 +766,7 @@ int sys_lsetxattr (const char *path, const char *uname, const void *value, size_
        return attr_set(path, attrname, (const char *)value, size, myflags);
 #elif defined(HAVE_ATTROPEN)
        int ret = -1;
-       int myflags = O_RDWR | AT_SYMLINK_NOFOLLOW;
+       int myflags = O_RDWR | O_NOFOLLOW;
        int attrfd;
        if (flags & XATTR_CREATE) myflags |= O_EXCL;
        if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
@@ -866,21 +865,41 @@ static int solaris_unlinkat(int attrdirfd, const char *name)
 
 static int solaris_attropen(const char *path, const char *attrpath, int oflag, mode_t mode)
 {
-       int filedes;
+    EC_INIT;
+       int filedes = -1, eafd = -1;
 
-       if ((filedes = attropen(path, attrpath, oflag, mode)) == -1) {
+    if ((filedes = open(path, O_RDONLY | (oflag & O_NOFOLLOW), mode)) == -1) {
         switch (errno) {
         case ENOENT:
         case EEXIST:
-            break;
+        case OPEN_NOFOLLOW_ERRNO:
+            EC_FAIL;
         default:
-            LOG(log_debug, logtype_default, "attropen(\"%s\", ea:'%s'): %s",
-                path, attrpath, strerror(errno));
-            errno = ENOATTR;
-            break;
+            LOG(log_debug, logtype_default, "open(\"%s\"): %s", fullpathname(path), strerror(errno));
+            EC_FAIL;
         }
        }
-       return filedes;
+
+       if ((eafd = openat(filedes, attrpath, oflag | O_XATTR, mode)) == -1) {
+        switch (errno) {
+        case ENOENT:
+        case EEXIST:
+            EC_FAIL;
+        default:
+            LOG(log_debug, logtype_default, "openat(\"%s\"): %s", fullpathname(path), strerror(errno));
+            EC_FAIL;
+        }
+       }
+    
+EC_CLEANUP:
+    if (filedes != -1)
+        close(filedes);
+    if (ret != 0) {
+        if (eafd != -1)
+            close(eafd);
+        eafd = -1;
+    }
+    return eafd;
 }
 
 static int solaris_openat(int fildes, const char *path, int oflag, mode_t mode)