]> wimlib.net Git - wimlib/blobdiff - src/dentry.h
calculate_sha1sum_of_staging_file
[wimlib] / src / dentry.h
index 3a3432eadbeafe36a41839235404b53b33884d2f..b6aa966f0501f2d568f879bcfc17c0ee3385c1d8 100644 (file)
@@ -52,10 +52,18 @@ typedef struct WIMStruct WIMStruct;
 #define FILE_ATTRIBUTE_ENCRYPTED           0x00004000
 #define FILE_ATTRIBUTE_VIRTUAL             0x00010000
 
+struct lookup_table_entry;
+
 /* Alternate data stream entry */
 struct ads_entry {
-       /* SHA-1 message digest of stream contents */
-       u8 hash[WIM_HASH_SIZE];
+       union {
+               /* SHA-1 message digest of stream contents */
+               u8 hash[WIM_HASH_SIZE];
+
+               /* The corresponding lookup table entry (only for resolved
+                * streams) */
+               struct lookup_table_entry *lte;
+       };
 
        /* Length of stream name (UTF-16) */
        u16 stream_name_len;
@@ -68,6 +76,8 @@ struct ads_entry {
 
        /* Stream name (UTF-8) */
        char *stream_name_utf8;
+
+       struct stream_list_head lte_group_list;
 };
 
 static inline u64 ads_entry_length(const struct ads_entry *entry)
@@ -114,7 +124,6 @@ struct dentry {
         * included only the length field, but that takes up 8 bytes. */
        u64 length;
 
-
        /* The file attributes associated with this file. */
        u32 attributes;
 
@@ -127,10 +136,6 @@ struct dentry {
         * entry's child files.  0 if the directory entry has no children. */
        u64 subdir_offset;
 
-       /* Reserved for future disuse.  Currently ignoring these fields. */
-       u64 unused1;
-       u64 unused2;
-
        /* Timestamps for the entry.  The timestamps are the number of
         * 100-nanosecond intervals that have elapsed since 12:00 A.M., January
         * 1st, 1601, UTC. */
@@ -138,8 +143,20 @@ struct dentry {
        u64 last_access_time;
        u64 last_write_time;
 
-       /* A hash of the file's contents. */
-       u8 hash[WIM_HASH_SIZE];
+       /* true if the dentry's lookup table entry has been resolved (i.e. the
+        * @lte field is invalid, but the @hash field is not valid) */
+       bool resolved;
+
+       /* A hash of the file's contents, or a pointer to the lookup table entry
+        * for this dentry if the lookup table entries have been resolved.
+        *
+        * More specifically, this is for the un-named default file stream, as
+        * opposed to the alternate file streams, which may have their own
+        * lookup table entries.  */
+       union {
+               u8 hash[WIM_HASH_SIZE];
+               struct lookup_table_entry *lte;
+       };
 
        /* Identity of a reparse point.  See
         * http://msdn.microsoft.com/en-us/library/windows/desktop/aa365503(v=vs.85).aspx
@@ -153,14 +170,6 @@ struct dentry {
         * read_dentry() function. */
        //u32 reparse_reserved;
 
-       /* If the reparse_reserved field existed, there would be a 4-byte gap
-        * here to align hard_link on an 8-byte field.  However,
-        * reparse_reserved does not actually exist, so there is no gap here. */
-
-       /* If the file is part of a hard link set, all the directory entries in
-        * the set will share the same value for this field. */
-       u64 hard_link;
-
        /* Number of alternate data streams associated with this file. */
        u16 num_ads;
 
@@ -202,18 +211,39 @@ struct dentry {
                u32 num_times_opened;
        };
 
-       /* List of dentries in the hard link set */
+       /* If the file is part of a hard link set, all the directory entries in
+        * the set will share the same value for this field. */
+       u64 hard_link;
+
        enum {
-               GROUP_INDEPENDENT,
+               /* This dentry is the owner of its ads_entries, although it may
+                * be in a hard link set */
+               GROUP_INDEPENDENT = 0,
+
+               /* This dentry is the owner of the ads_entries in the hard link
+                * set */
                GROUP_MASTER,
+
+               /* This dentry shares its ads_entries with a dentry in the hard
+                * link set that has GROUP_MASTER set. */
                GROUP_SLAVE
        } link_group_master_status;
+
+
+       /* List of dentries in the hard link set */
        struct list_head link_group_list;
+
+       /* List of dentries sharing the same lookup table entry */
+       struct stream_list_head lte_group_list;
+
+       /* Path to extracted file on disk (used during extraction only) */
+       char *extracted_file;
 };
 
 /* Return hash of the "unnamed" (default) data stream. */
 static inline const u8 *dentry_hash(const struct dentry *dentry)
 {
+       wimlib_assert(!dentry->resolved);
        /* If there are alternate data streams, the dentry hash field is zeroed
         * out, and we need to find the hash in the un-named data stream (should
         * be the first one, but check them in order just in case, and fall back
@@ -224,6 +254,18 @@ static inline const u8 *dentry_hash(const struct dentry *dentry)
        return dentry->hash;
 }
 
+/* Return lte for the "unnamed" (default) data stream.  Only for resolved
+ * dentries */
+static inline struct lookup_table_entry *
+dentry_lte(const struct dentry *dentry)
+{
+       wimlib_assert(dentry->resolved);
+       for (u16 i = 0; i < dentry->num_ads; i++)
+               if (dentry->ads_entries[i].stream_name_len == 0)
+                       return dentry->ads_entries[i].lte;
+       return dentry->lte;
+}
+
 static inline size_t dentry_link_group_size(const struct dentry *dentry)
 {
        const struct list_head *cur = &dentry->link_group_list;
@@ -249,9 +291,6 @@ extern u64 dentry_total_length(const struct dentry *dentry);
 
 extern void stbuf_to_dentry(const struct stat *stbuf, struct dentry *dentry);
 
-extern int dentry_to_stbuf(const struct dentry *dentry, struct stat *stbuf, 
-                          const struct lookup_table *table);
-
 extern int for_dentry_in_tree(struct dentry *root, 
                              int (*visitor)(struct dentry*, void*), 
                              void *args);