]> wimlib.net Git - wimlib/blobdiff - include/wimlib/dentry.h
Allow configurable case sensitivity
[wimlib] / include / wimlib / dentry.h
index 09de869a99e07464fb5eaf8909bd60257f60146d..22f0aff55e7bfa562c378f2255d321917bdc4497 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. */
@@ -159,6 +157,12 @@ struct wim_dentry {
         * characters).  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;
 
        /* When capturing from a NTFS volume using NTFS-3g, this flag is set on
@@ -224,10 +228,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 +267,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 +292,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 +314,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;
@@ -363,24 +365,34 @@ struct wim_inode {
                 * to 0 otherwise.  */
                u64 i_devno;
 
-               /* Used only during image extraction: pointer to the first path
-                * (malloc()ed buffer) at which this inode has been extracted.
-                * Freed and set to NULL after the extraction is done (either
-                * success or failure).  */
-               tchar *i_extracted_file;
+               struct {
+
+                       /* Used only during image extraction: pointer to the first path
+                        * (malloc()ed buffer) at which this inode has been extracted.
+                        * Freed and set to NULL after the extraction is done (either
+                        * success or failure).  */
+                       tchar *i_extracted_file;
+
+                       /** Used only during image extraction: "cookie" that
+                        * identifies this extracted file (inode), for example
+                        * an inode number.  Only used if supported by the
+                        * extraction mode.  */
+                       u64 extract_cookie;
+               };
 
 #ifdef WITH_FUSE
                /* Used only during image mount:  Table of file descriptors that
                 * have been opened to this inode.  The table is automatically
                 * freed when the last file descriptor is closed.  */
-               struct {
-                       struct wimfs_fd **i_fds;
-                       u16 i_num_opened_fds;
-                       u16 i_num_allocated_fds;
-               };
+               struct wimfs_fd **i_fds;
 #endif
        };
 
+#ifdef WITH_FUSE
+       u16 i_num_opened_fds;
+       u16 i_num_allocated_fds;
+#endif
+
        /* Next alternate data stream ID to be assigned */
        u32 i_next_stream_id;
 };
@@ -404,7 +416,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,
@@ -416,15 +428,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,
@@ -437,23 +444,34 @@ 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);
+typedef enum {
+       /* NTFS-3g headers define CASE_SENSITIVE...  */
+       WIMLIB_CASE_PLATFORM_DEFAULT = 0,
+       WIMLIB_CASE_SENSITIVE = 1,
+       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);
@@ -482,6 +500,9 @@ new_dentry_with_inode(const tchar *name, struct wim_dentry **dentry_ret);
 extern int
 new_dentry_with_timeless_inode(const tchar *name, struct wim_dentry **dentry_ret);
 
+extern void
+dentry_tree_clear_inode_visited(struct wim_dentry *root);
+
 extern int
 new_filler_directory(const tchar *name, struct wim_dentry **dentry_ret);
 
@@ -505,6 +526,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);