]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Honor WIM_HDR_FLAG_READONLY
[wimlib] / src / wim.c
index 2907cd31c42f933b03067f10e61cad86954d0a51..4a8e6a8be828c8a5282a0993ea96daf4a0f8293e 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -366,15 +366,16 @@ wimlib_print_files(WIMStruct *w, int image)
 
 /* Sets the index of the bootable image. */
 WIMLIBAPI int
-wimlib_set_boot_idx(WIMStruct *w, int boot_idx)
+wimlib_set_boot_idx(WIMStruct *wim, int boot_idx)
 {
-       if (w->hdr.total_parts != 1) {
-               ERROR("Cannot modify the boot index of a split WIM!");
-               return WIMLIB_ERR_SPLIT_UNSUPPORTED;
-       }
-       if (boot_idx < 0 || boot_idx > w->hdr.image_count)
+       int ret;
+
+       ret = can_modify_wim(wim);
+       if (ret)
+               return ret;
+       if (boot_idx < 0 || boot_idx > wim->hdr.image_count)
                return WIMLIB_ERR_INVALID_IMAGE;
-       w->hdr.boot_idx = boot_idx;
+       wim->hdr.boot_idx = boot_idx;
        return 0;
 }
 
@@ -671,6 +672,33 @@ wim_checksum_unhashed_streams(WIMStruct *w)
        return 0;
 }
 
+int
+can_modify_wim(WIMStruct *wim)
+{
+       if (wim->hdr.total_parts != 1) {
+               ERROR("Cannot modify \"%"TS"\": is part of a spanned set",
+                     wim->filename);
+               return WIMLIB_ERR_SPLIT_UNSUPPORTED;
+       }
+       if (wim->hdr.flags & WIM_HDR_FLAG_READONLY) {
+               ERROR("Cannot modify \"%"TS"\": is marked read-only",
+                     wim->filename);
+               return WIMLIB_ERR_WIM_IS_MARKED_READONLY;
+       }
+       return 0;
+}
+
+int
+can_delete_from_wim(WIMStruct *wim)
+{
+       int ret;
+
+       ret = can_modify_wim(wim);
+       if (ret == 0 && !wim->all_images_verified)
+               ret = wim_run_full_verifications(wim);
+       return ret;
+}
+
 /* Frees the memory for the WIMStruct, including all internal memory; also
  * closes all files associated with the WIMStruct.  */
 WIMLIBAPI void