X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flookup_table.h;h=f0ee25b78f2d89761352afaa4860a39e1f783312;hp=c211fe142c45291de89973e4d658f5466c305b6f;hb=2441b3b94cf77a5193550682695dfaf930466764;hpb=1dde5fb0d809f2f5e032e4d5241d1cb15ff3eb65 diff --git a/src/lookup_table.h b/src/lookup_table.h index c211fe14..f0ee25b7 100644 --- a/src/lookup_table.h +++ b/src/lookup_table.h @@ -27,13 +27,11 @@ struct lookup_table { struct wimlib_fd; #ifdef WITH_NTFS_3G -typedef struct _ntfs_attr ntfs_attr; -typedef struct _ntfs_volume ntfs_volume; struct ntfs_location { char *path_utf8; char *stream_name_utf16; u16 stream_name_utf16_num_chars; - ntfs_volume **ntfs_vol_p; + struct _ntfs_volume **ntfs_vol_p; bool is_reparse_point; }; #endif @@ -105,7 +103,7 @@ struct lookup_table_entry { struct lookup_table_entry *next_lte_in_swm; FILE *file_on_disk_fp; #ifdef WITH_NTFS_3G - ntfs_attr *attr; + struct _ntfs_attr *attr; #endif }; #ifdef WITH_FUSE @@ -294,6 +292,16 @@ static inline const u8 *dentry_stream_hash_unresolved(const struct dentry *dentr return dentry->ads_entries[stream_idx - 1].hash; } +static inline u16 dentry_stream_name_len(const struct dentry *dentry, + unsigned stream_idx) +{ + wimlib_assert(stream_idx <= dentry->num_ads); + if (stream_idx == 0) + return 0; + else + return dentry->ads_entries[stream_idx - 1].stream_name_len; +} + static inline const u8 *dentry_stream_hash_resolved(const struct dentry *dentry, unsigned stream_idx) { @@ -302,7 +310,7 @@ static inline const u8 *dentry_stream_hash_resolved(const struct dentry *dentry, if (lte) return lte->hash; else - return NULL; + return zero_hash; } /* @@ -322,35 +330,30 @@ static inline const u8 *dentry_stream_hash(const struct dentry *dentry, } static inline struct lookup_table_entry * -dentry_first_lte_resolved(const struct dentry *dentry) +dentry_unnamed_lte_resolved(const struct dentry *dentry) { - struct lookup_table_entry *lte; wimlib_assert(dentry->resolved); - - for (unsigned i = 0; i <= dentry->num_ads; i++) { - lte = dentry_stream_lte_resolved(dentry, i); - if (lte) - return lte; - } + for (unsigned i = 0; i <= dentry->num_ads; i++) + if (dentry_stream_name_len(dentry, i) == 0 && + !is_zero_hash(dentry_stream_hash_resolved(dentry, i))) + return dentry_stream_lte_resolved(dentry, i); return NULL; } static inline struct lookup_table_entry * -dentry_first_lte_unresolved(const struct dentry *dentry, - const struct lookup_table *table) +dentry_unnamed_lte_unresolved(const struct dentry *dentry, + const struct lookup_table *table) { - struct lookup_table_entry *lte; wimlib_assert(!dentry->resolved); - - for (unsigned i = 0; i <= dentry->num_ads; i++) { - lte = dentry_stream_lte_unresolved(dentry, i, table); - if (lte) - return lte; - } + for (unsigned i = 0; i <= dentry->num_ads; i++) + if (dentry_stream_name_len(dentry, i) == 0 && + !is_zero_hash(dentry_stream_hash_unresolved(dentry, i))) + return dentry_stream_lte_unresolved(dentry, i, table); return NULL; } extern struct lookup_table_entry * -dentry_first_lte(const struct dentry *dentry, const struct lookup_table *table); +dentry_unnamed_lte(const struct dentry *dentry, + const struct lookup_table *table); #endif