* compressed chunk. */
while (!ctx->compressor->submit_chunk(ctx->compressor, chunk, size)) {
const void *cchunk;
- unsigned csize;
- unsigned usize;
+ u32 csize;
+ u32 usize;
bool bret;
int ret;
finish_remaining_chunks(struct write_streams_ctx *ctx)
{
const void *cdata;
- unsigned csize;
- unsigned usize;
+ u32 csize;
+ u32 usize;
int ret;
if (ctx->compressor == NULL)
return ret;
}
+static int
+is_stream_packed(struct wim_lookup_table_entry *lte, void *_ignore)
+{
+ return lte_is_partial(lte);
+}
+
+static bool
+wim_has_packed_streams(WIMStruct *wim)
+{
+ return for_lookup_table_entry(wim->lookup_table, is_stream_packed, NULL);
+}
+
static int
wim_write_stream_list(WIMStruct *wim,
struct list_head *stream_list,
write_resource_flags = write_flags_to_resource_flags(write_flags);
- /* wimlib v1.6.3: pack streams by default if the WIM version number is
- * that usually used in solid archives. */
- if (wim->hdr.wim_version == WIM_VERSION_PACKED_STREAMS)
+ /* wimlib v1.6.3: pack streams by default if the WIM version has been
+ * set to WIM_VERSION_PACKED_STREAMS and at least one stream in the
+ * WIM's lookup table is located in a packed resource (may be the same
+ * WIM, or a different one in the case of export). */
+ if (wim->hdr.wim_version == WIM_VERSION_PACKED_STREAMS &&
+ wim_has_packed_streams(wim))
+ {
write_resource_flags |= WRITE_RESOURCE_FLAG_PACK_STREAMS;
+ }
if (write_resource_flags & WRITE_RESOURCE_FLAG_PACK_STREAMS) {
out_chunk_size = wim->out_pack_chunk_size;
* @stream_list_ret.
*
* SKIP_EXTERNAL_WIMS: Streams already present in a WIM file, but not
- * @wim, shall be be returned in neither @stream_list_ret nor
+ * @wim, shall be returned in neither @stream_list_ret nor
* @lookup_table_list_ret.
*
* @stream_list_ret
if (write_flags & WIMLIB_WRITE_FLAG_CHECK_INTEGRITY)
DEBUG("\tCHECK_INTEGRITY");
- if (write_flags & WIMLIB_WRITE_FLAG_REBUILD)
- DEBUG("\tREBUILD");
+ if (write_flags & WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY)
+ DEBUG("\tNO_CHECK_INTEGRITY");
+
+ if (write_flags & WIMLIB_WRITE_FLAG_PIPABLE)
+ DEBUG("\tPIPABLE");
+
+ if (write_flags & WIMLIB_WRITE_FLAG_NOT_PIPABLE)
+ DEBUG("\tNOT_PIPABLE");
if (write_flags & WIMLIB_WRITE_FLAG_RECOMPRESS)
DEBUG("\tRECOMPRESS");
if (write_flags & WIMLIB_WRITE_FLAG_FSYNC)
DEBUG("\tFSYNC");
+ if (write_flags & WIMLIB_WRITE_FLAG_REBUILD)
+ DEBUG("\tREBUILD");
+
if (write_flags & WIMLIB_WRITE_FLAG_SOFT_DELETE)
- DEBUG("\tFSYNC");
+ DEBUG("\tSOFT_DELETE");
if (write_flags & WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG)
DEBUG("\tIGNORE_READONLY_FLAG");
- if (write_flags & WIMLIB_WRITE_FLAG_PIPABLE)
- DEBUG("\tPIPABLE");
+ if (write_flags & WIMLIB_WRITE_FLAG_SKIP_EXTERNAL_WIMS)
+ DEBUG("\tSKIP_EXTERNAL_WIMS");
- if (write_flags & WIMLIB_WRITE_FLAG_NOT_PIPABLE)
- DEBUG("\tNOT_PIPABLE");
+ if (write_flags & WIMLIB_WRITE_FLAG_STREAMS_OK)
+ DEBUG("\tSTREAMS_OK");
+
+ if (write_flags & WIMLIB_WRITE_FLAG_RETAIN_GUID)
+ DEBUG("\tRETAIN_GUID");
if (write_flags & WIMLIB_WRITE_FLAG_PACK_STREAMS)
DEBUG("\tPACK_STREAMS");
DEBUG("Number of threads: %u", num_threads);
DEBUG("Progress function: %s", (progress_func ? "yes" : "no"));
DEBUG("Stream list: %s", (stream_list_override ? "specified" : "autodetect"));
- DEBUG("GUID: %s", ((guid || wim->guid_set_explicitly) ?
- "specified" : "generate new"));
+ DEBUG("GUID: %s", (write_flags &
+ WIMLIB_WRITE_FLAG_RETAIN_GUID) ? "retain"
+ : guid ? "explicit" : "generate new");
/* Internally, this is always called with a valid part number and total
* parts. */
/* Set chunk size if different. */
wim->hdr.chunk_size = wim->out_chunk_size;
- /* Use GUID if specified; otherwise generate a new one. */
- if (guid)
- memcpy(wim->hdr.guid, guid, WIMLIB_GUID_LEN);
- else if (!wim->guid_set_explicitly)
- randomize_byte_array(wim->hdr.guid, WIMLIB_GUID_LEN);
+ /* Set GUID. */
+ if (!(write_flags & WIMLIB_WRITE_FLAG_RETAIN_GUID)) {
+ if (guid)
+ memcpy(wim->hdr.guid, guid, WIMLIB_GUID_LEN);
+ else
+ randomize_byte_array(wim->hdr.guid, WIMLIB_GUID_LEN);
+ }
/* Clear references to resources that have not been written yet. */
zero_reshdr(&wim->hdr.lookup_table_reshdr);
* Integrity table (optional) (variable size)
*
* This method allows an image to be appended to a large WIM very quickly, and
- * is is crash-safe except in the case of write re-ordering, but the
+ * is crash-safe except in the case of write re-ordering, but the
* disadvantage is that a small hole is left in the WIM where the old lookup
* table, xml data, and integrity table were. (These usually only take up a
* small amount of space compared to the streams, however.)
tmpfile[wim_name_len + 9] = T('\0');
ret = wimlib_write(wim, tmpfile, WIMLIB_ALL_IMAGES,
- write_flags | WIMLIB_WRITE_FLAG_FSYNC,
+ write_flags |
+ WIMLIB_WRITE_FLAG_FSYNC |
+ WIMLIB_WRITE_FLAG_RETAIN_GUID,
num_threads, progress_func);
if (ret) {
tunlink(tmpfile);