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
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);
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;
}
+ /* Write header with write in progress flag set. */
+ 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) {
+ 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;
}