[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-ntfs-cvs
Subject:    [Linux-NTFS-cvs] CVS: ntfsprogs/ntfsprogs ntfsmount.c,1.48,1.49
From:       Yura Pakhuchiy <cha0smaster () users ! sourceforge ! net>
Date:       2005-10-28 16:06:06
Message-ID: E1EVWk2-0006JQ-PA () sc8-pr-cvs1 ! sourceforge ! net
[Download RAW message or body]


Changes by: cha0smaster

Update of /cvsroot/linux-ntfs/ntfsprogs/ntfsprogs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24086/ntfsprogs

Modified Files:
	ntfsmount.c 
Log Message:
Add 'xattr' named data streams access interface.


Index: ntfsmount.c
===================================================================
RCS file: /cvsroot/linux-ntfs/ntfsprogs/ntfsprogs/ntfsmount.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -p -r1.48 -r1.49
--- ntfsmount.c	27 Oct 2005 13:01:58 -0000	1.48
+++ ntfsmount.c	28 Oct 2005 16:06:04 -0000	1.49
@@ -78,9 +78,7 @@ typedef struct {
 
 typedef enum {
 	NF_STREAMS_INTERFACE_NONE,	/* No access to named data streams. */
-#if 0
 	NF_STREAMS_INTERFACE_XATTR,	/* Map named data streams to xattrs. */
-#endif
 	NF_STREAMS_INTERFACE_WINDOWS,	/* "file:stream" interface. */
 } ntfs_fuse_streams_interface;
 
@@ -864,16 +862,18 @@ static int ntfs_fuse_utime(const char *p
 
 #ifdef HAVE_SETXATTR
 
-static int ntfs_fuse_getxattr(const char *path, const char *name,
-				char *value, size_t size)
+static const char nf_ns_xattr_preffix[] = "user.";
+static const int nf_ns_xattr_preffix_len = 5;
+
+static int ntfs_fuse_listxattr(const char *path, char *list, size_t size)
 {
 	ntfs_attr_search_ctx *actx = NULL;
 	ntfs_volume *vol;
 	ntfs_inode *ni;
-	char *to = value;
+	char *to = list;
 	int ret = 0;
 
-	if (strcmp(name, "ntfs.streams.list"))
+	if (ctx->streams != NF_STREAMS_INTERFACE_XATTR)
 		return -EOPNOTSUPP;
 	vol = ctx->vol;
 	if (!vol)
@@ -901,17 +901,20 @@ static int ntfs_fuse_getxattr(const char
 			ret = -errno;
 			goto exit;
 		}
-		if (ret)
-			ret++; /* For space delimiter. */
-		ret += tmp_name_len;
-		if ((size_t)ret <= size) {
-			/* Don't add space to the beginning of line. */
-			if (to != value) {
-				*to = ' ';
+		ret += tmp_name_len + nf_ns_xattr_preffix_len + 1;
+		if (size) {
+			if ((size_t)ret <= size) {
+				strcpy(to, nf_ns_xattr_preffix);
+				to += nf_ns_xattr_preffix_len;
+				strncpy(to, tmp_name, tmp_name_len);
+				to += tmp_name_len;
+				*to = 0;
 				to++;
+			} else {
+				free(tmp_name);
+				ret = -ERANGE;
+				goto exit;
 			}
-			strncpy(to, tmp_name, tmp_name_len);
-			to += tmp_name_len;
 		}
 		free(tmp_name);
 	}
@@ -921,26 +924,21 @@ exit:
 	if (actx)
 		ntfs_attr_put_search_ctx(actx);
 	ntfs_inode_close(ni);
+	fprintf(stderr, "return %d\n", ret);
 	return ret;
 }
 
-#if 0
-/* If this will be enabled, need to fix bug before.  (bug description below) */
-
-static const char nf_ns_streams[] = "user.stream.";
-static const int nf_ns_streams_len = 12;
-
-static const char nf_ns_eas[] = "user.ea.";
-static const int nf_ns_eas_len = 8;
-
-static int ntfs_fuse_listxattr(const char *path, char *list, size_t size)
+static int ntfs_fuse_getxattr_windows(const char *path, const char *name,
+				char *value, size_t size)
 {
 	ntfs_attr_search_ctx *actx = NULL;
 	ntfs_volume *vol;
 	ntfs_inode *ni;
-	char *to = list;
+	char *to = value;
 	int ret = 0;
 
+	if (strcmp(name, "ntfs.streams.list"))
+		return -EOPNOTSUPP;
 	vol = ctx->vol;
 	if (!vol)
 		return -ENODEV;
@@ -955,26 +953,37 @@ static int ntfs_fuse_listxattr(const cha
 	}
 	while (!ntfs_attr_lookup(AT_DATA, NULL, 0, CASE_SENSITIVE,
 				0, NULL, 0, actx)) {
+		char *tmp_name = NULL;
+		int tmp_name_len;
+
 		if (!actx->attr->name_length)
 			continue;
-		ret += actx->attr->name_length + nf_ns_streams_len + 1;
-		if (size && (size_t)ret <= size) {
-			strcpy(to, nf_ns_streams);
-			to += nf_ns_streams_len;
-			/*
-			 * BUG: destination buffer length can be bigger than
-			 * actx->attr->name_length + 1.  (eg. internatinal
-			 * characters in utf8)
-			 */
-			if (ntfs_ucstombs((ntfschar *)((u8*)actx->attr +
-					le16_to_cpu(actx->attr->name_offset)),
-					actx->attr->name_length, &to,
-					actx->attr->name_length + 1) < 0) {
-				ret = -errno;
+		tmp_name_len = ntfs_ucstombs((ntfschar *)((u8*)actx->attr +
+				le16_to_cpu(actx->attr->name_offset)),
+				actx->attr->name_length, &tmp_name, 0);
+		if (tmp_name_len < 0) {
+			ret = -errno;
+			goto exit;
+		}
+		if (ret)
+			ret++; /* For space delimiter. */
+		ret += tmp_name_len;
+		if (size) {
+			if ((size_t)ret <= size) {
+				/* Don't add space to the beginning of line. */
+				if (to != value) {
+					*to = ' ';
+					to++;
+				}
+				strncpy(to, tmp_name, tmp_name_len);
+				to += tmp_name_len;
+			} else {
+				free(tmp_name);
+				ret = -ERANGE;
 				goto exit;
 			}
-			to += actx->attr->name_length + 1;
 		}
+		free(tmp_name);
 	}
 	if (errno != ENOENT)
 		ret = -errno;
@@ -982,7 +991,6 @@ exit:
 	if (actx)
 		ntfs_attr_put_search_ctx(actx);
 	ntfs_inode_close(ni);
-	fprintf(stderr, "return %d\n", ret);
 	return ret;
 }
 
@@ -992,11 +1000,15 @@ static int ntfs_fuse_getxattr(const char
 	ntfs_volume *vol;
 	ntfs_inode *ni;
 	ntfs_attr *na = NULL;
-	int res;
 	ntfschar *lename = NULL;
+	int res, lename_len;
 
-	if (strncmp(name, nf_ns_streams, nf_ns_streams_len) ||
-			strlen(name) == (size_t)nf_ns_streams_len)
+	if (ctx->streams == NF_STREAMS_INTERFACE_WINDOWS)
+		return ntfs_fuse_getxattr_windows(path, name, value, size);
+	if (ctx->streams != NF_STREAMS_INTERFACE_XATTR)
+		return -EOPNOTSUPP;
+	if (strncmp(name, nf_ns_xattr_preffix, nf_ns_xattr_preffix_len) ||
+			strlen(name) == (size_t)nf_ns_xattr_preffix_len)
 		return -ENODATA;
 	vol = ctx->vol;
 	if (!vol)
@@ -1004,12 +1016,12 @@ static int ntfs_fuse_getxattr(const char
 	ni = ntfs_pathname_to_inode(vol, NULL, path);
 	if (!ni)
 		return -errno;
-	if (ntfs_mbstoucs(name + nf_ns_streams_len, &lename, 0) == -1) {
+	lename_len = ntfs_mbstoucs(name + nf_ns_xattr_preffix_len, &lename, 0);
+	if (lename_len == -1) {
 		res = -errno;
 		goto exit;
 	}
-	na = ntfs_attr_open(ni, AT_DATA, lename,
-			strlen(name) - nf_ns_streams_len);
+	na = ntfs_attr_open(ni, AT_DATA, lename, lename_len);
 	if (!na) {
 		res = -ENODATA;
 		goto exit;
@@ -1038,11 +1050,13 @@ static int ntfs_fuse_setxattr(const char
 	ntfs_volume *vol;
 	ntfs_inode *ni;
 	ntfs_attr *na = NULL;
-	int res;
 	ntfschar *lename = NULL;
+	int res, lename_len;
 
-	if (strncmp(name, nf_ns_streams, nf_ns_streams_len) ||
-			strlen(name) == (size_t)nf_ns_streams_len)
+	if (ctx->streams != NF_STREAMS_INTERFACE_XATTR)
+		return -EOPNOTSUPP;
+	if (strncmp(name, nf_ns_xattr_preffix, nf_ns_xattr_preffix_len) ||
+			strlen(name) == (size_t)nf_ns_xattr_preffix_len)
 		return -EACCES;
 	vol = ctx->vol;
 	if (!vol)
@@ -1050,12 +1064,12 @@ static int ntfs_fuse_setxattr(const char
 	ni = ntfs_pathname_to_inode(vol, NULL, path);
 	if (!ni)
 		return -errno;
-	if (ntfs_mbstoucs(name + nf_ns_streams_len, &lename, 0) == -1) {
+	lename_len = ntfs_mbstoucs(name + nf_ns_xattr_preffix_len, &lename, 0);
+	if (lename_len == -1) {
 		res = -errno;
 		goto exit;
 	}
-	na = ntfs_attr_open(ni, AT_DATA, lename,
-			strlen(name) - nf_ns_streams_len);
+	na = ntfs_attr_open(ni, AT_DATA, lename, lename_len);
 	if (na && flags == XATTR_CREATE) {
 		res = -EEXIST;
 		goto exit;
@@ -1065,8 +1079,11 @@ static int ntfs_fuse_setxattr(const char
 			res = -ENODATA;
 			goto exit;
 		}
-		na = ntfs_attr_add(ni, AT_DATA, lename, strlen(name) -
-				nf_ns_streams_len, 0);
+		if (ntfs_attr_add(ni, AT_DATA, lename, lename_len, NULL, 0)) {
+			res = -errno;
+			goto exit;
+		}
+		na = ntfs_attr_open(ni, AT_DATA, lename, lename_len);
 		if (!na) {
 			res = -errno;
 			goto exit;
@@ -1091,11 +1108,14 @@ static int ntfs_fuse_removexattr(const c
 	ntfs_volume *vol;
 	ntfs_inode *ni;
 	ntfs_attr *na = NULL;
-	int res = 0;
 	ntfschar *lename = NULL;
+	int res = 0, lename_len;
+
 
-	if (strncmp(name, nf_ns_streams, nf_ns_streams_len) ||
-			strlen(name) == (size_t)nf_ns_streams_len)
+	if (ctx->streams != NF_STREAMS_INTERFACE_XATTR)
+		return -EOPNOTSUPP;
+	if (strncmp(name, nf_ns_xattr_preffix, nf_ns_xattr_preffix_len) ||
+			strlen(name) == (size_t)nf_ns_xattr_preffix_len)
 		return -ENODATA;
 	vol = ctx->vol;
 	if (!vol)
@@ -1103,12 +1123,12 @@ static int ntfs_fuse_removexattr(const c
 	ni = ntfs_pathname_to_inode(vol, NULL, path);
 	if (!ni)
 		return -errno;
-	if (ntfs_mbstoucs(name + nf_ns_streams_len, &lename, 0) == -1) {
+	lename_len = ntfs_mbstoucs(name + nf_ns_xattr_preffix_len, &lename, 0);
+	if (lename_len == -1) {
 		res = -errno;
 		goto exit;
 	}
-	na = ntfs_attr_open(ni, AT_DATA, lename,
-			strlen(name) - nf_ns_streams_len);
+	na = ntfs_attr_open(ni, AT_DATA, lename, lename_len);
 	if (!na) {
 		res = -ENODATA;
 		goto exit;
@@ -1126,8 +1146,6 @@ exit:
 	return res;
 }
 
-#endif /* 0 */
-
 #endif /* HAVE_SETXATTR */
 
 static struct fuse_operations ntfs_fuse_oper = {
@@ -1148,11 +1166,9 @@ static struct fuse_operations ntfs_fuse_
 	.utime		= ntfs_fuse_utime,
 #ifdef HAVE_SETXATTR
 	.getxattr	= ntfs_fuse_getxattr,
-#if 0
 	.setxattr	= ntfs_fuse_setxattr,
 	.removexattr	= ntfs_fuse_removexattr,
 	.listxattr	= ntfs_fuse_listxattr,
-#endif /* 0 */
 #endif /* HAVE_SETXATTR */
 };
 
@@ -1325,10 +1341,8 @@ static char *parse_mount_options(const c
 			}
 			if (!strcmp(val, "none"))
 				ctx->streams = NF_STREAMS_INTERFACE_NONE;
-#if 0
 			else if (!strcmp(val, "xattr"))
 				ctx->streams = NF_STREAMS_INTERFACE_XATTR;
-#endif
 			else if (!strcmp(val, "windows"))
 				ctx->streams = NF_STREAMS_INTERFACE_WINDOWS;
 			else {



-------------------------------------------------------
This SF.Net email is sponsored by the JBoss Inc.
Get Certified Today * Register for a JBoss Training Course
Free Certification Exam for All Training Attendees Through End of 2005
Visit http://www.jboss.com/services/certification for more information
_______________________________________________
Linux-NTFS-cvs mailing list
Linux-NTFS-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-ntfs-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic