if (!(flags & WIMLIB_RESOURCE_FLAG_RECOMPRESS) &&
lte->resource_location == RESOURCE_IN_WIM &&
out_ctype != WIMLIB_COMPRESSION_TYPE_NONE &&
- wimlib_get_compression_type(lte->wim) == out_ctype)
+ lte->wim->compression_type == out_ctype)
{
flags |= WIMLIB_RESOURCE_FLAG_RAW;
write_ctx.doing_sha = false;
ctx->out_ctype == WIMLIB_COMPRESSION_TYPE_NONE ||
(lte->resource_location == RESOURCE_IN_WIM &&
!(ctx->write_resource_flags & WIMLIB_RESOURCE_FLAG_RECOMPRESS) &&
- wimlib_get_compression_type(lte->wim) == ctx->out_ctype))
+ lte->wim->compression_type == ctx->out_ctype))
{
/* Stream is too small or isn't being compressed. Process it by
* the main thread when we have a chance. We can't necessarily
if (lte->resource_entry.offset +
lte->resource_entry.size > args->end_offset)
{
- #ifdef ENABLE_ERROR_MESSAGES
- ERROR("The following resource is after the XML data:");
- print_lookup_table_entry(lte, stderr);
- #endif
+ if (wimlib_print_errors) {
+ ERROR("The following resource is after the XML data:");
+ print_lookup_table_entry(lte, stderr);
+ }
return WIMLIB_ERR_RESOURCE_ORDER;
}
copy_resource_entry(<e->output_resource_entry,
return write_stream_list(&stream_list,
wim->lookup_table,
wim->out_fd,
- wimlib_get_compression_type(wim),
+ wim->compression_type,
write_flags,
num_threads,
progress_func);
struct wim_header checkpoint_hdr;
memcpy(&checkpoint_hdr, &hdr, sizeof(struct wim_header));
zero_resource_entry(&checkpoint_hdr.integrity);
+ checkpoint_hdr.flags |= WIM_HDR_FLAG_WRITE_IN_PROGRESS;
ret = write_header(&checkpoint_hdr, w->out_fd);
if (ret)
goto out_close_wim;
zero_resource_entry(&hdr.integrity);
}
+ hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS;
ret = write_header(&hdr, w->out_fd);
if (ret)
goto out_close_wim;
if (ret)
return ret;
/* Write dummy header. It will be overwritten later. */
+ w->hdr.flags |= WIM_HDR_FLAG_WRITE_IN_PROGRESS;
ret = write_header(&w->hdr, w->out_fd);
+ w->hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS;
if (ret)
return ret;
if (lseek(w->out_fd, WIM_HEADER_DISK_SIZE, SEEK_SET) == -1) {
return ret;
}
+ /* Set WIM_HDR_FLAG_WRITE_IN_PROGRESS flag in header. */
+ ret = write_header_flags(w->hdr.flags | WIM_HDR_FLAG_WRITE_IN_PROGRESS,
+ w->out_fd);
+ if (ret) {
+ ERROR_WITH_ERRNO("Error updating WIM header flags");
+ close_wim_writable(w);
+ goto out_unlock_wim;
+ }
+
if (lseek(w->out_fd, old_wim_end, SEEK_SET) == -1) {
ERROR_WITH_ERRNO("Can't seek to end of WIM");
close_wim_writable(w);
- w->wim_locked = 0;
- return WIMLIB_ERR_WRITE;
+ ret = WIMLIB_ERR_WRITE;
+ goto out_unlock_wim;
}
DEBUG("Writing newly added streams (offset = %"PRIu64")",
ret = write_stream_list(&stream_list,
w->lookup_table,
w->out_fd,
- wimlib_get_compression_type(w),
+ w->compression_type,
write_flags,
num_threads,
progress_func);
* an error path. */
(void)ttruncate(w->filename, old_wim_end);
}
+out_unlock_wim:
w->wim_locked = 0;
return ret;
}
unsigned num_threads,
wimlib_progress_func_t progress_func)
{
+ int ret;
+ u32 orig_hdr_flags;
+
write_flags &= WIMLIB_WRITE_MASK_PUBLIC;
if (!w->filename)
return WIMLIB_ERR_NO_FILENAME;
- if (w->hdr.total_parts != 1) {
- ERROR("Cannot modify a split WIM");
- return WIMLIB_ERR_SPLIT_UNSUPPORTED;
- }
+ orig_hdr_flags = w->hdr.flags;
+ if (write_flags & WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG)
+ w->hdr.flags &= ~WIM_HDR_FLAG_READONLY;
+ ret = can_modify_wim(w);
+ w->hdr.flags = orig_hdr_flags;
+ if (ret)
+ return ret;
if ((!w->deletion_occurred || (write_flags & WIMLIB_WRITE_FLAG_SOFT_DELETE))
&& !(write_flags & WIMLIB_WRITE_FLAG_REBUILD))