]> wimlib.net Git - wimlib/blobdiff - src/write.c
WIM chunk size: Calculate with existing macros when possible
[wimlib] / src / write.c
index abbe4c01fc4668bdaff71f1d1f3a647ea441a3cb..fde7e939ed57a83d4ef053ff0d69db755d96750d 100644 (file)
@@ -87,7 +87,10 @@ struct chunk_table {
        u64 table_disk_size;
        u64 cur_offset;
        u64 *cur_offset_p;
        u64 table_disk_size;
        u64 cur_offset;
        u64 *cur_offset_p;
-       u64 offsets[0];
+       union {
+               u64 offsets[0];
+               u32 u32_offsets[0];
+       };
 };
 
 /*
 };
 
 /*
@@ -101,7 +104,7 @@ begin_wim_resource_chunk_tab(const struct wim_lookup_table_entry *lte,
                             struct chunk_table **chunk_tab_ret)
 {
        u64 size = wim_resource_size(lte);
                             struct chunk_table **chunk_tab_ret)
 {
        u64 size = wim_resource_size(lte);
-       u64 num_chunks = (size + WIM_CHUNK_SIZE - 1) / WIM_CHUNK_SIZE;
+       u64 num_chunks = wim_resource_chunks(lte);
        size_t alloc_size = sizeof(struct chunk_table) + num_chunks * sizeof(u64);
        struct chunk_table *chunk_tab = CALLOC(1, alloc_size);
 
        size_t alloc_size = sizeof(struct chunk_table) + num_chunks * sizeof(u64);
        struct chunk_table *chunk_tab = CALLOC(1, alloc_size);
 
@@ -115,7 +118,7 @@ begin_wim_resource_chunk_tab(const struct wim_lookup_table_entry *lte,
        chunk_tab->file_offset = file_offset;
        chunk_tab->num_chunks = num_chunks;
        chunk_tab->original_resource_size = size;
        chunk_tab->file_offset = file_offset;
        chunk_tab->num_chunks = num_chunks;
        chunk_tab->original_resource_size = size;
-       chunk_tab->bytes_per_chunk_entry = (size >= (1ULL << 32)) ? 8 : 4;
+       chunk_tab->bytes_per_chunk_entry = (size > (1ULL << 32)) ? 8 : 4;
        chunk_tab->table_disk_size = chunk_tab->bytes_per_chunk_entry *
                                     (num_chunks - 1);
        chunk_tab->cur_offset = 0;
        chunk_tab->table_disk_size = chunk_tab->bytes_per_chunk_entry *
                                     (num_chunks - 1);
        chunk_tab->cur_offset = 0;
@@ -233,8 +236,7 @@ finish_wim_resource_chunk_tab(struct chunk_table *chunk_tab,
                array_cpu_to_le64(chunk_tab->offsets, chunk_tab->num_chunks);
        } else {
                for (u64 i = 0; i < chunk_tab->num_chunks; i++)
                array_cpu_to_le64(chunk_tab->offsets, chunk_tab->num_chunks);
        } else {
                for (u64 i = 0; i < chunk_tab->num_chunks; i++)
-                       ((u32*)chunk_tab->offsets)[i] =
-                               cpu_to_le32(chunk_tab->offsets[i]);
+                       chunk_tab->u32_offsets[i] = cpu_to_le32(chunk_tab->offsets[i]);
        }
        bytes_written = full_pwrite(out_fd,
                                    (u8*)chunk_tab->offsets + chunk_tab->bytes_per_chunk_entry,
        }
        bytes_written = full_pwrite(out_fd,
                                    (u8*)chunk_tab->offsets + chunk_tab->bytes_per_chunk_entry,