X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxml.c;h=5351c2c29af190abafac32adcab216cfc73777f4;hb=9d25885329baa8e2e89a75687a584ec40fb3a976;hp=6233462c9ca53bc590549e8c8d3d093d1a49b436;hpb=a10684cffdec166b85f85e09c8567f48e73876ac;p=wimlib diff --git a/src/xml.c b/src/xml.c index 6233462c..5351c2c2 100644 --- 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; + } } } }