X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fblob_table.h;h=c5295820a744b12b19cfe3943d254adad10fd89e;hb=0ce21c13081441f53d88ef58fbeba957abb74574;hp=1adec4ed6db602aa617b2ba91eb6b2cd1496f03e;hpb=aa3a2830cd4154238bc6a342ffea43d9ac69a14c;p=wimlib diff --git a/include/wimlib/blob_table.h b/include/wimlib/blob_table.h index 1adec4ed..c5295820 100644 --- a/include/wimlib/blob_table.h +++ b/include/wimlib/blob_table.h @@ -12,7 +12,7 @@ enum blob_location { /* The blob's data does not exist. This is a temporary state only. */ BLOB_NONEXISTENT = 0, - /* The blob's data is located in a WIM resource identified by the + /* The blob's data is available in the WIM resource identified by the * `struct wim_resource_descriptor' pointed to by @rdesc. * @offset_in_res identifies the offset at which this particular blob * begins in the uncompressed data of the resource. */ @@ -35,9 +35,8 @@ enum blob_location { #ifdef WITH_NTFS_3G /* The blob's data is available as the contents of an NTFS attribute - * accessible through libntfs-3g. The attribute is identified by - * volume, path to an inode, attribute name, and attribute type. - * @ntfs_loc points to a structure containing this information. */ + * accessible through libntfs-3g. @ntfs_loc points to a structure which + * identifies the attribute. */ BLOB_IN_NTFS_VOLUME, #endif @@ -75,7 +74,20 @@ struct blob_descriptor { /* List node for a hash bucket of the blob table */ struct hlist_node hash_list; - /* Uncompressed size of this blob */ + /* + * Uncompressed size of this blob. + * + * In most cases we are now enforcing that this is nonzero; i.e. an + * empty stream will have "no blob" rather than "an empty blob". The + * exceptions are: + * + * - blob descriptors with 'blob_location == BLOB_NONEXISTENT', + * e.g. placeholder entries for new metadata resources or for + * blobs required for pipable WIM extraction. In these cases the + * size is not meaningful information anyway. + * - blob descriptors with 'blob_location == BLOB_IN_STAGING_FILE' + * can vary their size over time, including to 0. + */ u64 size; union { @@ -96,7 +108,7 @@ struct blob_descriptor { struct wim_inode *back_inode; u32 back_stream_id; }; - }; + } _packed_attribute; /* union is SHA1_HASH_SIZE bytes */ /* Number of times this blob is referenced by file streams in WIM * images. See blob_decrement_refcnt() for information about the @@ -122,7 +134,7 @@ struct blob_descriptor { #ifdef WITH_FUSE /* Number of open file descriptors to this blob during a FUSE mount of - * the containing image. */ + * a WIM image. */ u16 num_opened_fds; #endif @@ -175,6 +187,9 @@ struct blob_descriptor { struct { tchar *file_on_disk; struct wim_inode *file_inode; + #ifdef __WIN32__ + u64 sort_key; + #endif }; /* BLOB_IN_ATTACHED_BUFFER */ @@ -326,8 +341,7 @@ blob_to_wimlib_resource_entry(const struct blob_descriptor *blob, struct wimlib_resource_entry *wentry); extern int -sort_blob_list(struct list_head *blob_list, - size_t list_head_offset, +sort_blob_list(struct list_head *blob_list, size_t list_head_offset, int (*compar)(const void *, const void*)); extern int @@ -338,7 +352,7 @@ extern int cmp_blobs_by_sequential_order(const void *p1, const void *p2); static inline const struct blob_extraction_target * -blob_extraction_targets(struct blob_descriptor *blob) +blob_extraction_targets(const struct blob_descriptor *blob) { if (blob->out_refcnt <= ARRAY_LEN(blob->inline_blob_extraction_targets)) return blob->inline_blob_extraction_targets; @@ -361,18 +375,6 @@ blob_set_is_located_in_wim_resource(struct blob_descriptor *blob, blob->offset_in_res = offset_in_res; } -/* - * Declare that the specified blob is located in the specified non-solid WIM - * resource. In this case, the blob data is the entire uncompressed resource. - */ -static inline void -blob_set_is_located_in_nonsolid_wim_resource(struct blob_descriptor *blob, - struct wim_resource_descriptor *rdesc) -{ - blob_set_is_located_in_wim_resource(blob, rdesc, 0); - blob->size = rdesc->uncompressed_size; -} - static inline void blob_unset_is_located_in_wim_resource(struct blob_descriptor *blob) { @@ -399,8 +401,7 @@ after_blob_hashed(struct blob_descriptor *blob, struct blob_table *blob_table); extern int -hash_unhashed_blob(struct blob_descriptor *blob, - struct blob_table *blob_table, +hash_unhashed_blob(struct blob_descriptor *blob, struct blob_table *blob_table, struct blob_descriptor **blob_ret); extern struct blob_descriptor **