]> wimlib.net Git - wimlib/blobdiff - include/wimlib/blob_table.h
Improved reporting of concurrent modifications and corruptions
[wimlib] / include / wimlib / blob_table.h
index 9dfca8dcc7171bfc8a81447a3375b8b2c66c3a73..0999660026ebde5c297d2a04684ec922f1683657 100644 (file)
@@ -108,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
@@ -152,13 +152,6 @@ struct blob_descriptor {
        u16 unique_size : 1;
        u16 will_be_in_output_wim : 1;
 
-       /* Set to 1 if this blob represents a metadata resource that has been
-        * changed.  In such cases, the hash cannot be used to verify the data
-        * if the metadata resource is read again.  (This could be avoided if we
-        * used separate fields for input/output checksum, but most blobs
-        * wouldn't need this.)  */
-       u16 dont_check_metadata_hash : 1;
-
        u16 may_send_done_with_file : 1;
 
        /* Only used by wimlib_export_image() */
@@ -313,6 +306,9 @@ extern void
 blob_decrement_num_opened_fds(struct blob_descriptor *blob);
 #endif
 
+extern void
+blob_release_location(struct blob_descriptor *blob);
+
 extern void
 free_blob_descriptor(struct blob_descriptor *blob);
 
@@ -341,8 +337,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
@@ -353,7 +348,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;
@@ -392,6 +387,17 @@ blob_set_is_located_in_attached_buffer(struct blob_descriptor *blob,
        blob->size = size;
 }
 
+static inline bool
+blob_is_in_file(const struct blob_descriptor *blob)
+{
+       return blob->blob_location == BLOB_IN_FILE_ON_DISK
+#ifdef __WIN32__
+           || blob->blob_location == BLOB_IN_WINNT_FILE_ON_DISK
+           || blob->blob_location == BLOB_WIN32_ENCRYPTED
+#endif
+          ;
+}
+
 extern struct blob_descriptor *
 new_blob_from_data_buffer(const void *buffer, size_t size,
                          struct blob_table *blob_table);
@@ -402,8 +408,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 **