/* 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. */
#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
#endif
};
-/* A "blob target" is a stream, and the inode to which that stream belongs, to
- * which a blob needs to be extracted as part of an extraction operation. Since
- * blobs are single-instanced, a blob may have multiple targets. */
+/* A "blob extraction target" is a stream, and the inode to which that stream
+ * belongs, to which a blob needs to be extracted as part of an extraction
+ * operation. Since blobs are single-instanced, a blob may have multiple
+ * extraction targets. */
struct blob_extraction_target {
struct wim_inode *inode;
struct wim_inode_stream *stream;
};
/*
- * Descriptor for a blob, which is a known length sequence of binary data.
+ * Descriptor for a "blob", which is a known length sequence of binary data.
*
* Within a WIM file, blobs are single instanced and are identified by SHA-1
* message digest.
/* 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 {
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
#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
struct {
tchar *file_on_disk;
struct wim_inode *file_inode;
+ #ifdef __WIN32__
+ u64 sort_key;
+ #endif
};
/* BLOB_IN_ATTACHED_BUFFER */
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
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;
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)
{
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 **