]> wimlib.net Git - wimlib/blobdiff - src/header.c
Update version to 1.4.2
[wimlib] / src / header.c
index 5a665fc25113db71eec709ca697cd063839c5943..6bdf089f1fb132533147eb30d8d73af5f211acdd 100644 (file)
@@ -115,11 +115,12 @@ struct wim_header_disk {
 
 /* Reads the header from a WIM file.  */
 int
-read_header(const tchar *filename, int in_fd,
-           struct wim_header *hdr, int open_flags)
+read_header(const tchar *filename, int in_fd, struct wim_header *hdr)
 {
        struct wim_header_disk disk_hdr _aligned_attribute(8);
 
+       BUILD_BUG_ON(sizeof(struct wim_header_disk) != WIM_HEADER_DISK_SIZE);
+
        DEBUG("Reading WIM header from \"%"TS"\"", filename);
 
        if (full_pread(in_fd, &disk_hdr, sizeof(disk_hdr), 0) != sizeof(disk_hdr)) {
@@ -132,7 +133,6 @@ read_header(const tchar *filename, int in_fd,
                return WIMLIB_ERR_NOT_A_WIM_FILE;
        }
 
-       BUILD_BUG_ON(sizeof(struct wim_header_disk) != WIM_HEADER_DISK_SIZE);
        if (le32_to_cpu(disk_hdr.hdr_size) != sizeof(struct wim_header_disk)) {
                ERROR("\"%"TS"\": Header size is invalid (%u bytes)",
                      filename, le32_to_cpu(disk_hdr.hdr_size));
@@ -169,13 +169,6 @@ read_header(const tchar *filename, int in_fd,
                return WIMLIB_ERR_INVALID_PART_NUMBER;
        }
 
-       if (!(open_flags & WIMLIB_OPEN_FLAG_SPLIT_OK) && hdr->total_parts != 1)
-       {
-               ERROR("\"%"TS"\": This WIM is part %u of a %u-part WIM",
-                     filename, hdr->part_number, hdr->total_parts);
-               return WIMLIB_ERR_SPLIT_UNSUPPORTED;
-       }
-
        hdr->image_count = le32_to_cpu(disk_hdr.image_count);
 
        DEBUG("part_number = %u, total_parts = %u, image_count = %u",
@@ -235,6 +228,38 @@ write_header(const struct wim_header *hdr, int out_fd)
        return 0;
 }
 
+/* Update just the wim_flags field. */
+int
+write_header_flags(u32 hdr_flags, int out_fd)
+{
+       le32 flags = cpu_to_le32(hdr_flags);
+       if (full_pwrite(out_fd, &flags, sizeof(flags),
+                       offsetof(struct wim_header_disk, wim_flags)) != sizeof(flags))
+       {
+               return WIMLIB_ERR_WRITE;
+       } else {
+               return 0;
+       }
+
+}
+
+/* Update just the part_number and total_parts fields. */
+int
+write_header_part_data(u16 part_number, u16 total_parts, int out_fd)
+{
+       le16 part_data[2] = {
+               cpu_to_le16(part_number),
+               cpu_to_le16(total_parts),
+       };
+       if (full_pwrite(out_fd, &part_data, sizeof(part_data),
+                       offsetof(struct wim_header_disk, part_number)) != sizeof(part_data))
+       {
+               return WIMLIB_ERR_WRITE;
+       } else {
+               return 0;
+       }
+}
+
 /*
  * Initializes the header for a WIM file.
  */
@@ -282,11 +307,11 @@ struct hdr_flag hdr_flags[] = {
        {WIM_HDR_FLAG_COMPRESS_XPRESS,  "COMPRESS_XPRESS"},
 };
 
-/* Prints information from the header of the WIM file associated with @w. */
+/* Prints information from the header of the WIM file associated with @wim. */
 WIMLIBAPI void
-wimlib_print_header(const WIMStruct *w)
+wimlib_print_header(const WIMStruct *wim)
 {
-       const struct wim_header *hdr = &w->hdr;
+       const struct wim_header *hdr = &wim->hdr;
 
        tprintf(T("Magic Characters            = MSWIM\\000\\000\\000\n"));
        tprintf(T("Header Size                 = %u\n"), WIM_HEADER_DISK_SIZE);
@@ -301,8 +326,8 @@ wimlib_print_header(const WIMStruct *w)
        tfputs (T("GUID                        = "), stdout);
        print_byte_field(hdr->guid, WIM_GID_LEN, stdout);
        tputchar(T('\n'));
-       tprintf(T("Part Number                 = %hu\n"), w->hdr.part_number);
-       tprintf(T("Total Parts                 = %hu\n"), w->hdr.total_parts);
+       tprintf(T("Part Number                 = %hu\n"), wim->hdr.part_number);
+       tprintf(T("Total Parts                 = %hu\n"), wim->hdr.total_parts);
        tprintf(T("Image Count                 = %u\n"), hdr->image_count);
        tprintf(T("Lookup Table Size           = %"PRIu64"\n"),
                                (u64)hdr->lookup_table_res_entry.size);