+ if (!wim_has_metadata(wim))
+ return 0;
+ for (int i = 0; i < wim->hdr.image_count; i++) {
+ struct wim_lookup_table_entry *lte, *tmp;
+ struct wim_image_metadata *imd = wim->image_metadata[i];
+ image_for_each_unhashed_stream_safe(lte, tmp, imd) {
+ struct wim_lookup_table_entry *new_lte;
+ ret = hash_unhashed_stream(lte, wim->lookup_table, &new_lte);
+ if (ret)
+ return ret;
+ if (new_lte != lte)
+ free_lookup_table_entry(lte);
+ }
+ }
+ return 0;
+}
+
+/*
+ * can_modify_wim - Check if a given WIM is writeable. This is only the case if
+ * it meets the following three conditions:
+ *
+ * 1. Write access is allowed to the underlying file (if any) at the filesystem level.
+ * 2. The WIM is not part of a spanned set.
+ * 3. The WIM_HDR_FLAG_READONLY flag is not set in the WIM header.
+ *
+ * Return value is 0 if writable; WIMLIB_ERR_WIM_IS_READONLY otherwise.
+ */
+int
+can_modify_wim(WIMStruct *wim)
+{
+ if (wim->filename) {
+ if (taccess(wim->filename, W_OK)) {
+ ERROR_WITH_ERRNO("Can't modify \"%"TS"\"", wim->filename);
+ return WIMLIB_ERR_WIM_IS_READONLY;
+ }
+ }
+ if (wim->hdr.total_parts != 1) {
+ ERROR("Cannot modify \"%"TS"\": is part of a split WIM",
+ wim->filename);
+ return WIMLIB_ERR_WIM_IS_READONLY;
+ }
+ if (wim->hdr.flags & WIM_HDR_FLAG_READONLY) {
+ ERROR("Cannot modify \"%"TS"\": is marked read-only",
+ wim->filename);
+ return WIMLIB_ERR_WIM_IS_READONLY;