WIMLIB_ERR_UNABLE_TO_READ_CAPTURE_CONFIG = 83,
WIMLIB_ERR_WIM_IS_INCOMPLETE = 84,
WIMLIB_ERR_COMPACTION_NOT_POSSIBLE = 85,
+ WIMLIB_ERR_IMAGE_HAS_MULTIPLE_REFERENCES = 86,
};
*
* Export an image, or all images, from a ::WIMStruct into another ::WIMStruct.
*
- * Note: after calling this function, the exported WIM image(s) cannot be
- * independently modified because the image metadata will be shared between the
- * two ::WIMStruct's.
+ * Specifically, if the destination ::WIMStruct contains <tt>n</tt> images, then
+ * the source image(s) will be appended, in order, starting at destination index
+ * <tt>n + 1</tt>. By default, all image metadata will be exported verbatim,
+ * but certain changes can be made by passing appropriate parameters.
*
- * Note: no changes are committed to disk until wimlib_write() or
- * wimlib_overwrite() is called.
+ * wimlib_export_image() is only an in-memory operation; no changes are
+ * committed to disk until wimlib_write() or wimlib_overwrite() is called.
+ *
+ * A limitation of the current implementation of wimlib_export_image() is that
+ * the directory tree of a source or destination image cannot be updated
+ * following an export until one of the two images has been freed from memory.
*
* @param src_wim
* The WIM from which to export the images, specified as a pointer to the
* Another process is currently modifying the WIM file.
* @retval ::WIMLIB_ERR_FUSE
* A non-zero status code was returned by @c fuse_main().
+ * @retval ::WIMLIB_ERR_IMAGE_HAS_MULTIPLE_REFERENCES
+ * There are currently multiple references to the WIM image as a result of
+ * a call to wimlib_export_image(). Free one before attempting the
+ * read-write mount.
* @retval ::WIMLIB_ERR_INVALID_IMAGE
* @p image does not exist in @p wim.
* @retval ::WIMLIB_ERR_INVALID_PARAM
* @retval ::WIMLIB_ERR_FVE_LOCKED_VOLUME
* Windows-only: One of the "add" commands attempted to add files from an
* encrypted BitLocker volume that hasn't yet been unlocked.
+ * @retval ::WIMLIB_ERR_IMAGE_HAS_MULTIPLE_REFERENCES
+ * There are currently multiple references to the WIM image as a result of
+ * a call to wimlib_export_image(). Free one before attempting the update.
* @retval ::WIMLIB_ERR_INVALID_CAPTURE_CONFIG
* The contents of a capture configuration file were invalid.
* @retval ::WIMLIB_ERR_INVALID_IMAGE
int update_flags)
{
int ret;
+ struct wim_image_metadata *imd;
struct wimlib_update_command *cmds_copy;
if (update_flags & ~WIMLIB_UPDATE_FLAG_SEND_PROGRESS)
/* Load the metadata for the image to modify (if not loaded already) */
ret = select_wim_image(wim, image);
if (ret)
- goto out;
+ return ret;
+
+ imd = wim->image_metadata[image - 1];
+
+ /* Don't allow updating an image currently being shared by multiple
+ * WIMStructs (as a result of an export) */
+ if (imd->refcnt > 1)
+ return WIMLIB_ERR_IMAGE_HAS_MULTIPLE_REFERENCES;
/* Make a copy of the update commands, in the process doing certain
* canonicalizations on paths (e.g. translating backslashes to forward
* commands. */
ret = copy_update_commands(cmds, num_cmds, &cmds_copy);
if (ret)
- goto out;
+ return ret;
/* Perform additional checks on the update commands before we execute
* them. */
if (ret)
goto out_free_cmds_copy;
- mark_image_dirty(wim->image_metadata[image - 1]);
+ mark_image_dirty(imd);
/* Statistics about the WIM image, such as the numbers of files and
* directories, may have changed. Call xml_update_image_info() to
wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX;
out_free_cmds_copy:
free_update_commands(cmds_copy, num_cmds);
-out:
return ret;
}