]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Honor WIM_HDR_FLAG_READONLY
[wimlib] / src / wim.c
index fd197140e16049212d430fce6208ecdb407f01b8..4a8e6a8be828c8a5282a0993ea96daf4a0f8293e 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -5,8 +5,6 @@
 /*
  * Copyright (C) 2012, 2013 Eric Biggers
  *
- * wimlib - Library for working with WIM files
- *
  * This file is part of wimlib, a library for working with WIM files.
  *
  * wimlib is free software; you can redistribute it and/or modify it under the
@@ -59,7 +57,7 @@ static int
 image_print_metadata(WIMStruct *w)
 {
        DEBUG("Printing metadata for image %d", w->current_image);
-       print_security_data(wim_security_data(w));
+       print_wim_security_data(wim_security_data(w));
        return for_dentry_in_tree(wim_root_dentry(w), print_dentry,
                                  w->lookup_table);
 }
@@ -368,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;
 }
 
@@ -557,7 +556,7 @@ destroy_image_metadata(struct wim_image_metadata *imd,
 {
        free_dentry_tree(imd->root_dentry, table);
        imd->root_dentry = NULL;
-       free_security_data(imd->security_data);
+       free_wim_security_data(imd->security_data);
        imd->security_data = NULL;
 
        if (free_metadata_lte) {
@@ -673,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