FALSE); /* free_segment */
}
+/* Do not lock 'libntfs' here as we are already locked
+ * inside ntfs_readdir().
+ */
static int libntfs_gnomevfs_read_directory_filldir(struct libntfs_directory *libntfs_directory /* dirent */,
const uchar_t *name,const int name_len,const int name_type,const s64 pos,const MFT_REF mref,const unsigned dt_type)
{
if (file_info->type!=GNOME_VFS_FILE_TYPE_UNKNOWN)
file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
+ /* Detect 'file_info->size': */
+ if (file_info->type==GNOME_VFS_FILE_TYPE_REGULAR) {
+ntfs_inode *inode;
+
+ inode=ntfs_inode_open(libntfs_directory->inode->vol,mref);
+ /* FIXME: Check failed 'inode' open. */
+ if (inode) {
+ntfs_attr *attr;
+int errint;
+
+ attr=ntfs_attr_open(
+ inode, /* ni */
+ AT_DATA, /* type */
+ NULL, /* name */
+ 0); /* name_len */
+ /* FIXME: Check failed 'attr' open. */
+ if (attr) {
+ file_info->size=attr->data_size; /* FIXME: Is 'data_size' the right field? */
+ file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
+ ntfs_attr_close(attr);
+ }
+ errint=ntfs_inode_close(inode);
+ /* FIXME: Check 'errint'. */
+ }
+ }
+
libntfs_directory->file_info_list=g_list_prepend(libntfs_directory->file_info_list,file_info);
return 0; /* continue traversal */
if (!libntfs_directory->file_info_list->data) {
g_assert(libntfs_directory->file_info_list->next==NULL);
+ /* Do not clear the list to leave us stuck at EOF - GnomeVFS behaves that way. */
errvfsresult=GNOME_VFS_ERROR_EOF;
}
else {
file_info, /* dest */
libntfs_directory->file_info_list->data); /* src */
gnome_vfs_file_info_unref(libntfs_directory->file_info_list->data);
+ libntfs_directory->file_info_list=g_list_delete_link(
+ libntfs_directory->file_info_list,libntfs_directory->file_info_list);
errvfsresult=GNOME_VFS_OK;
}
- libntfs_directory->file_info_list=g_list_delete_link(
- libntfs_directory->file_info_list,libntfs_directory->file_info_list);
return errvfsresult;
}