lib/replace: Return size of xattr if size argument is 0
[obnox/samba/samba-obnox.git] / lib / replace / xattr.c
index f5b178700183d6efdcda8183f2e9f7f50dec2d7a..a26ff674a13824bd9948a8949dc79e0e28905c60 100644 (file)
@@ -4,6 +4,8 @@
    Copyright (C) Jeremy Allison  1998-2005
    Copyright (C) Timur Bakeyev        2005
    Copyright (C) Bjoern Jacke    2006-2007
+   Copyright (C) Herb Lewis           2003
+   Copyright (C) Andrew Bartlett      2012
 
      ** NOTE! The following LGPL license applies to the replace
      ** library. This does NOT imply that all of Samba is released
@@ -69,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;
                }
@@ -86,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)
@@ -124,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;
                }
@@ -141,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;
@@ -250,7 +261,7 @@ static ssize_t bsd_attr_list (int type, extattr_arg arg, char *list, size_t size
 
 #endif
 
-#if defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H)
+#if defined(HAVE_ATTR_LIST) && (defined(HAVE_SYS_ATTRIBUTES_H) || defined(HAVE_ATTR_ATTRIBUTES_H))
 static char attr_buffer[ATTR_MAX_VALUELEN];
 
 static ssize_t irix_attr_list(const char *path, int filedes, char *list, size_t size, int flags)