]> wimlib.net Git - wimlib/blobdiff - src/metadata_resource.c
Initial rewrite of resource code
[wimlib] / src / metadata_resource.c
index da3ca5402c976a4f67c434ea6486f3af0ba00cda..9b5a83050abd51a95a6d47ebc791ce63d2c5d5fd 100644 (file)
@@ -3,7 +3,7 @@
  */
 
 /*
- * Copyright (C) 2012 Eric Biggers
+ * Copyright (C) 2012, 2013 Eric Biggers
  *
  * This file is part of wimlib, a library for working with WIM files.
  *
@@ -42,7 +42,8 @@
  *
  * @return:    Zero on success, nonzero on failure.
  */
-int read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd)
+int
+read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd)
 {
        u8 *buf;
        u32 dentry_offset;
@@ -85,8 +86,8 @@ int read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd)
        }
 
        /* Read the metadata resource into memory.  (It may be compressed.) */
-       ret = read_full_wim_resource(metadata_lte, buf, 0);
-       if (ret != 0)
+       ret = read_full_resource_into_buf(metadata_lte, buf, false);
+       if (ret)
                goto out_free_buf;
 
        DEBUG("Finished reading metadata resource into memory.");
@@ -185,7 +186,8 @@ out_free_buf:
        return ret;
 }
 
-static void recalculate_security_data_length(struct wim_security_data *sd)
+static void
+recalculate_security_data_length(struct wim_security_data *sd)
 {
        u32 total_length = sizeof(u64) * sd->num_entries + 2 * sizeof(u32);
        for (u32 i = 0; i < sd->num_entries; i++)
@@ -196,32 +198,30 @@ static void recalculate_security_data_length(struct wim_security_data *sd)
 /* Like write_wim_resource(), but the resource is specified by a buffer of
  * 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 u8 *buf, u64 buf_size,
-                                         FILE *out_fp, int out_ctype,
-                                         struct resource_entry *out_res_entry,
-                                         u8 hash[SHA1_HASH_SIZE])
+static int
+write_wim_resource_from_buffer(const u8 *buf, u64 buf_size,
+                              FILE *out_fp, int out_ctype,
+                              struct resource_entry *out_res_entry,
+                              u8 hash[SHA1_HASH_SIZE])
 {
        /* Set up a temporary lookup table entry to provide to
         * write_wim_resource(). */
        struct wim_lookup_table_entry lte;
        int ret;
-       lte.resource_entry.flags         = 0;
        lte.resource_entry.original_size = buf_size;
-       lte.resource_entry.size          = buf_size;
-       lte.resource_entry.offset        = 0;
        lte.resource_location            = RESOURCE_IN_ATTACHED_BUFFER;
-       lte.attached_buffer              = (u8*)buf;
-
+       lte.attached_buffer              = (void*)buf;
        zero_out_hash(lte.hash);
        ret = write_wim_resource(&lte, out_fp, out_ctype, out_res_entry, 0);
-       if (ret != 0)
+       if (ret)
                return ret;
        copy_hash(hash, lte.hash);
        return 0;
 }
 
 /* Write the metadata resource for the current WIM image. */
-int write_metadata_resource(WIMStruct *w)
+int
+write_metadata_resource(WIMStruct *w)
 {
        u8 *buf;
        u8 *p;
@@ -232,9 +232,13 @@ int write_metadata_resource(WIMStruct *w)
        u64 metadata_original_size;
        struct wim_security_data *sd;
 
+       wimlib_assert(w->out_fp != NULL);
+       wimlib_assert(w->current_image != WIMLIB_NO_IMAGE);
+
        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);
 
@@ -285,27 +289,16 @@ int write_metadata_resource(WIMStruct *w)
                                             wimlib_get_compression_type(w),
                                             &lte->output_resource_entry,
                                             lte->hash);
-       if (ret != 0)
-               goto out;
+       if (ret)
+               goto out_free_buf;
 
-       /* 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);
+       /* 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;
-
-       /* Make sure that the lookup table entry for this metadata resource is
-        * marked with the metadata flag. */
        lte->output_resource_entry.flags |= WIM_RESHDR_FLAG_METADATA;
-out:
+out_free_buf:
        /* All the data has been written to the new WIM; no need for the buffer
         * anymore */
        FREE(buf);