]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Adjust documentation for alternate chunk sizes
[wimlib] / src / wim.c
index 6c69de35049a1f8c6c03d8c0e8ae626c4d5a0a11..b36da84f2adb2196642d210c9436dfcd5a258f77 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -87,8 +87,8 @@ new_wim_struct(void)
 {
        WIMStruct *wim = CALLOC(1, sizeof(WIMStruct));
        if (wim) {
-               wim->in_fd.fd = -1;
-               wim->out_fd.fd = -1;
+               filedes_invalidate(&wim->in_fd);
+               filedes_invalidate(&wim->out_fd);
                wim->out_pack_compression_type = wim_default_pack_compression_type();
                wim->out_pack_chunk_size = wim_default_pack_chunk_size(
                                                wim->out_pack_compression_type);
@@ -130,30 +130,14 @@ wim_chunk_size_valid(u32 chunk_size, int ctype)
         * 25           33554432
         * 26           67108864
         */
+
+       /* See the documentation for the --chunk-size option of `wimlib-imagex
+        * capture' for information about allowed chunk sizes.  */
        switch (ctype) {
        case WIMLIB_COMPRESSION_TYPE_LZX:
-               /* For LZX compression, the chunk size corresponds to the LZX
-                * window size, which according the LZX specification can be any
-                * power of 2 between 2^15 and 2^21, inclusively.  All these are
-                * supported by wimlib; however, unfortunately only 2^15 is
-                * supported by WIMGAPI[1] so this value is used by default.
-                *
-                * [1] WIMGAPI (Windows 7) attempts to decompress LZX chunk
-                * sizes > 2^15 but seems to have bug(s) that cause it to fail
-                * or crash.  (I tried several tweaks to the LZX data but none
-                * resulted in successful decompression.)  WIMGAPI (Windows 8)
-                * appears to refuse to open WIMs with chunk size > 2^15
-                * entirely.  */
                return order >= 15 && order <= 21;
 
        case WIMLIB_COMPRESSION_TYPE_XPRESS:
-               /* WIMGAPI (Windows 7, Windows 8) doesn't seem to support XPRESS
-                * chunk size below 32768 bytes, but larger power-of-two sizes,
-                * up ta 67108864 bytes, appear to work.  (Note, however, that
-                * the offsets of XPRESS matches are still limited to 65535
-                * bytes even when a much larger chunk size is used!)  */
-               return order >= 15 && order <= 26;
-
        case WIMLIB_COMPRESSION_TYPE_LZMS:
                return order >= 15 && order <= 26;
        }
@@ -175,10 +159,10 @@ wim_default_chunk_size(int ctype)
 }
 
 /*
- * Calls a function on images in the WIM.  If @image is WIMLIB_ALL_IMAGES, @visitor
- * is called on the WIM once for each image, with each image selected as the
- * current image in turn.  If @image is a certain image, @visitor is called on
- * the WIM only once, with that image selected.
+ * Calls a function on images in the WIM.  If @image is WIMLIB_ALL_IMAGES,
+ * @visitor is called on the WIM once for each image, with each image selected
+ * as the current image in turn.  If @image is a certain image, @visitor is
+ * called on the WIM only once, with that image selected.
  */
 int
 for_image(WIMStruct *wim, int image, int (*visitor)(WIMStruct *))
@@ -397,7 +381,7 @@ wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info)
        info->image_count = wim->hdr.image_count;
        info->boot_index = wim->hdr.boot_idx;
        info->wim_version = wim->hdr.wim_version;
-       info->chunk_size = wim->hdr.chunk_size;
+       info->chunk_size = wim->chunk_size;
        info->part_number = wim->hdr.part_number;
        info->total_parts = wim->hdr.total_parts;
        info->compression_type = wim->compression_type;
@@ -709,9 +693,6 @@ begin_read(WIMStruct *wim, const void *wim_filename_or_fd,
                if (wim->lookup_table == NULL)
                        return WIMLIB_ERR_NOMEM;
        } else {
-               ret = read_wim_lookup_table(wim);
-               if (ret)
-                       return ret;
 
                ret = read_wim_xml_data(wim);
                if (ret)
@@ -725,6 +706,11 @@ begin_read(WIMStruct *wim, const void *wim_filename_or_fd,
                              "<IMAGE> element per image.", wim->hdr.image_count);
                        return WIMLIB_ERR_IMAGE_COUNT;
                }
+
+               ret = read_wim_lookup_table(wim);
+               if (ret)
+                       return ret;
+
                DEBUG("Done beginning read of WIM file `%"TS"'.", wimfile);
        }
        return 0;