+wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int which)
+{
+ 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;
+ else
+ wim->hdr.flags &= ~WIM_HDR_FLAG_READONLY;
+ }
+
+ if ((which & ~WIMLIB_CHANGE_READONLY_FLAG) == 0)
+ return 0;
+
+ ret = can_modify_wim(wim);
+ if (ret)
+ return ret;
+
+ if (which & WIMLIB_CHANGE_GUID) {
+ memcpy(wim->hdr.guid, info->guid, WIM_GID_LEN);
+ wim->guid_set_explicitly = 1;
+ }
+
+ if (which & WIMLIB_CHANGE_BOOT_INDEX) {
+ if (info->boot_index > wim->hdr.image_count) {
+ ERROR("%u is not 0 or a valid image in the WIM to mark as bootable",
+ info->boot_index);
+ return WIMLIB_ERR_INVALID_IMAGE;
+ }
+ wim->hdr.boot_idx = info->boot_index;
+ }
+
+ if (which & WIMLIB_CHANGE_RPFIX_FLAG) {
+ if (info->has_rpfix)
+ wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX;
+ else
+ wim->hdr.flags &= ~WIM_HDR_FLAG_RP_FIX;
+ }
+ return 0;
+}
+
+static int
+set_out_ctype(int ctype, u8 *out_ctype_p)