X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Ftemplate.c;h=1a9a20690b6da7ebc7f1e120325e8b8a9a4c3140;hp=1fd6d93d3264cef4d1ce8b3e019abb400010c113;hb=873a86a1a5097f2a161494341d8d962453a30465;hpb=15ded30b9bcce7ac0388dec90dd4d6ef3d6d1596 diff --git a/src/template.c b/src/template.c index 1fd6d93d..1a9a2069 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; @@ -196,13 +179,11 @@ wimlib_reference_template_image(WIMStruct *wim, int new_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; }