]> wimlib.net Git - wimlib/blobdiff - src/metadata_resource.c
unix_apply.c, unix_capture.c: Add, fix copyright notices
[wimlib] / src / metadata_resource.c
index 8fdee61fb09c0b80744bb149802fb5517e160bd6..2f7dfeb6e729ce0ae3dd4c0f7a59ca05f9f96e49 100644 (file)
@@ -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
  * 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)
@@ -193,7 +194,7 @@ recalculate_security_data_length(struct wim_security_data *sd)
  * the buffer to @hash.  */
 static int
 write_wim_resource_from_buffer(const void *buf, size_t buf_size,
-                              filedes_t out_fd, int out_ctype,
+                              int out_fd, int out_ctype,
                               struct resource_entry *out_res_entry,
                               u8 hash[SHA1_HASH_SIZE])
 {
@@ -224,16 +225,26 @@ write_metadata_resource(WIMStruct *w)
        struct wim_lookup_table_entry *lte;
        u64 metadata_original_size;
        struct wim_security_data *sd;
+       struct wim_image_metadata *imd;
 
-       wimlib_assert(w->out_fd != INVALID_FILEDES);
+       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, filedes_offset(w->out_fd));
 
+       imd = w->image_metadata[w->current_image - 1];
+
+       root = imd->root_dentry;
+       sd = imd->security_data;
 
-       root = wim_root_dentry(w);
-       sd = wim_security_data(w);
+       if (!root) {
+               /* Empty image; create a dummy root. */
+               ret = new_filler_directory(T(""), &root);
+               if (ret)
+                       return ret;
+               imd->root_dentry = root;
+       }
 
        /* 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