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:
Gerasim Troeglazov
2009-09-12 11:43:55 +00:00
parent cc8605dc75
commit 9d034e38f1
+65 -71
View File
@@ -53,45 +53,44 @@ 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
*_type = S_IFREG;
// Regular or Interix (INTX) file. if (ni->flags & FILE_ATTR_SYSTEM) {
*_type = S_IFREG; na = ntfs_attr_open(ni, AT_DATA, NULL,0);
if (!na) {
return ENOENT;
}
// Check whether it's Interix symbolic link
if (na->data_size <= sizeof(INTX_FILE_TYPES) +
sizeof(ntfschar) * PATH_MAX &&
na->data_size > sizeof(INTX_FILE_TYPES)) {
INTX_FILE *intx_file;
na = ntfs_attr_open(ni, AT_DATA, NULL, 0); intx_file = ntfs_malloc(na->data_size);
if (!na) if (!intx_file) {
return ENOENT; ntfs_attr_close(na);
return EINVAL;
if (!(ni->flags & FILE_ATTR_HIDDEN)) { }
if (na->data_size == 0) if (ntfs_attr_pread(na, 0, na->data_size,
*_type = S_IFIFO; intx_file) != na->data_size) {
} free(intx_file);
ntfs_attr_close(na);
if (na->data_size <= sizeof(INTX_FILE_TYPES) + sizeof(ntfschar) * MAX_PATH return EINVAL;
&& na->data_size > sizeof(INTX_FILE_TYPES)) { }
INTX_FILE* intx_file; if (intx_file->magic == INTX_SYMBOLIC_LINK)
*_type = FS_SLNK_MODE;
intx_file = ntfs_malloc(na->data_size); free(intx_file);
if (!intx_file) { }
ntfs_attr_close(na); ntfs_attr_close(na);
return EINVAL;
} }
if (ntfs_attr_pread(na, 0, na->data_size, intx_file) != na->data_size) {
free(intx_file);
ntfs_attr_close(na);
return EINVAL;
}
if (intx_file->magic == INTX_SYMBOLIC_LINK)
*_type = S_IFLNK;
free(intx_file);
} }
ntfs_attr_close(na);
return B_OK; return B_OK;
} }
@@ -591,62 +590,56 @@ 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);
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);
result = ENOENT; if (!na) {
goto exit; result = ENOENT;
}
stbuf->st_size = na->data_size;
if (!(ni->flags & FILE_ATTR_HIDDEN)) {
if (na->data_size == 0)
stbuf->st_mode = S_IFIFO;
}
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 = ntfs_malloc(na->data_size);
if (!intx_file) {
result = EINVAL;
ntfs_attr_close(na);
goto exit; goto exit;
} }
if (ntfs_attr_pread(na, 0, na->data_size,intx_file) stbuf->st_size = na->data_size;
!= na->data_size) { stbuf->st_blocks = na->allocated_size >> 9;
result = EINVAL; // Check whether it's Interix symbolic link
if (na->data_size <= sizeof(INTX_FILE_TYPES) +
sizeof(ntfschar) * PATH_MAX &&
na->data_size > sizeof(INTX_FILE_TYPES)) {
INTX_FILE *intx_file;
intx_file = ntfs_malloc(na->data_size);
if (!intx_file) {
result = EINVAL;
ntfs_attr_close(na);
goto exit;
}
if (ntfs_attr_pread(na, 0, na->data_size,
intx_file) != na->data_size) {
result = EINVAL;
free(intx_file);
ntfs_attr_close(na);
goto exit;
}
if (intx_file->magic == INTX_SYMBOLIC_LINK)
stbuf->st_mode = FS_SLNK_MODE;
free(intx_file); free(intx_file);
ntfs_attr_close(na);
goto exit;
} }
if (intx_file->magic == INTX_SYMBOLIC_LINK) ntfs_attr_close(na);
stbuf->st_mode = FS_SLNK_MODE;
free(intx_file);
} }
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;