diff options
author | Paulo Alcantara <pcacjr@gmail.com> | 2011-07-20 01:59:23 +0000 |
---|---|---|
committer | Paulo Alcantara <pcacjr@gmail.com> | 2011-09-07 07:19:06 +0000 |
commit | 67d3a82846f2029d24e2226be89e35848e5d78ba (patch) | |
tree | 1b7e2d282c98f410b14c116fbcdfe22326433765 | |
parent | 64bb9bac9ef39378179d5fae889bfaa188b7477c (diff) | |
download | syslinux-67d3a82846f2029d24e2226be89e35848e5d78ba.tar.gz syslinux-67d3a82846f2029d24e2226be89e35848e5d78ba.tar.xz syslinux-67d3a82846f2029d24e2226be89e35848e5d78ba.zip |
ntfs: implement get_inode_mode()
Determine the mode of an inode from a given file record.
Signed-off-by: Paulo Alcantara <pcacjr@gmail.com>
-rw-r--r-- | core/fs/ntfs/ntfs.c | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/core/fs/ntfs/ntfs.c b/core/fs/ntfs/ntfs.c index cc6a89d8..ffd1d1fe 100644 --- a/core/fs/ntfs/ntfs.c +++ b/core/fs/ntfs/ntfs.c @@ -258,41 +258,18 @@ out: return -1; } -static int index_inode_setup(struct fs_info *fs, unsigned long mft_no, - struct inode *inode) +static enum dirent_type get_inode_mode(MFT_RECORD *mrec) { - MFT_RECORD *mrec; - sector_t block = 0; ATTR_RECORD *attr; FILE_NAME_ATTR *fn; bool infile = false; uint32_t dir_mask, root_mask, file_mask; uint32_t dir, root, file; - uint32_t len; - INDEX_ROOT *ir; - uint32_t clust_size; - uint8_t *attr_len; - struct mapping_chunk chunk; - uint8_t *stream; - uint32_t offset; - int err; - - mrec = mft_record_lookup(mft_no, fs, &block); - if (!mrec) { - dprintf("No MFT record found!\n"); - goto out; - } - - NTFS_PVT(inode)->mft_no = mft_no; - NTFS_PVT(inode)->seq_no = mrec->seq_no; - - NTFS_PVT(inode)->start_cluster = block >> NTFS_SB(fs)->clust_shift; - NTFS_PVT(inode)->here = block; attr = attr_lookup(NTFS_AT_FILENAME, mrec); if (!attr) { dprintf("No attribute found!\n"); - goto out; + return DT_UNKNOWN; } fn = (FILE_NAME_ATTR *)((uint8_t *)attr + @@ -316,7 +293,44 @@ static int index_inode_setup(struct fs_info *fs, unsigned long mft_no, if (((!dir && root) || (!dir && !root)) && !file) infile = true; - if (!infile) { /* directory stuff */ + return infile ? DT_REG : DT_DIR; +} + +static int index_inode_setup(struct fs_info *fs, unsigned long mft_no, + struct inode *inode) +{ + MFT_RECORD *mrec; + sector_t block = 0; + ATTR_RECORD *attr; + enum dirent_type d_type; + uint32_t len; + INDEX_ROOT *ir; + uint32_t clust_size; + uint8_t *attr_len; + struct mapping_chunk chunk; + uint8_t *stream; + uint32_t offset; + int err; + + mrec = mft_record_lookup(mft_no, fs, &block); + if (!mrec) { + dprintf("No MFT record found!\n"); + goto out; + } + + NTFS_PVT(inode)->mft_no = mft_no; + NTFS_PVT(inode)->seq_no = mrec->seq_no; + + NTFS_PVT(inode)->start_cluster = block >> NTFS_SB(fs)->clust_shift; + NTFS_PVT(inode)->here = block; + + d_type = get_inode_mode(mrec); + if (d_type == DT_UNKNOWN) { + dprintf("Failed on determining inode's mode\n"); + goto out; + } + + if (d_type == DT_DIR) { /* directory stuff */ dprintf("Got a directory.\n"); attr = attr_lookup(NTFS_AT_INDEX_ROOT, mrec); if (!attr) { @@ -349,9 +363,7 @@ static int index_inode_setup(struct fs_info *fs, unsigned long mft_no, NTFS_PVT(inode)->itype.index.vcn_size = BLOCK_SIZE(fs); NTFS_PVT(inode)->itype.index.vcn_size_shift = BLOCK_SHIFT(fs); } - - inode->mode = DT_DIR; - } else { /* file stuff */ + } else if (d_type == DT_REG) { /* file stuff */ dprintf("Got a file.\n"); attr = attr_lookup(NTFS_AT_DATA, mrec); if (!attr) { @@ -401,10 +413,10 @@ static int index_inode_setup(struct fs_info *fs, unsigned long mft_no, NTFS_PVT(inode)->data.non_resident.lcn = chunk.cur_lcn; inode->size = attr->data.non_resident.initialized_size; } - - inode->mode = DT_REG; } + inode->mode = d_type; + return 0; out: |