Fixed a bug from ticket 4462. (fs_rstat returns an incorrect value).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33091 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -53,44 +53,43 @@ get_node_type(ntfs_inode* ni, int* _type)
|
|||||||
{
|
{
|
||||||
ntfs_attr* na;
|
ntfs_attr* na;
|
||||||
|
|
||||||
// get the node type
|
|
||||||
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
|
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
|
||||||
|
// Directory
|
||||||
*_type = S_IFDIR;
|
*_type = S_IFDIR;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
} else {
|
||||||
|
// Regular or Interix (INTX) file
|
||||||
// Regular or Interix (INTX) file.
|
|
||||||
*_type = S_IFREG;
|
*_type = S_IFREG;
|
||||||
|
|
||||||
na = ntfs_attr_open(ni, AT_DATA, NULL, 0);
|
if (ni->flags & FILE_ATTR_SYSTEM) {
|
||||||
if (!na)
|
na = ntfs_attr_open(ni, AT_DATA, NULL,0);
|
||||||
|
if (!na) {
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
|
|
||||||
if (!(ni->flags & FILE_ATTR_HIDDEN)) {
|
|
||||||
if (na->data_size == 0)
|
|
||||||
*_type = S_IFIFO;
|
|
||||||
}
|
}
|
||||||
|
// Check whether it's Interix symbolic link
|
||||||
if (na->data_size <= sizeof(INTX_FILE_TYPES) + sizeof(ntfschar) * MAX_PATH
|
if (na->data_size <= sizeof(INTX_FILE_TYPES) +
|
||||||
&& na->data_size > sizeof(INTX_FILE_TYPES)) {
|
sizeof(ntfschar) * PATH_MAX &&
|
||||||
INTX_FILE* intx_file;
|
na->data_size > sizeof(INTX_FILE_TYPES)) {
|
||||||
|
INTX_FILE *intx_file;
|
||||||
|
|
||||||
intx_file = ntfs_malloc(na->data_size);
|
intx_file = ntfs_malloc(na->data_size);
|
||||||
if (!intx_file) {
|
if (!intx_file) {
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
if (ntfs_attr_pread(na, 0, na->data_size, intx_file) != na->data_size) {
|
if (ntfs_attr_pread(na, 0, na->data_size,
|
||||||
|
intx_file) != na->data_size) {
|
||||||
free(intx_file);
|
free(intx_file);
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
if (intx_file->magic == INTX_SYMBOLIC_LINK)
|
if (intx_file->magic == INTX_SYMBOLIC_LINK)
|
||||||
*_type = S_IFLNK;
|
*_type = FS_SLNK_MODE;
|
||||||
free(intx_file);
|
free(intx_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -591,42 +590,35 @@ fs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *stbuf)
|
|||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
stbuf->st_dev = ns->id;
|
|
||||||
stbuf->st_ino = MREF(ni->mft_no);
|
|
||||||
|
|
||||||
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
|
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
|
||||||
|
// Directory
|
||||||
stbuf->st_mode = FS_DIR_MODE;
|
stbuf->st_mode = FS_DIR_MODE;
|
||||||
na = ntfs_attr_open(ni, AT_INDEX_ALLOCATION, NTFS_INDEX_I30, 4);
|
na = ntfs_attr_open(ni, AT_INDEX_ALLOCATION, NTFS_INDEX_I30, 4);
|
||||||
if (na) {
|
if (na) {
|
||||||
stbuf->st_size = na->data_size;
|
stbuf->st_size = na->data_size;
|
||||||
|
stbuf->st_blocks = na->allocated_size >> 9;
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
} else {
|
|
||||||
stbuf->st_size = 0;
|
|
||||||
}
|
}
|
||||||
stbuf->st_nlink = 1; // Needed for correct find work.
|
stbuf->st_nlink = 1;
|
||||||
} else {
|
} else {
|
||||||
// Regular or Interix (INTX) file.
|
// Regular or Interix (INTX) file
|
||||||
stbuf->st_mode = FS_FILE_MODE;
|
stbuf->st_mode = FS_FILE_MODE;
|
||||||
stbuf->st_size = ni->data_size;
|
stbuf->st_size = ni->data_size;
|
||||||
|
stbuf->st_blocks = (ni->allocated_size + 511) >> 9;
|
||||||
stbuf->st_nlink = le16_to_cpu(ni->mrec->link_count);
|
stbuf->st_nlink = le16_to_cpu(ni->mrec->link_count);
|
||||||
|
|
||||||
|
if (ni->flags & FILE_ATTR_SYSTEM) {
|
||||||
na = ntfs_attr_open(ni, AT_DATA, NULL,0);
|
na = ntfs_attr_open(ni, AT_DATA, NULL,0);
|
||||||
if (!na) {
|
if (!na) {
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
stbuf->st_size = na->data_size;
|
stbuf->st_size = na->data_size;
|
||||||
|
stbuf->st_blocks = na->allocated_size >> 9;
|
||||||
if (!(ni->flags & FILE_ATTR_HIDDEN)) {
|
// Check whether it's Interix symbolic link
|
||||||
if (na->data_size == 0)
|
if (na->data_size <= sizeof(INTX_FILE_TYPES) +
|
||||||
stbuf->st_mode = S_IFIFO;
|
sizeof(ntfschar) * PATH_MAX &&
|
||||||
}
|
na->data_size > sizeof(INTX_FILE_TYPES)) {
|
||||||
|
|
||||||
if (na->data_size <= sizeof(INTX_FILE_TYPES)
|
|
||||||
+ sizeof(ntfschar) * MAX_PATH
|
|
||||||
&& na->data_size >sizeof(INTX_FILE_TYPES)) {
|
|
||||||
INTX_FILE *intx_file;
|
INTX_FILE *intx_file;
|
||||||
|
|
||||||
intx_file = ntfs_malloc(na->data_size);
|
intx_file = ntfs_malloc(na->data_size);
|
||||||
@@ -635,8 +627,8 @@ fs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *stbuf)
|
|||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
if (ntfs_attr_pread(na, 0, na->data_size,intx_file)
|
if (ntfs_attr_pread(na, 0, na->data_size,
|
||||||
!= na->data_size) {
|
intx_file) != na->data_size) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
free(intx_file);
|
free(intx_file);
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
@@ -647,6 +639,7 @@ fs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *stbuf)
|
|||||||
free(intx_file);
|
free(intx_file);
|
||||||
}
|
}
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
|
}
|
||||||
stbuf->st_mode |= 0666;
|
stbuf->st_mode |= 0666;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -656,6 +649,7 @@ fs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *stbuf)
|
|||||||
|
|
||||||
stbuf->st_uid = 0;
|
stbuf->st_uid = 0;
|
||||||
stbuf->st_gid = 0;
|
stbuf->st_gid = 0;
|
||||||
|
stbuf->st_ino = MREF(ni->mft_no);
|
||||||
stbuf->st_atime = ni->last_access_time;
|
stbuf->st_atime = ni->last_access_time;
|
||||||
stbuf->st_ctime = ni->last_mft_change_time;
|
stbuf->st_ctime = ni->last_mft_change_time;
|
||||||
stbuf->st_mtime = ni->last_data_change_time;
|
stbuf->st_mtime = ni->last_data_change_time;
|
||||||
@@ -797,10 +791,10 @@ fs_open(fs_volume *_vol, fs_vnode *_node, int omode, void **_cookie)
|
|||||||
ntfs_attr *na = NULL;
|
ntfs_attr *na = NULL;
|
||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
|
|
||||||
LOCK_VOL(ns);
|
|
||||||
|
|
||||||
ERRPRINT("fs_open - ENTER\n");
|
ERRPRINT("fs_open - ENTER\n");
|
||||||
|
|
||||||
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
if (node == NULL) {
|
if (node == NULL) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|||||||
Reference in New Issue
Block a user