]> wimlib.net Git - wimlib/blobdiff - include/wimlib/blob_table.h
Add Windows tests for empty and max length reparse points
[wimlib] / include / wimlib / blob_table.h
index dcf6af7ffaa2c2a44870b1e3d8eb6bb55e8caf6b..c5295820a744b12b19cfe3943d254adad10fd89e 100644 (file)
@@ -74,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 {
@@ -95,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
@@ -328,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
@@ -340,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;
@@ -363,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)
 {
@@ -401,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 **