]> wimlib.net Git - wimlib/blobdiff - src/wimlib_internal.h
write.c, lookup table.c: cleanup
[wimlib] / src / wimlib_internal.h
index 61a70f1c354db7b77f50faa93f244636c5634a32..0442aaaca4b78ca20ae332f2eca268ca7a326225 100644 (file)
@@ -234,17 +234,17 @@ struct wim_security_data {
 
        /* Array of descriptors. */
        u8 **descriptors;
 
        /* Array of descriptors. */
        u8 **descriptors;
-
-       /* Keep track of how many WIMs reference this security data (used when
-        * exporting images between WIMs) */
-       u32 refcnt;
 };
 
 /* Metadata for a WIM image */
 struct wim_image_metadata {
 
 };
 
 /* Metadata for a WIM image */
 struct wim_image_metadata {
 
+       /* Number of WIMStruct's that are sharing this image metadata (from
+        * calls to wimlib_export_image().) */
+       unsigned long refcnt;
+
        /* Pointer to the root dentry of the image. */
        /* Pointer to the root dentry of the image. */
-       struct wim_dentry    *root_dentry;
+       struct wim_dentry *root_dentry;
 
        /* Pointer to the security data of the image. */
        struct wim_security_data *security_data;
 
        /* Pointer to the security data of the image. */
        struct wim_security_data *security_data;
@@ -253,9 +253,14 @@ struct wim_image_metadata {
         */
        struct wim_lookup_table_entry *metadata_lte;
 
         */
        struct wim_lookup_table_entry *metadata_lte;
 
-       /* Linked list of inodes of this image */
-       struct hlist_head inode_list;
+       /* Linked list of 'struct wim_inode's for this image. */
+       struct list_head inode_list;
 
 
+       /* Linked list of 'struct wim_lookup_table_entry's for this image that
+        * are referred to in the dentry tree, but have not had a SHA1 message
+        * digest calculated yet and therefore have not been inserted into the
+        * WIM's lookup table.  This list is added to during wimlib_add_image()
+        * and wimlib_mount_image() (read-write only). */
        struct list_head unhashed_streams;
 
        /* 1 iff the dentry tree has been modified.  If this is the case, the
        struct list_head unhashed_streams;
 
        /* 1 iff the dentry tree has been modified.  If this is the case, the
@@ -265,6 +270,10 @@ struct wim_image_metadata {
 
        /* 1 iff this image has been mounted read-write */
        u8 has_been_mounted_rw : 1;
 
        /* 1 iff this image has been mounted read-write */
        u8 has_been_mounted_rw : 1;
+
+#ifdef WITH_NTFS_3G
+       struct _ntfs_volume *ntfs_vol;
+#endif
 };
 
 /* The opaque structure exposed to the wimlib API. */
 };
 
 /* The opaque structure exposed to the wimlib API. */
