Fixed read_directory(): Leave us stuck at EOF - GnomeVFS behaves that way.
[ntfsprogs-gnomevfs.git] / src / gnome-vfs-method.c
index 4d63b6f..0758d2e 100644 (file)
@@ -302,6 +302,9 @@ int i;
                        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)
 {
@@ -333,6 +336,32 @@ GnomeVFSFileInfo *file_info;
        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 */
@@ -371,6 +400,7 @@ s64 pos;
 
        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 {
@@ -379,10 +409,10 @@ s64 pos;
                                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;
 }