X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwimlib_internal.h;h=3d7fb488f519fdc55cc4f91ba224337886d80447;hp=7f2b914bfc23d017d610de633b01725f23b9e3e0;hb=c6a1140e085f633273fcf47a6462bd9382ce118a;hpb=f8698b9c814a62a117982701b9551f699553b2a4 diff --git a/src/wimlib_internal.h b/src/wimlib_internal.h index 7f2b914b..3d7fb488 100644 --- a/src/wimlib_internal.h +++ b/src/wimlib_internal.h @@ -351,23 +351,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 +370,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); @@ -475,8 +499,9 @@ 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); @@ -600,7 +625,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