[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