]> wimlib.net Git - wimlib/blobdiff - src/template.c
mount_image.c: add fallback definitions of RENAME_* constants
[wimlib] / src / template.c
index ed1dd19eaa20282e2efec2985e2f815489718b5a..2cface66bbef1240a3c3f12ff40127f0ebb416d3 100644 (file)
@@ -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;
 }