svn commit: samba r11841 - in branches/SAMBA_3_0/source/lib: .

jra at samba.org jra at samba.org
Tue Nov 22 06:04:01 GMT 2005


Author: jra
Date: 2005-11-22 06:04:00 +0000 (Tue, 22 Nov 2005)
New Revision: 11841

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=11841

Log:
Fix #3262 from Timur Bakeyev to improve reporting on FreeBSD DOS
attribute errors.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/lib/system.c


Changeset:
Modified: branches/SAMBA_3_0/source/lib/system.c
===================================================================
--- branches/SAMBA_3_0/source/lib/system.c	2005-11-22 05:21:29 UTC (rev 11840)
+++ branches/SAMBA_3_0/source/lib/system.c	2005-11-22 06:04:00 UTC (rev 11841)
@@ -1370,6 +1370,8 @@
  support for IRIX and (Net|Free)BSD also. Expand as other systems have them.
 ****************************************************************************/
 
+/* Possible error codes are: ENOATTR, ERANGE, ENOTSUP. From stat(2): 
+   EBADF, ENOENT, ENOTDIR, ELOOP, EFAULT, EACCES, ENOMEM, ENAMETOOLONG. */
 ssize_t sys_getxattr (const char *path, const char *name, void *value, size_t size)
 {
 #if defined(HAVE_GETXATTR)
@@ -1385,18 +1387,17 @@
 	 * the returned value to the size of the buffer, so we have to check
 	 * that the buffer is large enough to fit the returned value.
 	 */
-	retval = extattr_get_file(path, attrnamespace, attrname, NULL, 0);
-
-	if (retval == -1) {
-		return -1;
+	if((retval=extattr_get_file(path, attrnamespace, attrname, NULL, 0)) >= 0) {
+		if(retval > size) {
+			errno = ERANGE;
+			return -1;
+		}
+		if((retval=extattr_get_file(path, attrnamespace, attrname, value, size)) >= 0)
+			return retval;
 	}
 
-	if(retval > size) {
-		errno = ERANGE;
-		return -1;
-	}
-
-	return extattr_get_file(path, attrnamespace, attrname, value, size);
+	DEBUG(10,("sys_getxattr: extattr_get_file() failed with: %s\n", strerror(errno)));
+	return -1;
 #elif defined(HAVE_ATTR_GET)
 	int retval, flags = 0;
 	int valuelength = (int)size;
@@ -1424,18 +1425,17 @@
 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
 	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
 
-	retval = extattr_get_link(path, attrnamespace, attrname, NULL, 0);
-
-	if (retval == -1) {
-		return -1;
+	if((retval=extattr_get_link(path, attrnamespace, attrname, NULL, 0)) >= 0) {
+		if(retval > size) {
+			errno = ERANGE;
+			return -1;
+		}
+		if((retval=extattr_get_link(path, attrnamespace, attrname, value, size)) >= 0)
+			return retval;
 	}
-
-	if(retval > size) {
-		errno = ERANGE;
-		return -1;
-	}
-
-	return extattr_get_link(path, attrnamespace, attrname, value, size);
+	
+	DEBUG(10,("sys_lgetxattr: extattr_get_link() failed with: %s\n", strerror(errno)));
+	return -1;
 #elif defined(HAVE_ATTR_GET)
 	int retval, flags = ATTR_DONTFOLLOW;
 	int valuelength = (int)size;
@@ -1463,18 +1463,17 @@
 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
 	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
 
-	retval = extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0);
-
-	if (retval == -1) {
-		return -1;
+	if((retval=extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0)) >= 0) {
+		if(retval > size) {
+			errno = ERANGE;
+			return -1;
+		}
+		if((retval=extattr_get_fd(filedes, attrnamespace, attrname, value, size)) >= 0)
+			return retval;
 	}
-
-	if(retval > size) {
-		errno = ERANGE;
-		return -1;
-	}
-
-	return extattr_get_fd(filedes, attrnamespace, attrname, value, size);
+	
+	DEBUG(10,("sys_fgetxattr: extattr_get_fd() failed with: %s\n", strerror(errno)));
+	return -1;
 #elif defined(HAVE_ATTR_GETF)
 	int retval, flags = 0;
 	int valuelength = (int)size;
@@ -1566,7 +1565,7 @@
 			errno = ERANGE;
 			return -1;
 		}
-		/* Shift the results back, so we can prepend prefixes */
+		/* Shift results back, so we can prepend prefixes */
 		buf = memmove(list + len, list, list_size);
 
 		for(i = 0; i < list_size; i += len + 1) {
@@ -1652,6 +1651,8 @@
 
 #endif
 
+/* Possible error codes are: ERANGE, ENOTSUP. From stat(2): 
+   EBADF, ENOENT, ENOTDIR, ELOOP, EFAULT, EACCES, ENOMEM, ENAMETOOLONG. */
 ssize_t sys_listxattr (const char *path, char *list, size_t size)
 {
 #if defined(HAVE_LISTXATTR)
@@ -1700,6 +1701,8 @@
 #endif
 }
 
+/* Possible error codes are: ENOATTR, ENOTSUP. From stat(2): 
+   EBADF, ENOENT, ENOTDIR, ELOOP, EFAULT, EACCES, ENOMEM, ENAMETOOLONG. */
 int sys_removexattr (const char *path, const char *name)
 {
 #if defined(HAVE_REMOVEXATTR)
@@ -1777,6 +1780,8 @@
 #define XATTR_REPLACE 0x2       /* set value, fail if attr does not exist */
 #endif
 
+/* Possible error codes are: EEXIST, ENOATTR, ENOSPC, EDQUOT, ENOTSUP. From 
+   stat(2): EBADF, ENOENT, ENOTDIR, ELOOP, EFAULT, EACCES, ENOMEM, ENAMETOOLONG. */
 int sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags)
 {
 #if defined(HAVE_SETXATTR)
@@ -1796,6 +1801,7 @@
 				errno = ENOATTR;
 				return -1;
 			}
+			/* Ignore other errors */
 		}
 		else {
 			/* CREATE attribute, that already exists */
@@ -1841,6 +1847,7 @@
 				errno = ENOATTR;
 				return -1;
 			}
+			/* Ignore other errors */
 		}
 		else {
 			/* CREATE attribute, that already exists */
@@ -1887,6 +1894,7 @@
 				errno = ENOATTR;
 				return -1;
 			}
+			/* Ignore other errors */
 		}
 		else {
 			/* CREATE attribute, that already exists */



More information about the samba-cvs mailing list