X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Flookup_table.h;h=921a47c3e627fdb968ee9d6a7e48a66d4afbb04c;hb=ac6edfd02c612da68a1b9a1b32ae64c95a87fbb1;hp=c1716088f590206e802e4f71dda46552b1b374b2;hpb=bdc18020a46938f142bf39f10f9e0f1c9126cb0b;p=wimlib diff --git a/src/lookup_table.h b/src/lookup_table.h index c1716088..921a47c3 100644 --- a/src/lookup_table.h +++ b/src/lookup_table.h @@ -63,11 +63,11 @@ enum resource_location { * WIM file will be pointed to by the @wim member. */ RESOURCE_IN_WIM, +#ifndef __WIN32__ /* The stream resource is located in an external file. The name of the - * file will be provided by @file_on_disk member. In addition, if - * @file_on_disk_fp is not NULL, it will be an open FILE * to the file. - * */ + * file will be provided by @file_on_disk member. */ RESOURCE_IN_FILE_ON_DISK, +#endif /* The stream resource is directly attached in an in-memory buffer * pointed to by @attached_buffer. */ @@ -135,11 +135,20 @@ struct wim_lookup_table_entry { */ u16 part_number; - /* See enum resource_location above */ + /* One of the `enum resource_location' values documented above. */ u16 resource_location : 5; + + /* 1 if this stream is a unique size (only set while writing streams). */ u8 unique_size : 1; + + /* 1 if this stream has not had a SHA1 message digest calculated for it + * yet */ u8 unhashed : 1; + u8 deferred : 1; + + u8 no_progress : 1; + /* (On-disk field) * Number of times this lookup table entry is referenced by dentries. * Unfortunately, this field is not always set correctly in Microsoft's @@ -160,9 +169,11 @@ struct wim_lookup_table_entry { size_t hash_short; /* Unhashed entries only (unhashed == 1): these variables make - * it possible to find the to the pointer to this 'struct - * wim_lookup_table_entry' contained in a 'struct wim_ads_entry' - * or 'struct wim_inode'. */ + * it possible to find the pointer to this 'struct + * wim_lookup_table_entry' contained in either 'struct + * wim_ads_entry' or 'struct wim_inode'. There can be at most 1 + * such pointer, as we can only join duplicate streams after + * they have been hashed. */ struct { struct wim_inode *back_inode; u32 back_stream_id; @@ -170,16 +181,14 @@ struct wim_lookup_table_entry { }; /* When a WIM file is written, out_refcnt starts at 0 and is incremented - * whenever the file resource pointed to by this lookup table entry - * needs to be written. The file resource only need to be written when - * out_refcnt is nonzero, since otherwise it is not referenced by any - * dentries. */ + * whenever the stream pointed to by this lookup table entry needs to be + * written. The stream only need to be written when out_refcnt is + * nonzero, since otherwise it is not referenced by any dentries. */ u32 out_refcnt; /* Pointers to somewhere where the stream is actually located. See the * comments for the @resource_location field above. */ union { - void *resource_loc_private; WIMStruct *wim; tchar *file_on_disk; void *attached_buffer; @@ -191,10 +200,14 @@ struct wim_lookup_table_entry { #endif }; + /* Actual reference count to this stream (only used while + * verifying an image). */ u32 real_refcnt; union { #ifdef WITH_FUSE + /* Number of times this stream has been opened (used only during + * mounting) */ u16 num_opened_fds; #endif @@ -208,14 +221,17 @@ struct wim_lookup_table_entry { union { /* When a WIM file is written, @output_resource_entry is filled * in with the resource entry for the output WIM. This will not - * necessarily be the same as the @resource_entry since: - The - * stream may have a different offset in the new WIM - The - * stream may have a different compressed size in the new WIM if - * the compression type changed + * necessarily be the same as the @resource_entry since: + * - The stream may have a different offset in the new WIM + * - The stream may have a different compressed size in the new + * WIM if the compression type changed */ struct resource_entry output_resource_entry; - struct list_head msg_list; + struct { + struct list_head msg_list; + struct list_head being_compressed_list; + }; struct list_head inode_list; struct { @@ -229,6 +245,7 @@ struct wim_lookup_table_entry { union { struct list_head unhashed_list; struct list_head swm_stream_list; + struct list_head lookup_table_list; struct list_head extraction_list; struct list_head export_stream_list; }; @@ -268,10 +285,12 @@ wim_resource_compression_type(const struct wim_lookup_table_entry *lte) static inline bool lte_filename_valid(const struct wim_lookup_table_entry *lte) { - return lte->resource_location == RESOURCE_IN_FILE_ON_DISK + return 0 #ifdef __WIN32__ || lte->resource_location == RESOURCE_WIN32 || lte->resource_location == RESOURCE_WIN32_ENCRYPTED + #else + || lte->resource_location == RESOURCE_IN_FILE_ON_DISK #endif #ifdef WITH_FUSE || lte->resource_location == RESOURCE_IN_STAGING_FILE @@ -288,6 +307,11 @@ read_lookup_table(WIMStruct *w); extern int write_lookup_table(WIMStruct *w, int image, struct resource_entry *out_res_entry); +extern int +write_lookup_table_from_stream_list(struct list_head *stream_list, + int out_fd, + struct resource_entry *out_res_entry); + extern void free_lookup_table(struct wim_lookup_table *table); @@ -362,9 +386,6 @@ inode_resolve_ltes(struct wim_inode *inode, struct wim_lookup_table *table); extern void inode_unresolve_ltes(struct wim_inode *inode); -extern int -write_lookup_table_entry(struct wim_lookup_table_entry *lte, void *__out); - static inline struct wim_lookup_table_entry * inode_stream_lte_resolved(const struct wim_inode *inode, unsigned stream_idx) { @@ -445,34 +466,12 @@ inode_stream_name_nbytes(const struct wim_inode *inode, unsigned stream_idx) return inode->i_ads_entries[stream_idx - 1].stream_name_nbytes; } -static inline struct wim_lookup_table_entry * -inode_unnamed_lte_resolved(const struct wim_inode *inode) -{ - wimlib_assert(inode->i_resolved); - for (unsigned i = 0; i <= inode->i_num_ads; i++) { - if (inode_stream_name_nbytes(inode, i) == 0 && - !is_zero_hash(inode_stream_hash_resolved(inode, i))) - { - return inode_stream_lte_resolved(inode, i); - } - } - return NULL; -} +extern struct wim_lookup_table_entry * +inode_unnamed_lte_resolved(const struct wim_inode *inode); -static inline struct wim_lookup_table_entry * +extern struct wim_lookup_table_entry * inode_unnamed_lte_unresolved(const struct wim_inode *inode, - const struct wim_lookup_table *table) -{ - wimlib_assert(!inode->i_resolved); - for (unsigned i = 0; i <= inode->i_num_ads; i++) { - if (inode_stream_name_nbytes(inode, i) == 0 && - !is_zero_hash(inode_stream_hash_unresolved(inode, i))) - { - return inode_stream_lte_unresolved(inode, i, table); - } - } - return NULL; -} + const struct wim_lookup_table *table); extern struct wim_lookup_table_entry * inode_unnamed_lte(const struct wim_inode *inode, const struct wim_lookup_table *table);