[gvfs] archive: Propagate entry index as inode no. for files
- From: Tomas Bzatek <tbzatek src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] archive: Propagate entry index as inode no. for files
- Date: Thu, 17 Mar 2011 17:29:33 +0000 (UTC)
commit cdc5849ea5067573a278c7d5f1a21c14c5b0686a
Author: Tomas Bzatek <tbzatek redhat com>
Date: Thu Mar 17 18:27:31 2011 +0100
archive: Propagate entry index as inode no. for files
This is the first step in making extraction faster. Some GIO-based
file managers like Nautilus sort files by inode number and making
copy/extraction faster (more linear read on disk, linear read from
archive).
For the archiving backend, let's give each file a number corresponding
with the position the file is stored in the archive. We can't use
native inode number stored in some types of archives as long as there
are no guarantees it reflects actual position in the file.
This change will have no effect until we make do_open_for_read() not
to close archive after reading and continue from the last position.
I'm afraid this concept would conflict with multiple accesses at one
time though.
daemon/gvfsbackendarchive.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
---
diff --git a/daemon/gvfsbackendarchive.c b/daemon/gvfsbackendarchive.c
index c9ac573..f2c278c 100644
--- a/daemon/gvfsbackendarchive.c
+++ b/daemon/gvfsbackendarchive.c
@@ -350,7 +350,8 @@ create_root_file (GVfsBackendArchive *ba)
static void
archive_file_set_info_from_entry (ArchiveFile * file,
- struct archive_entry *entry)
+ struct archive_entry *entry,
+ guint64 entry_index)
{
GFileInfo *info = g_file_info_new ();
GFileType type;
@@ -415,6 +416,12 @@ archive_file_set_info_from_entry (ArchiveFile * file,
g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH, FALSE);
g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, FALSE);
+ /* Set inode number to reflect absolute position in the archive. */
+ g_file_info_set_attribute_uint64 (info,
+ G_FILE_ATTRIBUTE_UNIX_INODE,
+ entry_index);
+
+
/* FIXME: add info for these
dev_t archive_entry_dev(struct archive_entry *);
dev_t archive_entry_devmajor(struct archive_entry *);
@@ -425,7 +432,6 @@ const char *archive_entry_fflags_text(struct archive_entry *);
gid_t archive_entry_gid(struct archive_entry *);
const char *archive_entry_gname(struct archive_entry *);
const char *archive_entry_hardlink(struct archive_entry *);
-ino_t archive_entry_ino(struct archive_entry *);
mode_t archive_entry_mode(struct archive_entry *);
unsigned int archive_entry_nlink(struct archive_entry *);
dev_t archive_entry_rdev(struct archive_entry *);
@@ -464,6 +470,7 @@ create_file_tree (GVfsBackendArchive *ba, GVfsJob *job)
GVfsArchive *archive;
struct archive_entry *entry;
int result;
+ guint64 entry_index = 0;
archive = gvfs_archive_new (ba, job);
@@ -485,8 +492,9 @@ create_file_tree (GVfsBackendArchive *ba, GVfsJob *job)
TRUE);
/* Don't set info for root */
if (file != ba->files)
- archive_file_set_info_from_entry (file, entry);
+ archive_file_set_info_from_entry (file, entry, entry_index);
archive_read_data_skip (archive->archive);
+ entry_index++;
}
}
while (result != ARCHIVE_FATAL && result != ARCHIVE_EOF);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]