#include "wimlib/metadata.h"
#include "wimlib/paths.h"
#include "wimlib/progress.h"
-#include "wimlib/xml.h"
/* Saved specification of a "primitive" update operation that was performed. */
struct update_primitive {
if (ret)
goto out_free_branch;
- BUILD_BUG_ON(WIM_PATH_SEPARATOR != OS_PREFERRED_PATH_SEPARATOR);
+ STATIC_ASSERT(WIM_PATH_SEPARATOR == OS_PREFERRED_PATH_SEPARATOR);
ret = dentry_set_name(branch, path_basename(target_tstr));
if (ret)
goto out_free_target;
wim_target_path = add_cmd->add.wim_target_path;
config_file = add_cmd->add.config_file;
- DEBUG("fs_source_path=\"%"TS"\", wim_target_path=\"%"TS"\", add_flags=%#x",
- fs_source_path, wim_target_path, add_flags);
-
memset(¶ms, 0, sizeof(params));
#ifdef WITH_NTFS_3G
flags = delete_cmd->delete_.delete_flags;
wim_path = delete_cmd->delete_.wim_path;
- DEBUG("Deleting WIM path \"%"TS"\" (flags=%#x)", wim_path, flags);
-
tree = get_dentry(wim, wim_path, WIMLIB_CASE_PLATFORM_DEFAULT);
if (!tree) {
/* Path to delete does not exist in the WIM. */
return ret;
}
-static inline const tchar *
-update_op_to_str(int op)
-{
- switch (op) {
- case WIMLIB_UPDATE_OP_ADD:
- return T("add");
- case WIMLIB_UPDATE_OP_DELETE:
- return T("delete");
- case WIMLIB_UPDATE_OP_RENAME:
- return T("rename");
- default:
- wimlib_assert(0);
- return NULL;
- }
-}
-
static bool
have_command_type(const struct wimlib_update_command *cmds, size_t num_cmds,
enum wimlib_update_op op)
info.update.total_commands = num_cmds;
ret = 0;
for (size_t i = 0; i < num_cmds; i++) {
- DEBUG("Executing update command %zu of %zu (op=%"TS")",
- i + 1, num_cmds, update_op_to_str(cmds[i].op));
info.update.command = &cmds[i];
if (update_flags & WIMLIB_UPDATE_FLAG_SEND_PROGRESS) {
ret = call_progress(wim->progfunc,
int update_flags)
{
int ret;
+ struct wim_image_metadata *imd;
struct wimlib_update_command *cmds_copy;
if (update_flags & ~WIMLIB_UPDATE_FLAG_SEND_PROGRESS)
return WIMLIB_ERR_INVALID_PARAM;
- DEBUG("Updating image %d with %zu commands", image, num_cmds);
-
/* 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];
- DEBUG("Preparing %zu update commands", num_cmds);
+ /* 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. */
goto out_free_cmds_copy;
/* Actually execute the update commands. */
- DEBUG("Executing %zu update commands", num_cmds);
ret = execute_update_commands(wim, cmds_copy, num_cmds, update_flags);
if (ret)
goto out_free_cmds_copy;
- wim->image_metadata[image - 1]->modified = 1;
-
- /* Statistics about the WIM image, such as the numbers of files and
- * directories, may have changed. Call xml_update_image_info() to
- * recalculate these statistics. */
- xml_update_image_info(wim, image);
+ mark_image_dirty(imd);
for (size_t i = 0; i < num_cmds; i++)
if (cmds_copy[i].op == WIMLIB_UPDATE_OP_ADD &&
wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX;
out_free_cmds_copy:
free_update_commands(cmds_copy, num_cmds);
-out:
return ret;
}