}
}
-struct reference_template_args {
- WIMStruct *wim;
- WIMStruct *template_wim;
-};
-
static int
-dentry_reference_template(struct wim_dentry *dentry, void *_args)
+reference_template_file(struct wim_inode *inode, WIMStruct *wim,
+ WIMStruct *template_wim)
{
- int ret;
+ struct wim_dentry *dentry = inode_any_dentry(inode);
struct wim_dentry *template_dentry;
- struct wim_inode *inode, *template_inode;
- struct reference_template_args *args = _args;
- WIMStruct *wim = args->wim;
- WIMStruct *template_wim = args->template_wim;
-
- if (dentry->d_inode->i_visited)
- return 0;
+ int ret;
ret = calculate_dentry_full_path(dentry);
if (ret)
return ret;
- template_dentry = get_dentry(template_wim, dentry->_full_path,
+ template_dentry = get_dentry(template_wim, dentry->d_full_path,
WIMLIB_CASE_SENSITIVE);
- if (template_dentry == NULL) {
- DEBUG("\"%"TS"\": newly added file", dentry->_full_path);
- return 0;
- }
-
- inode = dentry->d_inode;
- template_inode = template_dentry->d_inode;
-
- if (inode_metadata_consistent(inode, template_inode, wim->blob_table,
- template_wim->blob_table))
+ if (template_dentry != NULL &&
+ inode_metadata_consistent(inode, template_dentry->d_inode,
+ wim->blob_table, template_wim->blob_table))
{
- DEBUG("\"%"TS"\": No change detected", dentry->_full_path);
- inode_copy_checksums(inode, template_inode, wim->blob_table,
- template_wim->blob_table);
- inode->i_visited = 1;
- } else {
- DEBUG("\"%"TS"\": change detected!", dentry->_full_path);
+ inode_copy_checksums(inode, template_dentry->d_inode,
+ wim->blob_table, template_wim->blob_table);
}
+
+ FREE(dentry->d_full_path);
+ dentry->d_full_path = NULL;
return 0;
}
{
int ret;
struct wim_image_metadata *new_imd;
+ struct wim_inode *inode;
if (flags != 0)
return WIMLIB_ERR_INVALID_PARAM;
return WIMLIB_ERR_METADATA_NOT_FOUND;
new_imd = wim->image_metadata[new_image - 1];
- if (!new_imd->modified)
+ if (!is_image_dirty(new_imd))
return WIMLIB_ERR_INVALID_PARAM;
ret = select_wim_image(template_wim, template_image);
if (ret)
return ret;
- struct reference_template_args args = {
- .wim = wim,
- .template_wim = template_wim,
- };
+ image_for_each_inode(inode, new_imd) {
+ ret = reference_template_file(inode, wim, template_wim);
+ if (ret)
+ return ret;
+ }
- ret = for_dentry_in_tree(new_imd->root_dentry,
- dentry_reference_template, &args);
- dentry_tree_clear_inode_visited(new_imd->root_dentry);
- return ret;
+ return 0;
}