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);
if (wim_target_path[0] == T('\0'))
params.add_flags |= WIMLIB_ADD_FLAG_ROOT;
ret = (*capture_tree)(&branch, fs_source_path, ¶ms);
- if (ret) {
- ERROR("Failed to build dentry tree for \"%"TS"\"",
- fs_source_path);
+ if (ret)
goto out_destroy_sd_set;
- }
+
if (branch) {
/* Use the target name, not the source name, for
* the root of each branch from a capture
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;
return ret;
}
+
+tchar *winpats[] = {
+ T("/$ntfs.log"),
+ T("/hiberfil.sys"),
+ T("/pagefile.sys"),
+ T("/System Volume Information"),
+ T("/RECYCLER"),
+ T("/Windows/CSC"),
+};
+
+static const struct wimlib_capture_config winconfig = {
+ .exclusion_pats = {
+ .num_pats = ARRAY_LEN(winpats),
+ .pats = winpats,
+ },
+};
+
static int
check_add_command(struct wimlib_update_command *cmd,
const struct wim_header *hdr)
{
int ret;
struct wimlib_update_command *cmds_copy;
+ const struct wimlib_capture_config *config;
cmds_copy = CALLOC(num_cmds, sizeof(cmds[0]));
if (!cmds_copy)
if (!cmds_copy[i].add.fs_source_path ||
!cmds_copy[i].add.wim_target_path)
goto oom;
- if (cmds[i].add.config) {
- ret = copy_and_canonicalize_capture_config(cmds[i].add.config,
+ config = cmds[i].add.config;
+ if (cmds[i].add.add_flags & WIMLIB_ADD_FLAG_WINCONFIG)
+ config = &winconfig;
+ if (config) {
+ ret = copy_and_canonicalize_capture_config(config,
&cmds_copy[i].add.config);
if (ret)
goto err;
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,