X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fblob_table.h;h=610db2419e2f9b96c8c0b079f8830d937848109f;hb=HEAD;hp=1adec4ed6db602aa617b2ba91eb6b2cd1496f03e;hpb=aa3a2830cd4154238bc6a342ffea43d9ac69a14c;p=wimlib diff --git a/include/wimlib/blob_table.h b/include/wimlib/blob_table.h index 1adec4ed..2c9aab15 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,23 +35,16 @@ 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 -#ifdef __WIN32__ - /* Windows only: the blob's data is available as the contents of the - * data stream named by @file_on_disk. @file_on_disk is an NT namespace - * path that may be longer than the Win32-level MAX_PATH. Furthermore, - * the stream may require "backup semantics" to access. */ - BLOB_IN_WINNT_FILE_ON_DISK, - - /* Windows only: the blob's data is available as the raw encrypted data - * of the external file named by @file_on_disk. @file_on_disk is a - * Win32 namespace path. */ - BLOB_WIN32_ENCRYPTED, +#ifdef _WIN32 + /* Windows only: the blob's data is available in the file (or named data + * stream) specified by @windows_file. The data might be only properly + * accessible through the Windows API. */ + BLOB_IN_WINDOWS_FILE, #endif }; @@ -75,7 +68,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 { @@ -122,7 +128,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 @@ -135,18 +141,14 @@ struct blob_descriptor { /* 1 iff the SHA-1 message digest of this blob is unknown. */ u16 unhashed : 1; + /* 1 iff this blob has failed its checksum. */ + u16 corrupted : 1; + /* Temporary fields used when writing blobs; set as documented for * prepare_blob_list_for_write(). */ 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() */ @@ -170,10 +172,12 @@ struct blob_descriptor { union { /* BLOB_IN_FILE_ON_DISK - * BLOB_IN_WINNT_FILE_ON_DISK - * BLOB_WIN32_ENCRYPTED */ + * BLOB_IN_WINDOWS_FILE */ struct { - tchar *file_on_disk; + union { + tchar *file_on_disk; + struct windows_file *windows_file; + }; struct wim_inode *file_inode; }; @@ -258,87 +262,86 @@ struct blob_descriptor { /* Links blobs being exported. */ struct list_head export_blob_list; - - /* Links original list of blobs in the read-write mounted image. */ - struct list_head orig_blob_list; }; }; -extern struct blob_table * -new_blob_table(size_t capacity) _malloc_attribute; +struct blob_table * +new_blob_table(size_t capacity); -extern void +void free_blob_table(struct blob_table *table); -extern int +int read_blob_table(WIMStruct *wim); -extern int +int write_blob_table_from_blob_list(struct list_head *blob_list, struct filedes *out_fd, u16 part_number, struct wim_reshdr *out_reshdr, int write_resource_flags); -extern struct blob_descriptor * -new_blob_descriptor(void) _malloc_attribute; +struct blob_descriptor * +new_blob_descriptor(void); -extern struct blob_descriptor * -clone_blob_descriptor(const struct blob_descriptor *blob) _malloc_attribute; +struct blob_descriptor * +clone_blob_descriptor(const struct blob_descriptor *blob); -extern void +void blob_decrement_refcnt(struct blob_descriptor *blob, struct blob_table *table); -extern void +void blob_subtract_refcnt(struct blob_descriptor *blob, struct blob_table *table, u32 count); #ifdef WITH_FUSE -extern void +void blob_decrement_num_opened_fds(struct blob_descriptor *blob); #endif -extern void +void +blob_release_location(struct blob_descriptor *blob); + +void free_blob_descriptor(struct blob_descriptor *blob); -extern void +void blob_table_insert(struct blob_table *table, struct blob_descriptor *blob); -extern void +void blob_table_unlink(struct blob_table *table, struct blob_descriptor *blob); -extern struct blob_descriptor * +struct blob_descriptor * lookup_blob(const struct blob_table *table, const u8 *hash); -extern int +int for_blob_in_table(struct blob_table *table, int (*visitor)(struct blob_descriptor *, void *), void *arg); -extern int +int for_blob_in_table_sorted_by_sequential_order(struct blob_table *table, int (*visitor)(struct blob_descriptor *, void *), void *arg); struct wimlib_resource_entry; -extern void +void 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, +int +sort_blob_list(struct list_head *blob_list, size_t list_head_offset, int (*compar)(const void *, const void*)); -extern int +int sort_blob_list_by_sequential_order(struct list_head *blob_list, size_t list_head_offset); -extern int +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 +364,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) { @@ -389,21 +380,45 @@ blob_set_is_located_in_attached_buffer(struct blob_descriptor *blob, blob->size = size; } -extern struct blob_descriptor * +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_WINDOWS_FILE +#endif + ; +} + +#ifdef _WIN32 +const wchar_t * +get_windows_file_path(const struct windows_file *file); +#endif + +static inline const tchar * +blob_file_path(const struct blob_descriptor *blob) +{ +#ifdef _WIN32 + if (blob->blob_location == BLOB_IN_WINDOWS_FILE) + return get_windows_file_path(blob->windows_file); +#endif + return blob->file_on_disk; +} + +struct blob_descriptor * new_blob_from_data_buffer(const void *buffer, size_t size, struct blob_table *blob_table); -extern struct blob_descriptor * +struct blob_descriptor * after_blob_hashed(struct blob_descriptor *blob, struct blob_descriptor **back_ptr, - struct blob_table *blob_table); + struct blob_table *blob_table, struct wim_inode *inode); -extern int -hash_unhashed_blob(struct blob_descriptor *blob, - struct blob_table *blob_table, +int +hash_unhashed_blob(struct blob_descriptor *blob, struct blob_table *blob_table, struct blob_descriptor **blob_ret); -extern struct blob_descriptor ** +struct blob_descriptor ** retrieve_pointer_to_unhashed_blob(struct blob_descriptor *blob); static inline void