]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Allow multiple wimlib_global_init/cleanup per app
[wimlib] / src / wim.c
index ff4ac29be3e53b7c3d981924ee8f452be0b1dcdc..a3dd135cb820b098501ab439bf8d53a1150984f7 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -66,9 +66,7 @@ static u32
 wim_default_pack_chunk_size(int ctype) {
        switch (ctype) {
        case WIMLIB_COMPRESSION_TYPE_LZMS:
 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  */
+               return 1U << 26; /* 67108864  */
        default:
                return 1U << 15; /* 32768     */
        }
        default:
                return 1U << 15; /* 32768     */
        }
@@ -328,8 +326,22 @@ new_image_metadata_array(unsigned num_images)
 }
 
 
 }
 
 
-/* Load the metadata for the specified WIM image into memory and set it as the
- * WIMStruct's currently selected WIM image.  */
+/*
+ * Load the metadata for the specified WIM image into memory and set it
+ * as the WIMStruct's currently selected image.
+ *
+ * @wim
+ *     The WIMStruct for the WIM.
+ * @image
+ *     The 1-based index of the image in the WIM to select.
+ *
+ * On success, 0 will be returned, wim->current_image will be set to
+ * @image, and wim_get_current_image_metadata() can be used to retrieve
+ * metadata information for the image.
+ *
+ * On failure, WIMLIB_ERR_INVALID_IMAGE, WIMLIB_ERR_METADATA_NOT_FOUND,
+ * or another error code will be returned.
+ */
 int
 select_wim_image(WIMStruct *wim, int image)
 {
 int
 select_wim_image(WIMStruct *wim, int image)
 {
@@ -537,8 +549,6 @@ static int
 set_out_ctype(int ctype, u8 *out_ctype_p)
 {
        switch (ctype) {
 set_out_ctype(int ctype, u8 *out_ctype_p)
 {
        switch (ctype) {
-       case WIMLIB_COMPRESSION_TYPE_INVALID:
-               break;
        case WIMLIB_COMPRESSION_TYPE_NONE:
        case WIMLIB_COMPRESSION_TYPE_LZX:
        case WIMLIB_COMPRESSION_TYPE_XPRESS:
        case WIMLIB_COMPRESSION_TYPE_NONE:
        case WIMLIB_COMPRESSION_TYPE_LZX:
        case WIMLIB_COMPRESSION_TYPE_XPRESS:
@@ -1001,13 +1011,13 @@ wimlib_get_version(void)
        return WIMLIB_VERSION_CODE;
 }
 
        return WIMLIB_VERSION_CODE;
 }
 
+static bool lib_initialized = false;
+
 /* API function documented in wimlib.h  */
 WIMLIBAPI int
 wimlib_global_init(int init_flags)
 {
 /* API function documented in wimlib.h  */
 WIMLIBAPI int
 wimlib_global_init(int init_flags)
 {
-       static bool already_inited = false;
-
-       if (already_inited)
+       if (lib_initialized)
                return 0;
 
        if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
                return 0;
 
        if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
@@ -1033,12 +1043,13 @@ wimlib_global_init(int init_flags)
                        return ret;
        }
 #endif
                        return ret;
        }
 #endif
+       iconv_global_init();
        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;
        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;
+       lib_initialized = true;
        return 0;
 }
 
        return 0;
 }
 
@@ -1046,6 +1057,8 @@ wimlib_global_init(int init_flags)
 WIMLIBAPI void
 wimlib_global_cleanup(void)
 {
 WIMLIBAPI void
 wimlib_global_cleanup(void)
 {
+       if (!lib_initialized)
+               return;
        libxml_global_cleanup();
        iconv_global_cleanup();
 #ifdef __WIN32__
        libxml_global_cleanup();
        iconv_global_cleanup();
 #ifdef __WIN32__
@@ -1053,4 +1066,5 @@ wimlib_global_cleanup(void)
 #endif
        cleanup_decompressor_params();
        cleanup_compressor_params();
 #endif
        cleanup_decompressor_params();
        cleanup_compressor_params();
+       lib_initialized = false;
 }
 }