@@ -297,7 +306,7 @@ struct WIMStruct {
        struct wim_info *wim_info;
 
        /* Array of the image metadata, one for each image in the WIM. */
        struct wim_info *wim_info;
 
        /* Array of the image metadata, one for each image in the WIM. */
-       struct wim_image_metadata *image_metadata;
+       struct wim_image_metadata **image_metadata;
 
        /* The header of the WIM file. */
        struct wim_header hdr;
 
        /* The header of the WIM file. */
        struct wim_header hdr;
@@ -305,10 +314,6 @@ struct WIMStruct {
        /* Temporary field */
        void *private;
 
        /* Temporary field */
        void *private;
 
-#ifdef WITH_NTFS_3G
-       struct _ntfs_volume *ntfs_vol;
-#endif
-
        /* The currently selected image, indexed starting at 1.  If not 0,
         * subtract 1 from this to get the index of the current image in the
         * image_metadata array. */
        /* The currently selected image, indexed starting at 1.  If not 0,
         * subtract 1 from this to get the index of the current image in the
         * image_metadata array. */
@@ -321,27 +326,34 @@ struct WIMStruct {
 
 /* Inline utility functions for WIMStructs. */
 
 
 /* Inline utility functions for WIMStructs. */
 
+static inline struct wim_image_metadata *
+wim_get_current_image_metadata(WIMStruct *w)
+{
+       return w->image_metadata[w->current_image - 1];
+}
+
+static inline const struct wim_image_metadata *
+wim_get_const_current_image_metadata(const WIMStruct *w)
+{
+       return w->image_metadata[w->current_image - 1];
+}
+
 static inline struct wim_dentry *
 wim_root_dentry(WIMStruct *w)
 {
 static inline struct wim_dentry *
 wim_root_dentry(WIMStruct *w)
 {
-       return w->image_metadata[w->current_image - 1].root_dentry;
+       return wim_get_current_image_metadata(w)->root_dentry;
 }
 
 static inline struct wim_security_data *
 wim_security_data(WIMStruct *w)
 {
 }
 
 static inline struct wim_security_data *
 wim_security_data(WIMStruct *w)
 {
-       return w->image_metadata[w->current_image - 1].security_data;
+       return wim_get_current_image_metadata(w)->security_data;
 }
 }
+
 static inline const struct wim_security_data *
 wim_const_security_data(const WIMStruct *w)
 {
 static inline const struct wim_security_data *
 wim_const_security_data(const WIMStruct *w)
 {
-       return w->image_metadata[w->current_image - 1].security_data;
-}
-
-static inline struct wim_image_metadata *
-wim_get_current_image_metadata(WIMStruct *w)
-{
-       return &w->image_metadata[w->current_image - 1];
+       return wim_get_const_current_image_metadata(w)->security_data;
 }
 
 /* Nonzero if a struct resource_entry indicates a compressed resource. */
 }
 
 /* Nonzero if a struct resource_entry indicates a compressed resource. */
@@ -351,6 +363,43 @@ resource_is_compressed(const struct resource_entry *entry)
        return (entry->flags & WIM_RESHDR_FLAG_COMPRESSED);
 }
 
        return (entry->flags & WIM_RESHDR_FLAG_COMPRESSED);
 }
 
+/* Iterate over each inode in a WIM image that has not yet been hashed */
+#define image_for_each_inode(inode, imd) \
+       list_for_each_entry(inode, &imd->inode_list, i_list)
+
+/* Iterate over each stream in a WIM image that has not yet been hashed */
+#define image_for_each_unhashed_stream(lte, imd) \
+       list_for_each_entry(lte, &imd->unhashed_streams, unhashed_list)
+
+/* Iterate over each stream in a WIM image that has not yet been hashed (safe
+ * against stream removal) */
+#define image_for_each_unhashed_stream_safe(lte, tmp, imd) \
+       list_for_each_entry_safe(lte, tmp, &imd->unhashed_streams, unhashed_list)
+
+#if 1
+#  define copy_resource_entry(dst, src) memcpy(dst, src, sizeof(struct resource_entry))
+#  define zero_resource_entry(entry) memset(entry, 0, sizeof(struct resource_entry))
+#else
+static inline void
+copy_resource_entry(struct resource_entry *dst,
+                   const struct resource_entry *src)
+{
+       BUILD_BUG_ON(sizeof(struct resource_entry) != 24);
+       ((u64*)dst)[0] = ((u64*)src)[0];
+       ((u64*)dst)[1] = ((u64*)src)[1];
+       ((u64*)dst)[2] = ((u64*)src)[2];
+}
+
+static inline void
+zero_resource_entry(struct resource_entry *entry)
+{
+       BUILD_BUG_ON(sizeof(struct resource_entry) != 24);
+       ((u64*)entry)[0] = 0;
+       ((u64*)entry)[1] = 0;
+       ((u64*)entry)[2] = 0;
+}
+#endif
+
 /* add_image.c */
 
 extern bool
 /* add_image.c */
 
 extern bool
@@ -358,11 +407,6 @@ exclude_path(const tchar *path, size_t path_len,
             const struct wimlib_capture_config *config,
             bool exclude_prefix);
 
             const struct wimlib_capture_config *config,
             bool exclude_prefix);
 
-extern int
-add_new_dentry_tree(WIMStruct *dest_wim, struct wim_dentry *root,
-                   struct wim_security_data *sd);
-
-
 /* extract_image.c */
 
 /* Internal use only */
 /* extract_image.c */
 
 /* Internal use only */
