* 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;
/* 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. */
* 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;
- /* For extraction operations, this flag will be set on dentries in the
- * tree being extracted. */
- u8 in_extraction_tree : 1;
-
/* During extraction extractions, this flag will be set after the
* "skeleton" of the dentry has been extracted. */
u8 skeleton_extracted : 1;
* 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)
* 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. */
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,
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);
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);