]> wimlib.net Git - wimlib/blobdiff - src/resource.c
Various fixes
[wimlib] / src / resource.c
index 731bd1c0c3ebb258cbd8462b33ae1aaf5456ab79..3797f62f841dac828c479892abe69d7bb00db6e9 100644 (file)
@@ -991,16 +991,20 @@ 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");
+       /* Build hash table that maps hard link group IDs to dentry sets */
        lgt = new_link_group_table(9001);
        if (!lgt)
                goto out_free_dentry_tree;
@@ -1008,6 +1012,12 @@ int read_metadata_resource(FILE *fp, int wim_ctype, struct image_metadata *imd)
        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;
@@ -1015,7 +1025,7 @@ int read_metadata_resource(FILE *fp, int wim_ctype, struct image_metadata *imd)
 out_free_lgt:
        free_link_group_table(lgt);
 out_free_dentry_tree:
-       free_dentry_tree(dentry, NULL, false);
+       free_dentry_tree(dentry, NULL);
 out_free_security_data:
        free_security_data(sd);
 out_free_buf:
@@ -1033,12 +1043,11 @@ int write_metadata_resource(WIMStruct *w)
        u64 subdir_offset;
        struct dentry *root;
        struct lookup_table_entry *lte;
-       struct resource_entry *res_entry;
        off_t metadata_offset;
        u64 metadata_original_size;
        u64 metadata_compressed_size;
        int metadata_ctype;
-       u8  hash[WIM_HASH_SIZE];
+       u8  hash[SHA1_HASH_SIZE];
 
        DEBUG("Writing metadata resource for image %d", w->current_image);
 
@@ -1082,31 +1091,29 @@ 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);
-       res_entry = &lte->output_resource_entry;
        lte->out_refcnt++;
-       if (memcmp(hash, lte->hash, WIM_HASH_SIZE) != 0) {
+       if (!hashes_equal(hash, lte->hash)) {
                lookup_table_unlink(w->lookup_table, lte);
-               memcpy(lte->hash, hash, WIM_HASH_SIZE);
+               copy_hash(lte->hash, hash);
                lookup_table_insert(w->lookup_table, lte);
        }
-       res_entry->original_size = metadata_original_size;
-       res_entry->offset        = metadata_offset;
-       res_entry->size          = metadata_compressed_size;
-       res_entry->flags         = WIM_RESHDR_FLAG_METADATA;
+       lte->output_resource_entry.original_size = metadata_original_size;
+       lte->output_resource_entry.offset        = metadata_offset;
+       lte->output_resource_entry.size          = metadata_compressed_size;
+       lte->output_resource_entry.flags         = WIM_RESHDR_FLAG_METADATA;
        if (metadata_ctype != WIM_COMPRESSION_TYPE_NONE)
-               res_entry->flags |= WIM_RESHDR_FLAG_COMPRESSED;
+               lte->output_resource_entry.flags |= WIM_RESHDR_FLAG_COMPRESSED;
        return 0;
 }
 
-static int write_file_resource(WIMStruct *w, const u8 hash[])
+static int write_file_resource(WIMStruct *w, struct lookup_table_entry *lte)
 {
-       /* Get the lookup entry for the file resource. */
-       struct lookup_table_entry *lte;
-       
-       lte = __lookup_resource(w->lookup_table, hash);
        if (!lte)
                return 0;
 
@@ -1200,12 +1207,13 @@ static int write_file_resource(WIMStruct *w, const u8 hash[])
 }
 
 /* 
- * Writes a dentry's resources to the output file. 
+ * Writes a dentry's resources, including the main file resource as well as all
+ * alternate data streams, to the output file. 
  *
- * @dentry:  The dentry for the file resource.
+ * @dentry:  The dentry for the file.
  * @wim_p:   A pointer to the WIMStruct.  The fields of interest to this
  *          function are the input and output file streams and the lookup
- *          table, and the alternate data streams.
+ *          table.
  *
  * @return zero on success, nonzero on failure. 
  */
@@ -1213,16 +1221,11 @@ int write_dentry_resources(struct dentry *dentry, void *wim_p)
 {
        WIMStruct *w = wim_p;
        int ret;
+       struct lookup_table_entry *lte;
 
-       /* Directories don't need file resources. */
-       if (dentry_is_directory(dentry))
-               return 0;
-
-       ret = write_file_resource(w, dentry->hash);
-       if (ret != 0)
-               return ret;
-       for (u16 i = 0; i < dentry->num_ads; i++) {
-               ret = write_file_resource(w, dentry->ads_entries[i].hash);
+       for (unsigned i = 0; i <= dentry->num_ads; i++) {
+               lte = dentry_stream_lte(dentry, i, w->lookup_table);
+               ret = write_file_resource(w, lte);
                if (ret != 0)
                        return ret;
        }