]> wimlib.net Git - wimlib/blobdiff - include/wimlib/dentry.h
lz_sarray.{c,h}: Cleanup, better comments
[wimlib] / include / wimlib / dentry.h
index 2a40ef42ff64828c6b9861de27365e5ba0dd495d..f61060e4a3f113cb6b15d0e3f911dbdd8b67b532 100644 (file)
@@ -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);