X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fblob_table.h;h=9bb54b542819992d66aeb5d94657fba8e177d751;hb=14a395345aaa9dce84bf178a86243388c1c9f497;hp=ee1cd0faa8f4cb5c544c02d1efb507a56ec21647;hpb=1e70063e885540667e1873787e6b21f5c6704ac4;p=wimlib diff --git a/include/wimlib/blob_table.h b/include/wimlib/blob_table.h index ee1cd0fa..9bb54b54 100644 --- a/include/wimlib/blob_table.h +++ b/include/wimlib/blob_table.h @@ -40,17 +40,11 @@ enum blob_location { 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 }; @@ -108,7 +102,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 @@ -147,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() */ @@ -182,14 +172,13 @@ 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; - #ifdef __WIN32__ - u64 sort_key; - #endif }; /* BLOB_IN_ATTACHED_BUFFER */ @@ -273,14 +262,11 @@ 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; +new_blob_table(size_t capacity); extern void free_blob_table(struct blob_table *table); @@ -296,10 +282,10 @@ write_blob_table_from_blob_list(struct list_head *blob_list, int write_resource_flags); extern struct blob_descriptor * -new_blob_descriptor(void) _malloc_attribute; +new_blob_descriptor(void); extern struct blob_descriptor * -clone_blob_descriptor(const struct blob_descriptor *blob) _malloc_attribute; +clone_blob_descriptor(const struct blob_descriptor *blob); extern void blob_decrement_refcnt(struct blob_descriptor *blob, struct blob_table *table); @@ -313,6 +299,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 +330,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 @@ -392,6 +380,31 @@ 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_WINDOWS_FILE +#endif + ; +} + +#ifdef _WIN32 +extern 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; +} + extern struct blob_descriptor * new_blob_from_data_buffer(const void *buffer, size_t size, struct blob_table *blob_table); @@ -399,11 +412,10 @@ new_blob_from_data_buffer(const void *buffer, size_t size, extern 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, +hash_unhashed_blob(struct blob_descriptor *blob, struct blob_table *blob_table, struct blob_descriptor **blob_ret); extern struct blob_descriptor **