]> wimlib.net Git - wimlib/blobdiff - src/dentry.h
calculate_sha1sum_of_staging_file
[wimlib] / src / dentry.h
index 16cf5f37bba23200891fac458fca6e6f21385b79..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)
@@ -126,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. */
@@ -137,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
@@ -200,7 +218,7 @@ struct dentry {
        enum {
                /* This dentry is the owner of its ads_entries, although it may
                 * be in a hard link set */
-               GROUP_INDEPENDENT,
+               GROUP_INDEPENDENT = 0,
 
                /* This dentry is the owner of the ads_entries in the hard link
                 * set */
@@ -215,6 +233,9 @@ struct dentry {
        /* 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;
 };
@@ -222,6 +243,7 @@ struct dentry {
 /* 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
@@ -232,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;
@@ -257,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);