int (*capture_tree)(struct wim_dentry **,
const tchar *,
struct add_image_params *);
- union wimlib_progress_info progress;
struct wimlib_capture_config *config;
#ifdef WITH_NTFS_3G
struct _ntfs_volume *ntfs_vol = NULL;
bool rollback_sd = true;
wimlib_assert(add_cmd->op == WIMLIB_UPDATE_OP_ADD);
+
add_flags = add_cmd->add.add_flags;
fs_source_path = add_cmd->add.fs_source_path;
wim_target_path = add_cmd->add.wim_target_path;
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));
+
imd = wim->image_metadata[wim->current_image - 1];
if (add_flags & WIMLIB_ADD_FLAG_NTFS) {
extra_arg = NULL;
}
+
ret = init_inode_table(¶ms.inode_table, 9001);
if (ret)
goto out;
params.lookup_table = wim->lookup_table;
params.config = config;
params.add_flags = add_flags;
- params.progress_func = progress_func;
params.extra_arg = extra_arg;
- if (progress_func) {
- memset(&progress, 0, sizeof(progress));
- progress.scan.source = fs_source_path;
- progress.scan.wim_target_path = wim_target_path;
- progress_func(WIMLIB_PROGRESS_MSG_SCAN_BEGIN, &progress);
- }
+ params.progress_func = progress_func;
+ params.progress.scan.source = fs_source_path;
+ params.progress.scan.wim_target_path = wim_target_path;
+ if (progress_func)
+ progress_func(WIMLIB_PROGRESS_MSG_SCAN_BEGIN, ¶ms.progress);
if (config) {
config->_prefix = fs_source_path;
config->_prefix_num_tchars = tstrlen(fs_source_path);
goto out_ntfs_umount;
}
if (progress_func)
- progress_func(WIMLIB_PROGRESS_MSG_SCAN_END, &progress);
+ progress_func(WIMLIB_PROGRESS_MSG_SCAN_END, ¶ms.progress);
list_splice_tail(&unhashed_streams, &imd->unhashed_streams);
#ifdef WITH_NTFS_3G
imd->ntfs_vol = ntfs_vol;
goto out;
}
-/*
- * Entry point for making a series of updates to a WIM image.
- */
+/* API function documented in wimlib.h */
WIMLIBAPI int
wimlib_update_image(WIMStruct *wim,
int image,
{
int ret;
struct wimlib_update_command *cmds_copy;
+ bool deletion_requested = false;
DEBUG("Updating image %d with %zu commands", image, num_cmds);
- /* Refuse to update a split WIM. */
- if (wim->hdr.total_parts != 1) {
- ERROR("Cannot update a split WIM!");
- ret = WIMLIB_ERR_SPLIT_UNSUPPORTED;
+ for (size_t i = 0; i < num_cmds; i++)
+ if (cmds[i].op == WIMLIB_UPDATE_OP_DELETE)
+ deletion_requested = true;
+
+ if (deletion_requested)
+ ret = can_delete_from_wim(wim);
+ else
+ ret = can_modify_wim(wim);
+
+ if (ret)
goto out;
- }
/* Load the metadata for the image to modify (if not loaded already) */
ret = select_wim_image(wim, image);