X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=inline;f=src%2Fmetadata_resource.c;h=3e8b7283e17f3267fb5d660df3db0412e41c9150;hb=4f8059f2d0a74a9922128b162d9c9343b305999c;hp=91b1121f92ef7efc7b346e68ae3e5d4cd7c656c6;hpb=062465170ddb4520ca6fbc64a0f6e27e786de101;p=wimlib diff --git a/src/metadata_resource.c b/src/metadata_resource.c index 91b1121f..3e8b7283 100644 --- a/src/metadata_resource.c +++ b/src/metadata_resource.c @@ -25,7 +25,7 @@ #include "lookup_table.h" /* - * Reads the metadata metadata resource from the WIM file. The metadata + * Reads a metadata resource for an image in the WIM file. The metadata * resource consists of the security data, followed by the directory entry for * the root directory, followed by all the other directory entries in the * filesystem. The subdir_offset field of each directory entry gives the start @@ -33,14 +33,15 @@ * end-of-directory is signaled by a directory entry of length '0', really of * length 8, because that's how long the 'length' field is. * - * @fp: The FILE* for the input WIM file. - * @wim_ctype: The compression type of the WIM file. - * @imd: Pointer to the image metadata structure. Its `metadata_lte' - * member specifies the lookup table entry for the metadata - * resource. The rest of the image metadata entry will be filled - * in by this function. + * @w: Pointer to the WIMStruct for the WIM file. * - * @return: Zero on success, nonzero on failure. + * @imd: Pointer to the image metadata structure for the image whose + * metadata resource we are reading. Its `metadata_lte' member + * specifies the lookup table entry for the metadata resource. The + * rest of the image metadata entry will be filled in by this + * function. + * + * Returns: Zero on success, nonzero on failure. */ int read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd) @@ -55,8 +56,10 @@ read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd) metadata_lte = imd->metadata_lte; metadata_len = wim_resource_size(metadata_lte); - DEBUG("Reading metadata resource: length = %"PRIu64", " - "offset = %"PRIu64"", metadata_len, + DEBUG("Reading metadata resource: original_size = %"PRIu64", " + "size = %"PRIu64", offset = %"PRIu64"", + metadata_lte->resource_entry.original_size, + metadata_lte->resource_entry.size, metadata_lte->resource_entry.offset); /* There is no way the metadata resource could possibly be less than (8 @@ -85,7 +88,7 @@ read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd) } /* Read the metadata resource into memory. (It may be compressed.) */ - ret = read_full_resource_into_buf(metadata_lte, buf, false); + ret = read_full_resource_into_buf(metadata_lte, buf); if (ret) goto out_free_buf; @@ -190,8 +193,8 @@ recalculate_security_data_length(struct wim_security_data *sd) * uncompressed data rather a lookup table entry; also writes the SHA1 hash of * the buffer to @hash. */ static int -write_wim_resource_from_buffer(const void *buf, u64 buf_size, - FILE *out_fp, int out_ctype, +write_wim_resource_from_buffer(const void *buf, size_t buf_size, + int out_fd, int out_ctype, struct resource_entry *out_res_entry, u8 hash[SHA1_HASH_SIZE]) { @@ -204,7 +207,7 @@ write_wim_resource_from_buffer(const void *buf, u64 buf_size, lte.resource_entry.original_size = buf_size; lte.resource_entry.flags = 0; lte.unhashed = 1; - ret = write_wim_resource(<e, out_fp, out_ctype, out_res_entry, 0); + ret = write_wim_resource(<e, out_fd, out_ctype, out_res_entry, 0); if (ret == 0) copy_hash(hash, lte.hash); return ret; @@ -223,11 +226,11 @@ write_metadata_resource(WIMStruct *w) u64 metadata_original_size; struct wim_security_data *sd; - wimlib_assert(w->out_fp != NULL); + wimlib_assert(w->out_fd != -1); wimlib_assert(w->current_image != WIMLIB_NO_IMAGE); DEBUG("Writing metadata resource for image %d (offset = %"PRIu64")", - w->current_image, ftello(w->out_fp)); + w->current_image, filedes_offset(w->out_fd)); root = wim_root_dentry(w); @@ -276,20 +279,15 @@ write_metadata_resource(WIMStruct *w) * 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, + w->out_fd, wimlib_get_compression_type(w), <e->output_resource_entry, lte->hash); - if (ret) - goto out_free_buf; - /* Note that although the SHA1 message digest of the metadata resource * is very likely to have changed, the corresponding lookup table entry * is not actually located in the hash table, so it need not be * re-inserted in the hash table. */ - lte->out_refcnt = 1; - lte->output_resource_entry.flags |= WIM_RESHDR_FLAG_METADATA; -out_free_buf: + /* All the data has been written to the new WIM; no need for the buffer * anymore */ FREE(buf);