@@ -392,7 +436,7 @@ struct wim_inode_table {
         *   number with some other inode until assign_inode_numbers() is
         *   called.
         */
         *   number with some other inode until assign_inode_numbers() is
         *   called.
         */
-       struct hlist_head extra_inodes;
+       struct list_head extra_inodes;
 };
 
 extern int
 };
 
 extern int
@@ -402,9 +446,12 @@ extern int
 inode_table_new_dentry(struct wim_inode_table *table, const tchar *name,
                       u64 ino, u64 devno, struct wim_dentry **dentry_ret);
 
 inode_table_new_dentry(struct wim_inode_table *table, const tchar *name,
                       u64 ino, u64 devno, struct wim_dentry **dentry_ret);
 
+extern void
+inode_ref_streams(struct wim_inode *inode);
+
 extern void
 inode_table_prepare_inode_list(struct wim_inode_table *table,
 extern void
 inode_table_prepare_inode_list(struct wim_inode_table *table,
-                              struct hlist_head *head);
+                              struct list_head *head);
 
 static inline void
 destroy_inode_table(struct wim_inode_table *table)
 
 static inline void
 destroy_inode_table(struct wim_inode_table *table)
@@ -414,7 +461,7 @@ destroy_inode_table(struct wim_inode_table *table)
 
 
 extern int
 
 
 extern int
-dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list);
+dentry_tree_fix_inodes(struct wim_dentry *root, struct list_head *inode_list);
 
 /* header.c */
 
 
 /* header.c */
 
@@ -518,11 +565,15 @@ build_dentry_tree_ntfs(struct wim_dentry **root_p,
                       wimlib_progress_func_t progress_func,
                       void *extra_arg);
 
                       wimlib_progress_func_t progress_func,
                       void *extra_arg);
 
+extern int
+do_ntfs_umount(struct _ntfs_volume *vol);
+
 /* resource.c */
 
 #define WIMLIB_RESOURCE_FLAG_RAW               0x1
 /* resource.c */
 
 #define WIMLIB_RESOURCE_FLAG_RAW               0x1
-#define WIMLIB_RESOURCE_FLAG_MULTITHREADED     0x2
+#define WIMLIB_RESOURCE_FLAG_THREADSAFE_READ   0x2
 #define WIMLIB_RESOURCE_FLAG_RECOMPRESS                0x4
 #define WIMLIB_RESOURCE_FLAG_RECOMPRESS                0x4
+//#define WIMLIB_RESOURCE_FLAG_OVERWRITE_INPLACE       0x8
 
 extern int
 read_resource_prefix(const struct wim_lookup_table_entry *lte,
 
 extern int
 read_resource_prefix(const struct wim_lookup_table_entry *lte,
@@ -561,6 +612,9 @@ extern int
 extract_wim_resource_to_fd(const struct wim_lookup_table_entry *lte,
                           int fd, u64 size);
 
 extract_wim_resource_to_fd(const struct wim_lookup_table_entry *lte,
                           int fd, u64 size);
 
+extern int
+sha1_resource(struct wim_lookup_table_entry *lte);
+
 extern int
 copy_resource(struct wim_lookup_table_entry *lte, void *w);
 
 extern int
 copy_resource(struct wim_lookup_table_entry *lte, void *w);
 
@@ -612,7 +666,24 @@ for_image(WIMStruct *w, int image, int (*visitor)(WIMStruct *));
 
 extern void
 destroy_image_metadata(struct wim_image_metadata *imd,
 
 extern void
 destroy_image_metadata(struct wim_image_metadata *imd,
-                      struct wim_lookup_table *lt);
+                      struct wim_lookup_table *table,
+                      bool free_metadata_lte);
+
+extern void
+put_image_metadata(struct wim_image_metadata *imd,
+                  struct wim_lookup_table *table);
+
+extern int
+append_image_metadata(WIMStruct *w, struct wim_image_metadata *imd);
+
+extern struct wim_image_metadata *
+new_image_metadata();
+
+extern struct wim_image_metadata **
+new_image_metadata_array(unsigned num_images);
+
+extern int
+wim_checksum_unhashed_streams(WIMStruct *w);
 
 /* write.c */
 
 
 /* write.c */