X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fresource.c;h=48f54804576a3d68fdb25d308fe4d8d26dc61e01;hb=0bf41495dd9e04585be10794d7745a5baa7165a5;hp=03754e08d41877e06f82c8213ebdb45800678456;hpb=815ad485b8ce48db48a3137d73e511f6c9af868c;p=wimlib diff --git a/src/resource.c b/src/resource.c index 03754e08..48f54804 100644 --- a/src/resource.c +++ b/src/resource.c @@ -925,6 +925,7 @@ int read_metadata_resource(FILE *fp, int wim_ctype, struct image_metadata *imd) const struct resource_entry *res_entry; struct dentry *dentry; struct wim_security_data *sd; + struct link_group_table *lgt; res_entry = &imd->metadata_lte->resource_entry; @@ -990,23 +991,42 @@ int read_metadata_resource(FILE *fp, int wim_ctype, struct image_metadata *imd) if (ret != 0) goto out_free_dentry_tree; + DEBUG("Reading dentry tree"); /* Now read the entire directory entry tree. */ ret = read_dentry_tree(buf, res_entry->original_size, dentry); if (ret != 0) goto out_free_dentry_tree; + DEBUG("Calculating dentry full paths"); /* Calculate the full paths in the dentry tree. */ ret = for_dentry_in_tree(dentry, calculate_dentry_full_path, NULL); if (ret != 0) goto out_free_dentry_tree; + DEBUG("Building link group table"); + lgt = new_link_group_table(9001); + if (!lgt) + goto out_free_dentry_tree; + ret = for_dentry_in_tree(dentry, link_group_table_insert, lgt); + if (ret != 0) + goto out_free_lgt; + + DEBUG("Freeing duplicate ADS entries in link group table"); + ret = link_groups_free_duplicate_data(lgt); + if (ret != 0) + goto out_free_lgt; + DEBUG("Done reading image metadata"); + + imd->lgt = lgt; imd->security_data = sd; - imd->root_dentry = dentry; + imd->root_dentry = dentry; goto out_free_buf; -out_free_security_data: - free_security_data(sd); +out_free_lgt: + free_link_group_table(lgt); out_free_dentry_tree: free_dentry_tree(dentry, NULL, false); +out_free_security_data: + free_security_data(sd); out_free_buf: FREE(buf); return ret; @@ -1071,6 +1091,9 @@ int write_metadata_resource(WIMStruct *w) if (ret != 0) return ret; + DEBUG("Updating metadata lookup table entry (size %zu)", + metadata_original_size); + /* Update the lookup table entry, including the hash and output resource * entry fields, for this image's metadata resource. */ lte = wim_metadata_lookup_table_entry(w); @@ -1095,12 +1118,11 @@ static int write_file_resource(WIMStruct *w, const u8 hash[]) /* Get the lookup entry for the file resource. */ struct lookup_table_entry *lte; - lte = lookup_resource(w->lookup_table, hash); + lte = __lookup_resource(w->lookup_table, hash); if (!lte) return 0; - /* No need to write file resources twice. (This indicates file - * resources that are part of a hard link set.) */ + /* No need to write file resources twice. */ if (++lte->out_refcnt != 1) return 0; @@ -1133,8 +1155,8 @@ static int write_file_resource(WIMStruct *w, const u8 hash[]) len = lte->resource_entry.original_size; - recompress_resource(in_fp, lte->symlink_buf, len, len, 0, - 0, out_fp, out_wim_ctype, &new_size); + ret = recompress_resource(NULL, lte->symlink_buf, len, len, 0, + 0, out_fp, out_wim_ctype, &new_size); output_res_entry->size = new_size; output_res_entry->original_size = len; output_res_entry->offset = offset;