- u64 subdir_offset;
- struct dentry *root;
- struct lookup_table_entry *lte;
- u64 metadata_original_size;
- struct wim_security_data *sd;
-
- DEBUG("Writing metadata resource for image %d (offset = %"PRIu64")",
- w->current_image, ftello(w->out_fp));
-
- root = wim_root_dentry(w);
- sd = wim_security_data(w);
-
- /* Offset of first child of the root dentry. It's equal to:
- * - The total length of the security data, rounded to the next 8-byte
- * boundary,
- * - plus the total length of the root dentry,
- * - plus 8 bytes for an end-of-directory entry following the root
- * dentry (shouldn't really be needed, but just in case...)
- */
- recalculate_security_data_length(sd);
- subdir_offset = (((u64)sd->total_length + 7) & ~7) +
- dentry_correct_total_length(root) + 8;
-
- /* Calculate the subdirectory offsets for the entire dentry tree. */
- calculate_subdir_offsets(root, &subdir_offset);
-
- /* Total length of the metadata resource (uncompressed) */
- metadata_original_size = subdir_offset;
-
- /* Allocate a buffer to contain the uncompressed metadata resource */
- buf = MALLOC(metadata_original_size);
- if (!buf) {
- ERROR("Failed to allocate %"PRIu64" bytes for "
- "metadata resource", metadata_original_size);
- return WIMLIB_ERR_NOMEM;
- }
-
- /* Write the security data into the resource buffer */
- p = write_security_data(sd, buf);
-
- /* Write the dentry tree into the resource buffer */
- p = write_dentry_tree(root, p);
-
- /* We MUST have exactly filled the buffer; otherwise we calculated its
- * size incorrectly or wrote the data incorrectly. */
- wimlib_assert(p - buf == metadata_original_size);
-
- /* Get the lookup table entry for the metadata resource so we can update
- * it. */
- lte = wim_metadata_lookup_table_entry(w);
-
- /* Write the metadata resource to the output WIM using the proper
- * compression type. The lookup table entry for the metadata resource
- * is updated. */
- ret = write_wim_resource_from_buffer(buf, metadata_original_size,
- w->out_fp,
- wimlib_get_compression_type(w),
- <e->output_resource_entry,
- lte->hash);
- if (ret != 0)
- goto out;
-
- /* It's very likely the SHA1 message digest of the metadata resource
- * changed, so re-insert the lookup table entry into the lookup table.
- *
- * We do not check for other lookup table entries having the same SHA1
- * message digest. It's possible for 2 absolutely identical images to
- * be added, therefore causing 2 identical metadata resources to be in
- * the WIM. However, in this case, it's expected for 2 separate lookup
- * table entries to be created, even though this doesn't make a whole
- * lot of sense since they will share the same SHA1 message digest.
- * */
- lookup_table_unlink(w->lookup_table, lte);
- lookup_table_insert(w->lookup_table, lte);
- lte->out_refcnt = 1;