]> wimlib.net Git - wimlib/blobdiff - src/write.c
Add GUID helper functions
[wimlib] / src / write.c
index 879a3102ddce6e246e46716eea37c9af2f9d37a0..4d5e71651abceb3d411b3549d094705f28693827 100644 (file)
@@ -1689,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;
@@ -1757,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;
@@ -2625,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
@@ -2712,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));
@@ -2739,9 +2751,9 @@ write_wim_part(WIMStruct *wim,
        if (write_flags & WIMLIB_WRITE_FLAG_RETAIN_GUID)
                guid = wim->hdr.guid;
        if (guid)
-               memcpy(wim->out_hdr.guid, guid, WIMLIB_GUID_LEN);
+               copy_guid(wim->out_hdr.guid, guid);
        else
-               randomize_byte_array(wim->out_hdr.guid, WIMLIB_GUID_LEN);
+               generate_guid(wim->out_hdr.guid);
 
        /* Set the part number and total parts.  */
        wim->out_hdr.part_number = part_number;
@@ -2989,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;