X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Ftemplate.c;h=e5413e5fafa8c607ab50a942b17bdde45c41f847;hb=8fbdced08faf37472fd7174480b446c4b11578fb;hp=1fd6d93d3264cef4d1ce8b3e019abb400010c113;hpb=15ded30b9bcce7ac0388dec90dd4d6ef3d6d1596;p=wimlib diff --git a/src/template.c b/src/template.c index 1fd6d93d..e5413e5f 100644 --- a/src/template.c +++ b/src/template.c @@ -119,48 +119,30 @@ inode_copy_checksums(struct wim_inode *inode, } } -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; } @@ -172,6 +154,7 @@ wimlib_reference_template_image(WIMStruct *wim, int new_image, { int ret; struct wim_image_metadata *new_imd; + struct wim_inode *inode; if (flags != 0) return WIMLIB_ERR_INVALID_PARAM; @@ -189,20 +172,18 @@ wimlib_reference_template_image(WIMStruct *wim, int new_image, 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; }