X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fdentry.h;h=f61060e4a3f113cb6b15d0e3f911dbdd8b67b532;hb=eb83f143258d4f8bf072694d7ed5130f40824bd7;hp=2a40ef42ff64828c6b9861de27365e5ba0dd495d;hpb=41ae41d4dbe9a5c8413304b5e9ae02eec76d69b1;p=wimlib diff --git a/include/wimlib/dentry.h b/include/wimlib/dentry.h index 2a40ef42..f61060e4 100644 --- a/include/wimlib/dentry.h +++ b/include/wimlib/dentry.h @@ -131,7 +131,6 @@ struct wim_dentry { * case sensitive long name. */ struct rb_node rb_node; -#ifdef __WIN32__ /* Node for the parent's red-black tree of child dentries, sorted by * case insensitive long name. */ struct rb_node rb_node_case_insensitive; @@ -139,7 +138,6 @@ struct wim_dentry { /* List of dentries in a directory that have different case sensitive * long names but share the same case insensitive long name */ struct list_head case_insensitive_conflict_list; -#endif /* Length of UTF-16LE encoded short filename, in bytes, not including * the terminating zero wide-character. */ @@ -153,12 +151,19 @@ struct wim_dentry { * including the terminating null character. */ u32 full_path_nbytes; + /* For extraction operations, this flag will be set on dentries in the + * tree being extracted. Otherwise this will always be 0. */ + u8 in_extraction_tree : 1; + /* For extraction operations, this flag will be set when a dentry in the * tree being extracted is not being extracted for some reason (file - * type not supported by target filesystem or contains invalid - * characters). Otherwise this will always be 0. */ + * type not supported by target filesystem, contains invalid characters, + * or not in one of the multiple sub-trees being extracted). Otherwise + * this will always be 0. */ u8 extraction_skipped : 1; + /* During extraction extractions, this flag will be set after the + * "skeleton" of the dentry has been extracted. */ u8 skeleton_extracted : 1; /* When capturing from a NTFS volume using NTFS-3g, this flag is set on @@ -224,10 +229,6 @@ struct wim_dentry { * alias file_name. */ tchar *extraction_name; size_t extraction_name_nchars; - - /* (Extraction only) List head for building a list of dentries that - * contain a certain stream. */ - struct list_head extraction_stream_list; }; #define rbnode_dentry(node) container_of(node, struct wim_dentry, rb_node) @@ -267,11 +268,9 @@ struct wim_inode { * any. Keyed by wim_dentry->file_name, case sensitively. */ struct rb_root i_children; -#ifdef __WIN32__ /* Root of a red-black tree storing the children of this inode, if any. * Keyed by wim_dentry->file_name, case insensitively. */ struct rb_root i_children_case_insensitive; -#endif /* List of dentries that are aliases for this inode. There will be * i_nlink dentries in this list. */ @@ -294,7 +293,7 @@ struct wim_inode { /* Number of dentries that are aliases for this inode. */ u32 i_nlink; - /* Number of alternate data streams associated with this inode */ + /* Number of alternate data streams (ADS) associated with this inode */ u16 i_num_ads; /* Flag that indicates whether this inode's streams have been @@ -316,6 +315,10 @@ struct wim_inode { /* Set if the DOS name of an inode has already been extracted. */ u8 i_dos_name_extracted : 1; + /* 1 iff all ADS entries of this inode are named or if this inode + * has no ADS entries */ + u8 i_canonical_streams : 1; + /* Pointer to a malloc()ed array of i_num_ads alternate data stream * entries for this inode. */ struct wim_ads_entry *i_ads_entries; @@ -414,7 +417,7 @@ dentry_is_first_in_inode(const struct wim_dentry *dentry) } extern u64 -dentry_correct_total_length(const struct wim_dentry *dentry); +dentry_out_total_length(const struct wim_dentry *dentry); extern int for_dentry_in_tree(struct wim_dentry *root, @@ -426,15 +429,10 @@ for_dentry_in_rbtree(struct rb_node *node, int (*visitor)(struct wim_dentry *, void *), void *arg); -static inline int +extern int for_dentry_child(const struct wim_dentry *dentry, int (*visitor)(struct wim_dentry *, void *), - void *arg) -{ - return for_dentry_in_rbtree(dentry->d_inode->i_children.rb_node, - visitor, - arg); -} + void *arg); extern int for_dentry_in_tree_depth(struct wim_dentry *root, @@ -447,23 +445,40 @@ calculate_subdir_offsets(struct wim_dentry *dentry, u64 *subdir_offset_p); extern int set_dentry_name(struct wim_dentry *dentry, const tchar *new_name); -extern struct wim_dentry * -get_dentry(struct WIMStruct *wim, const tchar *path); -extern struct wim_inode * -wim_pathname_to_inode(struct WIMStruct *wim, const tchar *path); +/* Note: the NTFS-3g headers define CASE_SENSITIVE, hence the WIMLIB prefix. */ +typedef enum { + /* Use either case-sensitive or case-insensitive search, depending on + * the variable @default_ignore_case. */ + WIMLIB_CASE_PLATFORM_DEFAULT = 0, + + /* Use case-sensitive search. */ + WIMLIB_CASE_SENSITIVE = 1, + + /* Use case-insensitive search. */ + WIMLIB_CASE_INSENSITIVE = 2, +} CASE_SENSITIVITY_TYPE; + +extern bool default_ignore_case; + +extern struct wim_dentry * +get_dentry(struct WIMStruct *wim, const tchar *path, + CASE_SENSITIVITY_TYPE case_type); extern struct wim_dentry * get_dentry_child_with_name(const struct wim_dentry *dentry, - const tchar *name); + const tchar *name, + CASE_SENSITIVITY_TYPE case_type); extern struct wim_dentry * get_dentry_child_with_utf16le_name(const struct wim_dentry *dentry, const utf16lechar *name, - size_t name_nbytes); + size_t name_nbytes, + CASE_SENSITIVITY_TYPE case_type); extern struct wim_dentry * -get_parent_dentry(struct WIMStruct *wim, const tchar *path); +get_parent_dentry(struct WIMStruct *wim, const tchar *path, + CASE_SENSITIVITY_TYPE case_type); extern int print_dentry(struct wim_dentry *dentry, void *lookup_table); @@ -518,6 +533,10 @@ extern struct wim_dentry * dentry_add_child(struct wim_dentry * restrict parent, struct wim_dentry * restrict child); +extern int +rename_wim_path(WIMStruct *wim, const tchar *from, const tchar *to, + CASE_SENSITIVITY_TYPE case_type); + extern struct wim_ads_entry * inode_get_ads_entry(struct wim_inode *inode, const tchar *stream_name, u16 *idx_ret);