X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwrite.c;h=5bd8db911e1e275b40f5cd236d760fadf395674e;hb=bc5975b86ee34a4784dc38f37028ea783dfa45da;hp=a71359420aed78ade13a05b0f2523c645974e1c2;hpb=a4204528d3fbd8b959025b897493cf68d5cbfc0f;p=wimlib diff --git a/src/write.c b/src/write.c index a7135942..5bd8db91 100644 --- a/src/write.c +++ b/src/write.c @@ -52,9 +52,7 @@ #include "wimlib/progress.h" #include "wimlib/resource.h" #include "wimlib/solid.h" -#ifdef __WIN32__ -# include "wimlib/win32.h" /* win32_rename_replacement() */ -#endif +#include "wimlib/win32.h" /* win32_rename_replacement() */ #include "wimlib/write.h" #include "wimlib/xml.h" @@ -279,7 +277,7 @@ struct write_blobs_progress_data { wimlib_progress_func_t progfunc; void *progctx; union wimlib_progress_info progress; - uint64_t next_progress; + u64 next_progress; }; static int @@ -292,7 +290,7 @@ do_write_blobs_progress(struct write_blobs_progress_data *progress_data, if (discarded) { progress->write_streams.total_bytes -= complete_size; progress->write_streams.total_streams -= complete_count; - if (progress_data->next_progress != ~(uint64_t)0 && + if (progress_data->next_progress != ~(u64)0 && progress_data->next_progress > progress->write_streams.total_bytes) { progress_data->next_progress = progress->write_streams.total_bytes; @@ -312,7 +310,7 @@ do_write_blobs_progress(struct write_blobs_progress_data *progress_data, return ret; if (progress_data->next_progress == progress->write_streams.total_bytes) { - progress_data->next_progress = ~(uint64_t)0; + progress_data->next_progress = ~(u64)0; } else { /* Handle rate-limiting of messages */ @@ -1691,16 +1689,6 @@ write_file_data_blobs(WIMStruct *wim, write_resource_flags = write_flags_to_resource_flags(write_flags); - /* wimlib v1.7.0: create a solid WIM file by default if the WIM version - * has been set to WIM_VERSION_SOLID and at least one blob in the WIM's - * blob table is located in a solid resource (may be the same WIM, or a - * different one in the case of export). */ - if (wim->out_hdr.wim_version == WIM_VERSION_SOLID && - wim_has_solid_resources(wim)) - { - write_resource_flags |= WRITE_RESOURCE_FLAG_SOLID; - } - if (write_resource_flags & WRITE_RESOURCE_FLAG_SOLID) { out_chunk_size = wim->out_solid_chunk_size; out_ctype = wim->out_solid_compression_type; @@ -1759,6 +1747,13 @@ write_wim_resource_from_buffer(const void *buf, int ret; struct blob_descriptor blob; + if (unlikely(buf_size == 0)) { + zero_reshdr(out_reshdr); + if (hash_ret) + copy_hash(hash_ret, zero_hash); + return 0; + } + blob_set_is_located_in_attached_buffer(&blob, (void *)buf, buf_size); sha1_buffer(buf, buf_size, blob.hash); blob.unhashed = 0; @@ -2627,6 +2622,15 @@ write_pipable_wim(WIMStruct *wim, int image, int write_flags, * finish_write(). */ } +static bool +should_default_to_solid_compression(WIMStruct *wim, int write_flags) +{ + return wim->out_hdr.wim_version == WIM_VERSION_SOLID && + !(write_flags & (WIMLIB_WRITE_FLAG_SOLID | + WIMLIB_WRITE_FLAG_PIPABLE)) && + wim_has_solid_resources(wim); +} + /* Write a standalone WIM or split WIM (SWM) part to a new file or to a file * descriptor. */ int @@ -2714,6 +2718,12 @@ write_wim_part(WIMStruct *wim, else wim->out_hdr.wim_version = WIM_VERSION_DEFAULT; + /* Default to solid compression if it is valid in the chosen WIM file + * format and the WIMStruct references any solid resources. This is + * useful when exporting an image from a solid WIM. */ + if (should_default_to_solid_compression(wim, write_flags)) + write_flags |= WIMLIB_WRITE_FLAG_SOLID; + /* Set the header flags. */ wim->out_hdr.flags = (wim->hdr.flags & (WIM_HDR_FLAG_RP_FIX | WIM_HDR_FLAG_READONLY)); @@ -2991,6 +3001,12 @@ overwrite_wim_inplace(WIMStruct *wim, int write_flags, unsigned num_threads) if (write_flags & WIMLIB_WRITE_FLAG_SOLID) wim->out_hdr.wim_version = WIM_VERSION_SOLID; + /* Default to solid compression if it is valid in the chosen WIM file + * format and the WIMStruct references any solid resources. This is + * useful when updating a solid WIM. */ + if (should_default_to_solid_compression(wim, write_flags)) + write_flags |= WIMLIB_WRITE_FLAG_SOLID; + /* Set additional flags for overwrite. */ write_flags |= WIMLIB_WRITE_FLAG_OVERWRITE | WIMLIB_WRITE_FLAG_STREAMS_OK;