]> wimlib.net Git - wimlib/blobdiff - src/wim.c
avl_tree: Optimize swapping node for removal
[wimlib] / src / wim.c
index d885b7970988f6d6412cf1686b4f32c3d5c9c155..9daa8e3bc60c8765ac1022a89002da1d32f19bea 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -40,6 +40,7 @@
 #include "wimlib/xml.h"
 #include "wimlib/compressor_ops.h"
 #include "wimlib/decompressor_ops.h"
+#include "wimlib/version.h"
 
 #ifdef __WIN32__
 #  include "wimlib/win32.h" /* for realpath() replacement */
@@ -129,8 +130,9 @@ wim_chunk_size_valid(u32 chunk_size, int ctype)
                return order >= 15 && order <= 21;
 
        case WIMLIB_COMPRESSION_TYPE_XPRESS:
-       case WIMLIB_COMPRESSION_TYPE_LZMS:
                return order >= 15 && order <= 26;
+       case WIMLIB_COMPRESSION_TYPE_LZMS:
+               return order >= 15 && order <= 30;
        }
        return false;
 }
@@ -223,6 +225,8 @@ out_free:
        return ret;
 }
 
+/* Load the metadata for the specified WIM image into memory and set it as the
+ * WIMStruct's currently selected WIM image.  */
 int
 select_wim_image(WIMStruct *wim, int image)
 {
@@ -252,8 +256,8 @@ select_wim_image(WIMStruct *wim, int image)
                return WIMLIB_ERR_METADATA_NOT_FOUND;
        }
 
-       /* If a valid image is currently selected, it can be freed if it is not
-        * modified.  */
+       /* If a valid image is currently selected, its metadata can be freed if
+        * it has not been modified.  */
        if (wim->current_image != WIMLIB_NO_IMAGE) {
                imd = wim_get_current_image_metadata(wim);
                if (!imd->modified) {
@@ -392,6 +396,12 @@ wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int whic
 {
        int ret;
 
+       if (which & ~(WIMLIB_CHANGE_READONLY_FLAG |
+                     WIMLIB_CHANGE_GUID |
+                     WIMLIB_CHANGE_BOOT_INDEX |
+                     WIMLIB_CHANGE_RPFIX_FLAG))
+               return WIMLIB_ERR_INVALID_PARAM;
+
        if (which & WIMLIB_CHANGE_READONLY_FLAG) {
                if (info->is_marked_readonly)
                        wim->hdr.flags |= WIM_HDR_FLAG_READONLY;
@@ -721,7 +731,11 @@ WIMLIBAPI int
 wimlib_open_wim(const tchar *wimfile, int open_flags,
                WIMStruct **wim_ret, wimlib_progress_func_t progress_func)
 {
-       open_flags &= WIMLIB_OPEN_MASK_PUBLIC;
+       if (open_flags & ~(WIMLIB_OPEN_FLAG_CHECK_INTEGRITY |
+                          WIMLIB_OPEN_FLAG_ERROR_IF_SPLIT |
+                          WIMLIB_OPEN_FLAG_WRITE_ACCESS))
+               return WIMLIB_ERR_INVALID_PARAM;
+
        return open_wim_as_WIMStruct(wimfile, open_flags, wim_ret,
                                     progress_func);
 }
@@ -967,6 +981,13 @@ test_locale_ctype_utf8(void)
 #endif
 }
 
+/* API function documented in wimlib.h  */
+WIMLIBAPI u32
+wimlib_get_version(void)
+{
+       return WIMLIB_VERSION_CODE;
+}
+
 /* API function documented in wimlib.h  */
 WIMLIBAPI int
 wimlib_global_init(int init_flags)
@@ -975,6 +996,15 @@ wimlib_global_init(int init_flags)
 
        if (already_inited)
                return 0;
+
+       if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
+                          WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES |
+                          WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES |
+                          WIMLIB_INIT_FLAG_STRICT_APPLY_PRIVILEGES |
+                          WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE |
+                          WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE))
+               return WIMLIB_ERR_INVALID_PARAM;
+
        libxml_global_init();
        if (!(init_flags & WIMLIB_INIT_FLAG_ASSUME_UTF8)) {
                wimlib_mbs_is_utf8 = test_locale_ctype_utf8();