]> wimlib.net Git - wimlib/blobdiff - src/write.c
write.c: Do not raw-copy packed resources
[wimlib] / src / write.c
index 0aacdf13e04fc57e5abd3574c7321a929201c99c..3895088ee2c408e5d990a073512100f3bb0bc309 100644 (file)
@@ -176,6 +176,9 @@ can_raw_copy(const struct wim_lookup_table_entry *lte,
                        rspec->wim->chunk_size == out_chunk_size);
        }
 
+       /* XXX: For compatibility, we can't allow multiple packed resources per
+        * WIM.  */
+#if 0
        if ((rspec->flags & WIM_RESHDR_FLAG_PACKED_STREAMS) &&
            (write_resource_flags & WRITE_RESOURCE_FLAG_PACK_STREAMS))
        {
@@ -198,6 +201,8 @@ can_raw_copy(const struct wim_lookup_table_entry *lte,
 
                return (write_size > rspec->uncompressed_size / 2);
        }
+#endif
+
        return false;
 }
 
@@ -1376,12 +1381,6 @@ write_stream_list(struct list_head *stream_list,
         * bytes needing to be compressed is less 2000000 (heuristic value).  */
        if (out_ctype != WIMLIB_COMPRESSION_TYPE_NONE) {
 
-               if (out_ctype == WIMLIB_COMPRESSION_TYPE_LZMS &&
-                   ctx.lookup_table != NULL) {
-                       WARNING("LZMS compression not implemented; data will "
-                               "actually be written uncompressed.");
-               }
-
        #ifdef ENABLE_MULTITHREADED_COMPRESSION
                if (ctx.num_bytes_to_compress >= 2000000) {
                        ret = new_parallel_chunk_compressor(out_ctype,
@@ -1495,6 +1494,39 @@ out_destroy_context:
        return ret;
 }
 
+static int
+wim_write_stream_list(WIMStruct *wim,
+                     struct list_head *stream_list,
+                     int write_flags,
+                     unsigned num_threads,
+                     struct filter_context *filter_ctx,
+                     wimlib_progress_func_t progress_func)
+{
+       int out_ctype;
+       u32 out_chunk_size;
+       int write_resource_flags;
+
+       write_resource_flags = write_flags_to_resource_flags(write_flags);
+
+       if (write_resource_flags & WRITE_RESOURCE_FLAG_PACK_STREAMS) {
+               out_chunk_size = wim->out_pack_chunk_size;
+               out_ctype = wim->out_pack_compression_type;
+       } else {
+               out_chunk_size = wim->out_chunk_size;
+               out_ctype = wim->out_compression_type;
+       }
+
+       return write_stream_list(stream_list,
+                                &wim->out_fd,
+                                write_resource_flags,
+                                out_ctype,
+                                out_chunk_size,
+                                num_threads,
+                                wim->lookup_table,
+                                filter_ctx,
+                                progress_func);
+}
+
 static int
 write_wim_resource(struct wim_lookup_table_entry *lte,
                   struct filedes *out_fd,
@@ -1947,15 +1979,12 @@ write_wim_streams(WIMStruct *wim, int image, int write_flags,
                }
        }
 
-       return write_stream_list(stream_list,
-                                &wim->out_fd,
-                                write_flags_to_resource_flags(write_flags),
-                                wim->out_compression_type,
-                                wim->out_chunk_size,
-                                num_threads,
-                                wim->lookup_table,
-                                filter_ctx,
-                                progress_func);
+       return wim_write_stream_list(wim,
+                                    stream_list,
+                                    write_flags,
+                                    num_threads,
+                                    filter_ctx,
+                                    progress_func);
 }
 
 static int
@@ -2611,7 +2640,8 @@ write_wim_part(WIMStruct *wim,
                wim->hdr.magic = WIM_MAGIC;
 
        /* Set appropriate version number.  */
-       if (write_flags & WIMLIB_WRITE_FLAG_PACK_STREAMS)
+       if ((write_flags & WIMLIB_WRITE_FLAG_PACK_STREAMS) ||
+           wim->out_compression_type == WIMLIB_COMPRESSION_TYPE_LZMS)
                wim->hdr.wim_version = WIM_VERSION_PACKED_STREAMS;
        else
                wim->hdr.wim_version = WIM_VERSION_DEFAULT;
@@ -2999,15 +3029,12 @@ overwrite_wim_inplace(WIMStruct *wim, int write_flags,
                goto out_restore_physical_hdr;
        }
 
-       ret = write_stream_list(&stream_list,
-                               &wim->out_fd,
-                               write_flags_to_resource_flags(write_flags),
-                               wim->compression_type,
-                               wim->chunk_size,
-                               num_threads,
-                               wim->lookup_table,
-                               &filter_ctx,
-                               progress_func);
+       ret = wim_write_stream_list(wim,
+                                   &stream_list,
+                                   write_flags,
+                                   num_threads,
+                                   &filter_ctx,
+                                   progress_func);
        if (ret)
                goto out_truncate;