lib/replace: Return size of xattr if size argument is 0
authorAndrew Bartlett <abartlet@samba.org>
Sat, 27 Oct 2012 08:15:58 +0000 (19:15 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 28 Oct 2012 05:32:42 +0000 (16:32 +1100)
This makes rep_{f,}getxattr a more complete replacement for the linux function.

Andrew Bartlett

lib/replace/xattr.c

index 8e1c989a3d317cec90f962c5a14b45cd9f1b2f98..a26ff674a13824bd9948a8949dc79e0e28905c60 100644 (file)
@@ -71,7 +71,9 @@ ssize_t rep_getxattr (const char *path, const char *name, void *value, size_t si
         * that the buffer is large enough to fit the returned value.
         */
        if((retval=extattr_get_file(path, attrnamespace, attrname, NULL, 0)) >= 0) {
-               if(retval > size) {
+               if (size == 0) {
+                       return retval;
+               } else if (retval > size) {
                        errno = ERANGE;
                        return -1;
                }
@@ -88,6 +90,9 @@ ssize_t rep_getxattr (const char *path, const char *name, void *value, size_t si
        if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;
 
        retval = attr_get(path, attrname, (char *)value, &valuelength, flags);
+       if (size == 0 && retval == -1 && errno == E2BIG) {
+               return valuelength;
+       }
 
        return retval ? retval : valuelength;
 #elif defined(HAVE_ATTROPEN)
@@ -126,7 +131,9 @@ ssize_t rep_fgetxattr (int filedes, const char *name, void *value, size_t size)
        const char *attrname = ((s=strchr(name, '.')) == NULL) ? name : s + 1;
 
        if((retval=extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0)) >= 0) {
-               if(retval > size) {
+               if (size == 0) {
+                       return retval;
+               } else if (retval > size) {
                        errno = ERANGE;
                        return -1;
                }
@@ -143,7 +150,9 @@ ssize_t rep_fgetxattr (int filedes, const char *name, void *value, size_t size)
        if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;
 
        retval = attr_getf(filedes, attrname, (char *)value, &valuelength, flags);
-
+       if (size == 0 && retval == -1 && errno == E2BIG) {
+               return valuelength;
+       }
        return retval ? retval : valuelength;
 #elif defined(HAVE_ATTROPEN)
        ssize_t ret = -1;