wimlib_assert(in_fd->offset == 0);
- if (!filename) {
+ if (filename == NULL) {
pipe_str = alloca(40);
tsprintf(pipe_str, T("[fd %d]"), in_fd->fd);
filename = pipe_str;
}
hdr->flags = le32_to_cpu(disk_hdr.wim_flags);
- if (le32_to_cpu(disk_hdr.chunk_size) != WIM_CHUNK_SIZE &&
- (hdr->flags & WIM_HDR_FLAG_COMPRESSION)) {
- ERROR("\"%"TS"\": Unexpected chunk size of %u! Ask the author to "
- "implement support for other chunk sizes.",
- filename, le32_to_cpu(disk_hdr.chunk_size));
- ERROR("(Or it might just be that the WIM header is invalid.)");
- return WIMLIB_ERR_INVALID_CHUNK_SIZE;
- }
-
+ hdr->chunk_size = le32_to_cpu(disk_hdr.chunk_size);
memcpy(hdr->guid, disk_hdr.guid, WIM_GID_LEN);
-
hdr->part_number = le16_to_cpu(disk_hdr.part_number);
hdr->total_parts = le16_to_cpu(disk_hdr.total_parts);
disk_hdr.hdr_size = cpu_to_le32(sizeof(struct wim_header_disk));
disk_hdr.wim_version = cpu_to_le32(WIM_VERSION);
disk_hdr.wim_flags = cpu_to_le32(hdr->flags);
- disk_hdr.chunk_size = cpu_to_le32((hdr->flags & WIM_HDR_FLAG_COMPRESSION) ?
- WIM_CHUNK_SIZE : 0);
+ if (hdr->flags & WIM_HDR_FLAG_COMPRESSION)
+ disk_hdr.chunk_size = cpu_to_le32(hdr->chunk_size);
+ else
+ disk_hdr.chunk_size = 0;
memcpy(disk_hdr.guid, hdr->guid, WIM_GID_LEN);
disk_hdr.part_number = cpu_to_le16(hdr->part_number);
offsetof(struct wim_header_disk, wim_flags));
}
-/*
- * Initializes the header for a WIM file.
- */
int
-init_wim_header(struct wim_header *hdr, int ctype)
+set_wim_hdr_cflags(int ctype, struct wim_header *hdr)
{
- memset(hdr, 0, sizeof(struct wim_header));
+ hdr->flags &= ~(WIM_HDR_FLAG_COMPRESSION |
+ WIM_HDR_FLAG_COMPRESS_LZX |
+ WIM_HDR_FLAG_COMPRESS_RESERVED |
+ WIM_HDR_FLAG_COMPRESS_XPRESS |
+ WIM_HDR_FLAG_COMPRESS_LZMS);
switch (ctype) {
+
case WIMLIB_COMPRESSION_TYPE_NONE:
- hdr->flags = 0;
- break;
+ return 0;
+
case WIMLIB_COMPRESSION_TYPE_LZX:
- hdr->flags = WIM_HDR_FLAG_COMPRESSION |
- WIM_HDR_FLAG_COMPRESS_LZX;
- break;
+ hdr->flags |= WIM_HDR_FLAG_COMPRESSION | WIM_HDR_FLAG_COMPRESS_LZX;
+ return 0;
+
case WIMLIB_COMPRESSION_TYPE_XPRESS:
- hdr->flags = WIM_HDR_FLAG_COMPRESSION |
- WIM_HDR_FLAG_COMPRESS_XPRESS;
- break;
+ hdr->flags |= WIM_HDR_FLAG_COMPRESSION | WIM_HDR_FLAG_COMPRESS_XPRESS;
+ return 0;
+
default:
+ return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
+ }
+}
+
+/*
+ * Initializes the header for a WIM file.
+ */
+int
+init_wim_header(struct wim_header *hdr, int ctype, u32 chunk_size)
+{
+ memset(hdr, 0, sizeof(struct wim_header));
+ hdr->magic = WIM_MAGIC;
+ if (set_wim_hdr_cflags(ctype, hdr)) {
ERROR("Invalid compression type specified (%d)", ctype);
return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
}
+ hdr->chunk_size = chunk_size;
hdr->total_parts = 1;
hdr->part_number = 1;
randomize_byte_array(hdr->guid, sizeof(hdr->guid));
- hdr->magic = WIM_MAGIC;
return 0;
}
if (hdr_flags[i].flag & hdr->flags)
tprintf(T(" WIM_HDR_FLAG_%s is set\n"), hdr_flags[i].name);
- tprintf(T("Chunk Size = %u\n"), WIM_CHUNK_SIZE);
+ tprintf(T("Chunk Size = %u\n"), wim->hdr.chunk_size);
tfputs (T("GUID = "), stdout);
print_byte_field(hdr->guid, WIM_GID_LEN, stdout);
tputchar(T('\n'));