X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdentry.h;h=613f6259e95c1b1884c81e6852a4e8e754b6534a;hb=b280d3fb6a7d9c6d21f809e0a6864f82d6539580;hp=b6aa966f0501f2d568f879bcfc17c0ee3385c1d8;hpb=0dd190af48ac572f9e33ff9436ec8900fa6281a3;p=wimlib diff --git a/src/dentry.h b/src/dentry.h index b6aa966f..613f6259 100644 --- a/src/dentry.h +++ b/src/dentry.h @@ -4,6 +4,7 @@ #include "util.h" #include "config.h" #include "list.h" +#include "sha1.h" #include @@ -16,10 +17,6 @@ typedef struct WIMStruct WIMStruct; #define WIM_ADS_ENTRY_DISK_SIZE 38 -#ifndef WIM_HASH_SIZE -#define WIM_HASH_SIZE 20 -#endif - /* * Reparse tags documented at * http://msdn.microsoft.com/en-us/library/dd541667(v=prot.10).aspx @@ -58,7 +55,7 @@ struct lookup_table_entry; struct ads_entry { union { /* SHA-1 message digest of stream contents */ - u8 hash[WIM_HASH_SIZE]; + u8 hash[SHA1_HASH_SIZE]; /* The corresponding lookup table entry (only for resolved * streams) */ @@ -77,6 +74,7 @@ struct ads_entry { /* Stream name (UTF-8) */ char *stream_name_utf8; + /* Doubly linked list of streams that share the same lookup table entry */ struct stream_list_head lte_group_list; }; @@ -102,7 +100,7 @@ static inline bool ads_entry_has_name(const struct ads_entry *entry, } -/* In-memory structure for a directory entry. There is a directory tree for +/* In-memory structure for a WIM directory entry. There is a directory tree for * each image in the WIM. */ struct dentry { /* The parent of this directory entry. */ @@ -154,7 +152,7 @@ struct dentry { * opposed to the alternate file streams, which may have their own * lookup table entries. */ union { - u8 hash[WIM_HASH_SIZE]; + u8 hash[SHA1_HASH_SIZE]; struct lookup_table_entry *lte; }; @@ -204,7 +202,7 @@ struct dentry { union { /* Number of references to the dentry tree itself, as in multiple * WIMStructs */ - int refcnt; + u32 refcnt; /* Number of times this dentry has been opened (only for * directories!) */ @@ -218,16 +216,16 @@ struct dentry { enum { /* This dentry is the owner of its ads_entries, although it may * be in a hard link set */ - GROUP_INDEPENDENT = 0, + ADS_ENTRIES_DEFAULT = 0, /* This dentry is the owner of the ads_entries in the hard link * set */ - GROUP_MASTER, + ADS_ENTRIES_OWNER, /* 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; + * link set that has ADS_ENTRIES_OWNER set. */ + ADS_ENTRIES_USER + } ads_entries_status; /* List of dentries in the hard link set */ @@ -240,36 +238,13 @@ struct dentry { 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 - * to the dentry hash field if we can't find an unnamed data stream). */ - for (u16 i = 0; i < dentry->num_ads; i++) - if (dentry->ads_entries[i].stream_name_len == 0) - return dentry->ads_entries[i].hash; - 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; -} +/* Return the number of dentries in the hard link group */ static inline size_t dentry_link_group_size(const struct dentry *dentry) { const struct list_head *cur = &dentry->link_group_list; size_t size = 0; + wimlib_assert(cur != NULL); do { size++; cur = cur->next; @@ -324,12 +299,9 @@ extern struct dentry *new_dentry(const char *name); extern void dentry_free_ads_entries(struct dentry *dentry); extern void free_dentry(struct dentry *dentry); extern void put_dentry(struct dentry *dentry); -extern int share_dentry_ads(struct dentry *master, - struct dentry *slave); extern struct dentry *clone_dentry(struct dentry *old); extern void free_dentry_tree(struct dentry *root, - struct lookup_table *lookup_table, - bool lt_decrement_refcnt); + struct lookup_table *lookup_table); extern int increment_dentry_refcnt(struct dentry *dentry, void *ignore); extern int decrement_dentry_refcnt(struct dentry *dentry, void *ignore); @@ -349,8 +321,7 @@ extern int read_dentry_tree(const u8 metadata_resource[], extern u8 *write_dentry_tree(const struct dentry *tree, u8 *p); -/* Inline utility functions for WIMDentries */ - +/* Inline utility functions for dentries */ static inline bool dentry_is_root(const struct dentry *dentry) {