]> wimlib.net Git - wimlib/blobdiff - src/wim.c
new_wim_struct(): Use filedes_invalidate()
[wimlib] / src / wim.c
index 7a94bd8a9dbf094fcf2cccf374cd77813c2b8d53..11e2f9048aeb345995b8ddea83a3250c138129be 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -64,14 +64,34 @@ image_print_metadata(WIMStruct *wim)
                                  wim->lookup_table);
 }
 
+static int
+wim_default_pack_compression_type(void)
+{
+       return WIMLIB_COMPRESSION_TYPE_LZMS;
+}
+
+static u32
+wim_default_pack_chunk_size(int ctype) {
+       switch (ctype) {
+       case WIMLIB_COMPRESSION_TYPE_LZMS:
+               /* Note: WIMGAPI uses 1 << 26, but lower sizes are compatible.
+                * */
+               return 1U << 25; /* 33554432  */
+       default:
+               return 1U << 15; /* 32768     */
+       }
+}
 
 static WIMStruct *
 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);
                INIT_LIST_HEAD(&wim->subwims);
        }
        return wim;
@@ -154,18 +174,6 @@ wim_default_chunk_size(int ctype)
        }
 }
 
-static u32
-wim_default_pack_chunk_size(int ctype) {
-       switch (ctype) {
-       case WIMLIB_COMPRESSION_TYPE_LZMS:
-               /* Note: WIMGAPI uses 1 << 26, but lower sizes are compatible.
-                * */
-               return 1U << 25; /* 33554432  */
-       default:
-               return 1U << 15; /* 32768     */
-       }
-}
-
 /*
  * 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
@@ -231,10 +239,8 @@ wimlib_create_new_wim(int ctype, WIMStruct **wim_ret)
        wim->refcnts_ok = 1;
        wim->compression_type = ctype;
        wim->out_compression_type = ctype;
-       wim->out_pack_compression_type = ctype;
        wim->chunk_size = wim->hdr.chunk_size;
        wim->out_chunk_size = wim->hdr.chunk_size;
-       wim->out_pack_chunk_size = wim_default_pack_chunk_size(ctype);
        *wim_ret = wim;
        return 0;
 out_free:
@@ -391,7 +397,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;
@@ -667,12 +673,10 @@ begin_read(WIMStruct *wim, const void *wim_filename_or_fd,
                wim->compression_type = WIMLIB_COMPRESSION_TYPE_NONE;
        }
        wim->out_compression_type = wim->compression_type;
-       wim->out_pack_compression_type = wim->compression_type;
 
        /* Check and cache the chunk size.  */
        wim->chunk_size = wim->hdr.chunk_size;
        wim->out_chunk_size = wim->chunk_size;
-       wim->out_pack_chunk_size = wim_default_pack_chunk_size(wim->out_pack_compression_type);
        if (!wim_chunk_size_valid(wim->chunk_size, wim->compression_type)) {
                ERROR("Invalid chunk size (%"PRIu32" bytes) "
                      "for compression type %"TS"!",
@@ -705,9 +709,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)
@@ -721,6 +722,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;
@@ -1014,7 +1020,6 @@ WIMLIBAPI int
 wimlib_global_init(int init_flags)
 {
        static bool already_inited = false;
-       int ret;
 
        if (already_inited)
                return 0;
@@ -1027,14 +1032,19 @@ wimlib_global_init(int init_flags)
        #endif
        }
 #ifdef __WIN32__
-       ret = win32_global_init(init_flags);
-       if (ret)
-               return ret;
-#else
-       ret = 0;
+       {
+               int ret = win32_global_init(init_flags);
+               if (ret)
+                       return ret;
+       }
 #endif
+       init_upcase();
+       if (init_flags & WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE)
+               default_ignore_case = false;
+       else if (init_flags & WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE)
+               default_ignore_case = true;
        already_inited = true;
-       return ret;
+       return 0;
 }
 
 /* API function documented in wimlib.h  */