]> wimlib.net Git - wimlib/blobdiff - src/metadata_resource.c
security.c: Rewrite some code
[wimlib] / src / metadata_resource.c
index 3e8b7283e17f3267fb5d660df3db0412e41c9150..da0be2885b47ae159577fd353bcf2494a6f0eb9e 100644 (file)
  * wimlib; if not, see http://www.gnu.org/licenses/.
  */
 
-#include "wimlib_internal.h"
-#include "dentry.h"
-#include "lookup_table.h"
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "wimlib/dentry.h"
+#include "wimlib/error.h"
+#include "wimlib/file_io.h"
+#include "wimlib/lookup_table.h"
+#include "wimlib/metadata.h"
+#include "wimlib/resource.h"
+#include "wimlib/security.h"
 
 /*
  * Reads a metadata resource for an image in the WIM file.  The metadata
@@ -106,7 +114,7 @@ read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd)
         * resource of the root dentry. */
 
        wimlib_assert(imd->security_data == NULL);
-       ret = read_security_data(buf, metadata_len, &imd->security_data);
+       ret = read_wim_security_data(buf, metadata_len, &imd->security_data);
        if (ret)
                goto out_free_buf;
 
@@ -173,7 +181,7 @@ read_metadata_resource(WIMStruct *w, struct wim_image_metadata *imd)
 out_free_dentry_tree:
        free_dentry_tree(dentry, NULL);
 out_free_security_data:
-       free_security_data(imd->security_data);
+       free_wim_security_data(imd->security_data);
        imd->security_data = NULL;
 out_free_buf:
        FREE(buf);
@@ -186,7 +194,7 @@ 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++)
                total_length += sd->sizes[i];
-       sd->total_length = total_length;
+       sd->total_length = (total_length + 7) & ~7;
 }
 
 /* Like write_wim_resource(), but the resource is specified by a buffer of
@@ -225,6 +233,7 @@ 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 != -1);
        wimlib_assert(w->current_image != WIMLIB_NO_IMAGE);
@@ -232,9 +241,18 @@ write_metadata_resource(WIMStruct *w)
        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 = wim_root_dentry(w);
-       sd = wim_security_data(w);
+       root = imd->root_dentry;
+       sd = imd->security_data;
+
+       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
@@ -262,7 +280,7 @@ write_metadata_resource(WIMStruct *w)
        }
 
        /* Write the security data into the resource buffer */
-       p = write_security_data(sd, buf);
+       p = write_wim_security_data(sd, buf);
 
        /* Write the dentry tree into the resource buffer */
        p = write_dentry_tree(root, p);