]> wimlib.net Git - wimlib/blobdiff - src/resource.c
wimfs_write(), dentry_to_stbuf()
[wimlib] / src / resource.c
index 03754e08d41877e06f82c8213ebdb45800678456..48f54804576a3d68fdb25d308fe4d8d26dc61e01 100644 (file)
@@ -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;