-
- /* Determine the compression type of the metadata resource. */
-
- /* Read the metadata resource into memory. (It may be compressed.) */
- ret = read_full_wim_resource(metadata_lte, buf);
- if (ret != 0)
- goto out_free_buf;
-
- DEBUG("Finished reading metadata resource into memory.");
-
- /* The root directory entry starts after security data, on an 8-byte
- * aligned address.
- *
- * The security data starts with a 4-byte integer giving its total
- * length. */
-
- /* Read the security data into a wim_security_data structure. */
- ret = read_security_data(buf, res_entry->original_size, &sd);
- if (ret != 0)
- goto out_free_buf;
-
- dentry = MALLOC(sizeof(struct dentry));
- if (!dentry) {
- ERROR("Failed to allocate %zu bytes for root dentry",
- sizeof(struct dentry));
- ret = WIMLIB_ERR_NOMEM;
- goto out_free_security_data;
- }
-
- get_u32(buf, &dentry_offset);
- if (dentry_offset == 0)
- dentry_offset = 8;
- dentry_offset = (dentry_offset + 7) & ~7;
-
- ret = read_dentry(buf, res_entry->original_size, dentry_offset, dentry);
- /* This is the root dentry, so set its pointers correctly. */
- dentry->parent = dentry;
- dentry->next = dentry;
- dentry->prev = dentry;
- 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;
- 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;
- goto out_free_buf;
-out_free_lgt:
- free_link_group_table(lgt);
-out_free_dentry_tree:
- free_dentry_tree(dentry, NULL);
-out_free_security_data:
- free_security_data(sd);
-out_free_buf:
- FREE(buf);