X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Ftemplate.c;h=2cface66bbef1240a3c3f12ff40127f0ebb416d3;hb=e1a95c6cb545af2666414d52d6b5d676e4993a66;hp=ed1dd19eaa20282e2efec2985e2f815489718b5a;hpb=ee547cc83f231d727e4d9984c23e86d96d3da769;p=wimlib diff --git a/src/template.c b/src/template.c index ed1dd19e..2cface66 100644 --- a/src/template.c +++ b/src/template.c @@ -18,7 +18,7 @@ * details. * * You should have received a copy of the GNU Lesser General Public License - * along with this file; if not, see http://www.gnu.org/licenses/. + * along with this file; if not, see https://www.gnu.org/licenses/. */ #ifdef HAVE_CONFIG_H @@ -114,28 +114,19 @@ inode_copy_checksums(struct wim_inode *inode, back_ptr = retrieve_pointer_to_unhashed_blob(blob); copy_hash(blob->hash, template_blob->hash); - if (after_blob_hashed(blob, back_ptr, blob_table) != blob) + if (after_blob_hashed(blob, back_ptr, blob_table, + inode) != blob) free_blob_descriptor(blob); } } -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) @@ -143,24 +134,16 @@ dentry_reference_template(struct wim_dentry *dentry, void *_args) template_dentry = get_dentry(template_wim, dentry->d_full_path, WIMLIB_CASE_SENSITIVE); - if (template_dentry == NULL) { - DEBUG("\"%"TS"\": newly added file", dentry->d_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->d_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->d_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 +155,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 +173,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; }