Implement creating attributes, though still with a broken mapping loosing the type.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36296 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -230,13 +230,107 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
fs_create_attrib(fs_volume *_vol, fs_vnode *_node, const char* name, uint32 type, int openMode,
|
||||||
|
void** _cookie)
|
||||||
|
{
|
||||||
|
nspace *ns = (nspace*)_vol->private_volume;
|
||||||
|
vnode *node = (vnode*)_node->private_node;
|
||||||
|
attrcookie *cookie = NULL;
|
||||||
|
ntfschar *uname = NULL;
|
||||||
|
int ulen;
|
||||||
|
ntfs_inode *ni = NULL;
|
||||||
|
ntfs_attr *na = NULL;
|
||||||
|
status_t result = B_NO_ERROR;
|
||||||
|
|
||||||
|
ERRPRINT("%s - ENTER\n", __FUNCTION__);
|
||||||
|
|
||||||
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
|
if (node == NULL) {
|
||||||
|
result = EINVAL;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
ni = ntfs_inode_open(ns->ntvol, node->vnid);
|
||||||
|
if (ni == NULL) {
|
||||||
|
result = errno;
|
||||||
|
ERRPRINT("%s - inode_open: %s\n", __FUNCTION__, strerror(result));
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// UXA demangling TODO
|
||||||
|
|
||||||
|
// check for EA first... TODO: WRITEME
|
||||||
|
|
||||||
|
|
||||||
|
// check for a named stream
|
||||||
|
if (true) {
|
||||||
|
uname = ntfs_calloc(MAX_PATH);
|
||||||
|
ulen = ntfs_mbstoucs(name, &uname);
|
||||||
|
if (ulen < 0) {
|
||||||
|
result = EILSEQ;
|
||||||
|
ERRPRINT("%s - mb alloc: %s\n", __FUNCTION__, strerror(result));
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
||||||
|
if (na) {
|
||||||
|
result = EEXIST;
|
||||||
|
ERRPRINT("%s - ntfs_attr_open: %s\n", __FUNCTION__, strerror(result));
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (ntfs_non_resident_attr_record_add(ni, AT_DATA, uname, ulen, 0, 32, 0) < 0) {
|
||||||
|
result = errno;
|
||||||
|
ERRPRINT("%s - ntfs_non_resident_attr_record_add: %s\n", __FUNCTION__, strerror(result));
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
||||||
|
if (!na) {
|
||||||
|
result = errno;
|
||||||
|
ERRPRINT("%s - ntfs_attr_open: %s\n", __FUNCTION__, strerror(result));
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cookie = (attrcookie*)ntfs_calloc(sizeof(attrcookie));
|
||||||
|
|
||||||
|
if (cookie != NULL) {
|
||||||
|
cookie->omode = openMode;
|
||||||
|
*_cookie = (void*)cookie;
|
||||||
|
cookie->inode = ni;
|
||||||
|
cookie->stream = na;
|
||||||
|
ni = NULL;
|
||||||
|
na = NULL;
|
||||||
|
} else
|
||||||
|
result = ENOMEM;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (uname)
|
||||||
|
free(uname);
|
||||||
|
|
||||||
|
if (na)
|
||||||
|
ntfs_attr_close(na);
|
||||||
|
|
||||||
|
if (ni)
|
||||||
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
|
ERRPRINT("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
||||||
|
|
||||||
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name, int openMode, void **_cookie)
|
fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name, int openMode, void **_cookie)
|
||||||
{
|
{
|
||||||
nspace *ns = (nspace*)_vol->private_volume;
|
nspace *ns = (nspace*)_vol->private_volume;
|
||||||
vnode *node = (vnode*)_node->private_node;
|
vnode *node = (vnode*)_node->private_node;
|
||||||
attrcookie *cookie = NULL;
|
attrcookie *cookie = NULL;
|
||||||
ntfschar *unicode = NULL;
|
ntfschar *uname = NULL;
|
||||||
int ulen;
|
int ulen;
|
||||||
ntfs_inode *ni = NULL;
|
ntfs_inode *ni = NULL;
|
||||||
ntfs_attr *na = NULL;
|
ntfs_attr *na = NULL;
|
||||||
@@ -264,14 +358,14 @@ fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name, int openMode,
|
|||||||
|
|
||||||
// check for a named stream
|
// check for a named stream
|
||||||
if (true) {
|
if (true) {
|
||||||
unicode = ntfs_calloc(MAX_PATH);
|
uname = ntfs_calloc(MAX_PATH);
|
||||||
ulen = ntfs_mbstoucs(name, &unicode);
|
ulen = ntfs_mbstoucs(name, &uname);
|
||||||
if (ulen < 0) {
|
if (ulen < 0) {
|
||||||
result = EILSEQ;
|
result = EILSEQ;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
na = ntfs_attr_open(ni, AT_DATA, unicode, ulen);
|
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
||||||
if (na) {
|
if (na) {
|
||||||
if (openMode & O_TRUNC) {
|
if (openMode & O_TRUNC) {
|
||||||
if (ntfs_attr_truncate(na, 0))
|
if (ntfs_attr_truncate(na, 0))
|
||||||
@@ -294,8 +388,8 @@ fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name, int openMode,
|
|||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (unicode)
|
if (uname)
|
||||||
free(unicode);
|
free(uname);
|
||||||
|
|
||||||
if (na)
|
if (na)
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
status_t set_mime(vnode *node, const char *filename);
|
status_t set_mime(vnode *node, const char *filename);
|
||||||
|
|
||||||
|
status_t fs_create_attrib(fs_volume *_vol, fs_vnode *_node, const char* name, uint32 type, int openMode, void** _cookie);
|
||||||
status_t fs_open_attrib_dir(fs_volume *_vol, fs_vnode *_node, void **_cookie);
|
status_t fs_open_attrib_dir(fs_volume *_vol, fs_vnode *_node, void **_cookie);
|
||||||
status_t fs_close_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
status_t fs_close_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
||||||
status_t fs_free_attrib_dir_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
status_t fs_free_attrib_dir_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ fs_vnode_ops gNTFSVnodeOps = {
|
|||||||
&fs_rewind_attrib_dir,
|
&fs_rewind_attrib_dir,
|
||||||
|
|
||||||
/* attribute operations */
|
/* attribute operations */
|
||||||
NULL, //&fs_create_attr,
|
&fs_create_attrib,
|
||||||
&fs_open_attrib,
|
&fs_open_attrib,
|
||||||
&fs_close_attrib,
|
&fs_close_attrib,
|
||||||
&fs_free_attrib_cookie,
|
&fs_free_attrib_cookie,
|
||||||
|
|||||||
Reference in New Issue
Block a user