]> wimlib.net Git - wimlib/blobdiff - src/xml.c
capture_common.c: Add missing breaks in switch stmt in do_capture_progress()
[wimlib] / src / xml.c
index 6233462c9ca53bc590549e8c8d3d093d1a49b436..5351c2c29af190abafac32adcab216cfc73777f4 100644 (file)
--- a/src/xml.c
+++ b/src/xml.c
@@ -90,6 +90,9 @@ struct image_info {
        tchar *display_description;
        tchar *flags;
        bool wimboot;
+
+       /* Note: must update clone_image_info() if adding new fields here  */
+
        struct wim_lookup_table *lookup_table; /* temporary field */
 };
 
@@ -1001,6 +1004,8 @@ clone_windows_info(const struct windows_info *old, struct windows_info *new)
 {
        int ret;
 
+       new->arch = old->arch;
+
        ret = dup_strings_from_specs(old, new, windows_info_xml_string_specs,
                                     ARRAY_LEN(windows_info_xml_string_specs));
        if (ret)
@@ -1063,6 +1068,7 @@ clone_image_info(const struct image_info *old, struct image_info *new)
                if (ret)
                        return ret;
        }
+       new->wimboot = old->wimboot;
        return 0;
 }
 
@@ -1178,7 +1184,6 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg)
 {
        struct image_info *info = arg;
        const struct wim_inode *inode = dentry->d_inode;
-       struct wim_lookup_table_entry *lte;
 
        /* Update directory count and file count.
         *
@@ -1189,19 +1194,19 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg)
         * points) count as regular files.  This is despite the fact that
         * junction points have FILE_ATTRIBUTE_DIRECTORY set.
         */
-       if (dentry_is_root(dentry))
-               return 0;
 
-       if (inode_is_directory(inode))
-               info->dir_count++;
-       else
-               info->file_count++;
+       if (!dentry_is_root(dentry)) {
+               if (inode_is_directory(inode))
+                       info->dir_count++;
+               else
+                       info->file_count++;
+       }
 
        /*
         * Update total bytes and hard link bytes.
         *
-        * Unfortunately there are some inconsistencies/bugs in the way this is
-        * done.
+        * We try to act the same as the MS implementation, even though there
+        * are some inconsistencies/bugs in the way it operates.
         *
         * If there are no alternate data streams in the image, the "total
         * bytes" is the sum of the size of the un-named data stream of each
@@ -1223,20 +1228,26 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg)
         * link bytes", and this size is multiplied by the link count (NOT one
         * less than the link count).
         */
-       lte = inode_unnamed_lte(inode, info->lookup_table);
-       if (lte) {
-               info->total_bytes += lte->size;
-               if (!dentry_is_first_in_inode(dentry))
-                       info->hard_link_bytes += lte->size;
-       }
+       if (!(inode->i_attributes & (FILE_ATTRIBUTE_DIRECTORY |
+                                    FILE_ATTRIBUTE_REPARSE_POINT)))
+       {
+               struct wim_lookup_table_entry *lte;
+
+               lte = inode_unnamed_lte(inode, info->lookup_table);
+               if (lte) {
+                       info->total_bytes += lte->size;
+                       if (!dentry_is_first_in_inode(dentry))
+                               info->hard_link_bytes += lte->size;
+               }
 
-       if (inode->i_nlink >= 2 && dentry_is_first_in_inode(dentry)) {
-               for (unsigned i = 0; i < inode->i_num_ads; i++) {
-                       if (inode->i_ads_entries[i].stream_name_nbytes) {
-                               lte = inode_stream_lte(inode, i + 1, info->lookup_table);
-                               if (lte) {
-                                       info->hard_link_bytes += inode->i_nlink *
-                                                                lte->size;
+               if (inode->i_nlink >= 2 && dentry_is_first_in_inode(dentry)) {
+                       for (unsigned i = 0; i < inode->i_num_ads; i++) {
+                               if (inode->i_ads_entries[i].stream_name_nbytes) {
+                                       lte = inode_stream_lte(inode, i + 1, info->lookup_table);
+                                       if (lte) {
+                                               info->hard_link_bytes += inode->i_nlink *
+                                                                        lte->size;
+                                       }
                                }
                        }
                }