]> wimlib.net Git - wimlib/blobdiff - src/wimlib_internal.h
Initial rewrite of resource code
[wimlib] / src / wimlib_internal.h
index 7f2b914bfc23d017d610de633b01725f23b9e3e0..61a70f1c354db7b77f50faa93f244636c5634a32 100644 (file)
@@ -256,6 +256,8 @@ struct wim_image_metadata {
        /* Linked list of inodes of this image */
        struct hlist_head inode_list;
 
+       struct list_head unhashed_streams;
+
        /* 1 iff the dentry tree has been modified.  If this is the case, the
         * memory for the dentry tree should not be freed when switching to a
         * different WIM image. */
@@ -351,23 +353,9 @@ resource_is_compressed(const struct resource_entry *entry)
 
 /* add_image.c */
 
-struct pattern_list {
-       const tchar **pats;
-       size_t num_pats;
-       size_t num_allocated_pats;
-};
-
-struct capture_config {
-       struct pattern_list exclusion_list;
-       struct pattern_list exclusion_exception;
-       struct pattern_list compression_exclusion_list;
-       struct pattern_list alignment_list;
-       tchar *config_str;
-       tchar *prefix;
-       size_t prefix_num_tchars;
-};
 extern bool
-exclude_path(const tchar *path, const struct capture_config *config,
+exclude_path(const tchar *path, size_t path_len,
+            const struct wimlib_capture_config *config,
             bool exclude_prefix);
 
 extern int
@@ -384,8 +372,46 @@ add_new_dentry_tree(WIMStruct *dest_wim, struct wim_dentry *root,
 
 /* hardlink.c */
 
-extern u64
-assign_inode_numbers(struct hlist_head *inode_list);
+/* Hash table to find inodes, given an inode number (in the case of reading
+ * a WIM images), or both an inode number and a device number (in the case of
+ * capturing a WIM image). */
+struct wim_inode_table {
+       /* Fields for the hash table */
+       struct hlist_head *array;
+       u64 num_entries;
+       u64 capacity;
+
+       /*
+        * Linked list of "extra" inodes.  These may be:
+        *
+        * - inodes with link count 1, which are all allowed to have 0 for their
+        *   inode number, meaning we cannot insert them into the hash table.
+         *
+        * - Groups we create ourselves by splitting a nominal inode due to
+        *   inconsistencies in the dentries.  These inodes will share an inode
+        *   number with some other inode until assign_inode_numbers() is
+        *   called.
+        */
+       struct hlist_head extra_inodes;
+};
+
+extern int
+init_inode_table(struct wim_inode_table *table, size_t capacity);
+
+extern int
+inode_table_new_dentry(struct wim_inode_table *table, const tchar *name,
+                      u64 ino, u64 devno, struct wim_dentry **dentry_ret);
+
+extern void
+inode_table_prepare_inode_list(struct wim_inode_table *table,
+                              struct hlist_head *head);
+
+static inline void
+destroy_inode_table(struct wim_inode_table *table)
+{
+       FREE(table->array);
+}
+
 
 extern int
 dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list);
@@ -471,12 +497,23 @@ extern void
 libntfs3g_global_init();
 
 /* ntfs-capture.c */
+
+/* The types of these two callbacks are intentionally the same. */
+typedef int (*consume_data_callback_t)(const void *buf, size_t len, void *ctx);
+
+extern int
+read_ntfs_file_prefix(const struct wim_lookup_table_entry *lte,
+                     u64 size,
+                     consume_data_callback_t cb,
+                     void *ctx_or_buf,
+                     int _ignored_flags);
 extern int
 build_dentry_tree_ntfs(struct wim_dentry **root_p,
                       const tchar *device,
                       struct wim_lookup_table *lookup_table,
+                      struct wim_inode_table *inode_table,
                       struct sd_set *sd_set,
-                      const struct capture_config *config,
+                      const struct wimlib_capture_config *config,
                       int add_image_flags,
                       wimlib_progress_func_t progress_func,
                       void *extra_arg);
@@ -487,61 +524,46 @@ build_dentry_tree_ntfs(struct wim_dentry **root_p,
 #define WIMLIB_RESOURCE_FLAG_MULTITHREADED     0x2
 #define WIMLIB_RESOURCE_FLAG_RECOMPRESS                0x4
 
-extern const u8 *
-get_resource_entry(const u8 *p, struct resource_entry *entry);
+extern int
+read_resource_prefix(const struct wim_lookup_table_entry *lte,
+                    u64 size, consume_data_callback_t cb, void *ctx_or_buf,
+                    int flags);
 
-extern u8 *
-put_resource_entry(u8 *p, const struct resource_entry *entry);
+extern const void *
+get_resource_entry(const void *p, struct resource_entry *entry);
+
+extern void *
+put_resource_entry(void *p, const struct resource_entry *entry);
 
 extern int
 read_uncompressed_resource(FILE *fp, u64 offset, u64 size, void *buf);
 
 extern int
-read_wim_resource(const struct wim_lookup_table_entry *lte, void *buf,
-                 size_t size, u64 offset, int flags);
-
+read_partial_wim_resource_into_buf(const struct wim_lookup_table_entry *lte,
+                                  size_t size, u64 offset, void *buf,
+                                  bool threadsafe);
 extern int
-read_full_wim_resource(const struct wim_lookup_table_entry *lte,
-                      void *buf, int flags);
+read_full_resource_into_buf(const struct wim_lookup_table_entry *lte,
+                           void *buf, bool thread_safe);
 
 extern int
 write_wim_resource(struct wim_lookup_table_entry *lte, FILE *out_fp,
                   int out_ctype, struct resource_entry *out_res_entry,
                   int flags);
 
-
-typedef int (*extract_chunk_func_t)(const void *, size_t, u64, void *);
-
-extern int
-extract_wim_chunk_to_fd(const void *buf, size_t len, u64 offset, void *arg);
-
 extern int
 extract_wim_resource(const struct wim_lookup_table_entry *lte,
-                    u64 size, extract_chunk_func_t extract_chunk,
+                    u64 size,
+                    consume_data_callback_t extract_chunk,
                     void *extract_chunk_arg);
 
-/*
- * Extracts the first @size bytes of the WIM resource specified by @lte to the
- * open file descriptor @fd.
- *
- * Returns 0 on success; nonzero on failure.
- */
-static inline int
-extract_wim_resource_to_fd(const struct wim_lookup_table_entry *lte,
-                          int fd, u64 size)
-{
-       return extract_wim_resource(lte, size,
-                                   extract_wim_chunk_to_fd, &fd);
-}
-
-
 extern int
-write_dentry_resources(struct wim_dentry *dentry, void *wim_p);
+extract_wim_resource_to_fd(const struct wim_lookup_table_entry *lte,
+                          int fd, u64 size);
 
 extern int
 copy_resource(struct wim_lookup_table_entry *lte, void *w);
 
-
 /* security.c */
 extern int
 read_security_data(const u8 metadata_resource[],
@@ -560,7 +582,7 @@ free_security_data(struct wim_security_data *sd);
 #ifndef __WIN32__
 ssize_t
 inode_readlink(const struct wim_inode *inode, char *buf, size_t buf_len,
-              const WIMStruct *w, int read_resource_flags);
+              const WIMStruct *w, bool threadsafe);
 
 extern int
 inode_set_symlink(struct wim_inode *inode, const char *target,
@@ -600,7 +622,11 @@ destroy_image_metadata(struct wim_image_metadata *imd,
 #define WIMLIB_WRITE_FLAG_CHECKPOINT_AFTER_XML  0x20000000
 #define WIMLIB_WRITE_MASK_PUBLIC               0x1fffffff
 
+/* We are capturing a tree to be placed in the root of the WIM image */
 #define WIMLIB_ADD_IMAGE_FLAG_ROOT     0x80000000
+
+/* We are capturing a dentry that will become the root of a tree to be added to
+ * the WIM image */
 #define WIMLIB_ADD_IMAGE_FLAG_SOURCE    0x40000000