/* The stream is located in a resource in a WIM file identified by the
* `struct wim_resource_spec' pointed to by @rspec. @offset_in_res
* identifies the offset at which this particular stream begins in the
- * uncompressed data of the resource; this is normally 0, but in general
- * a WIM resource may be "packed" and potentially contain multiple
- * streams. */
+ * uncompressed data of the resource; this is normally 0, but a WIM
+ * resource can be "solid" and contain multiple streams. */
RESOURCE_IN_WIM,
/* The stream is located in the external file named by @file_on_disk.
* need this.) */
u32 dont_check_metadata_hash : 1;
+ u32 may_send_done_with_file : 1;
+
+ /* Only used by wimlib_export_image() */
+ u32 was_exported : 1;
+
union {
/* (On-disk field) SHA1 message digest of the stream referenced
* by this lookup table entry. */
/* Number of times this lookup table entry is referenced by dentries in
* the WIM. When a WIM's lookup table is read, this field is
- * initialized from a corresponding entry; while it should be correct,
- * in general it may not be. wim_recalculate_refcnts() recalculates the
- * reference counts for all streams and is run before doing any
- * deletions. */
+ * initialized from a corresponding entry.
+ *
+ * However, see lte_decrement_refcnt() for information about the
+ * limitations of this field. */
u32 refcnt;
/* When a WIM file is written, this is set to the number of references
struct wim_resource_spec *rspec;
u64 offset_in_res;
};
- tchar *file_on_disk;
+ struct {
+ tchar *file_on_disk;
+ struct wim_inode *file_inode;
+ };
void *attached_buffer;
#ifdef WITH_FUSE
struct {
/* List node used for stream size table. */
struct hlist_node hash_list_2;
- /* Metadata for the underlying packed resource
- * in the WIM being written (only valid if
- * WIM_RESHDR_FLAG_PACKED_STREAMS set in
+ /* Metadata for the underlying solid resource in
+ * the WIM being written (only valid if
+ * WIM_RESHDR_FLAG_SOLID set in
* out_reshdr.flags). */
struct {
u64 out_res_offset_in_wim;
/* Links streams being written to the WIM. */
struct list_head write_streams_list;
- /* Metadata for this stream in the WIM being written.
- */
- struct wim_reshdr out_reshdr;
+ union {
+ /* Metadata for this stream in the WIM being
+ * written. */
+ struct wim_reshdr out_reshdr;
+
+ struct {
+ /* Name under which this stream is being
+ * sorted; used only when sorting
+ * streams for solid compression. */
+ utf16lechar *solid_sort_name;
+ size_t solid_sort_name_nbytes;
+ };
+ };
};
/* Used temporarily during extraction. This is an array of
u32 alloc_stream_owners;
};
};
-
- /* Actual reference count to this stream (only used while
- * verifying an image). */
- u32 real_refcnt;
};
/* Temporary list fields. */
sort_stream_list_by_sequential_order(struct list_head *stream_list,
size_t list_head_offset);
+extern int
+cmp_streams_by_sequential_order(const void *p1, const void *p2);
+
/* Utility functions */
extern int
lte_zero_out_refcnt(struct wim_lookup_table_entry *lte, void *ignore);
-extern int
-lte_zero_real_refcnt(struct wim_lookup_table_entry *lte, void *ignore);
-
static inline bool
lte_is_partial(const struct wim_lookup_table_entry * lte)
{