#include "wimlib/assert.h"
#include "wimlib/list.h"
#include "wimlib/lookup_table.h"
-#include "wimlib/rbtree.h"
#include "wimlib/sha1.h"
-#include "wimlib/unix_data.h"
#include <string.h>
struct wim_security_data;
struct wim_lookup_table;
struct wimfs_fd;
+struct avl_tree_node;
/*
* WIM inode.
* this inode. */
u32 i_attributes;
- /* Root of a red-black tree storing the child dentries of this inode, if
- * any. Keyed by wim_dentry->file_name, case sensitively. */
- struct rb_root i_children;
+ /* Root of a balanced binary search tree storing the child directory
+ * entries of this inode, if any. Keyed by wim_dentry->file_name, case
+ * sensitively. If this inode is not a directory or if it has no
+ * children then this will be an empty tree (NULL). */
+ struct avl_tree_node *i_children;
- /* 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;
+ /* Root of a balanced binary search tree storing the child directory
+ * entries of this inode, if any. Keyed by wim_dentry->file_name, case
+ * insensitively. If this inode is not a directory or if it has no
+ * children then this will be an empty tree (NULL). */
+ struct avl_tree_node *i_children_ci;
/* List of dentries that are aliases for this inode. There will be
* i_nlink dentries in this list. */
* error paths. */
u8 i_visited : 1;
- /* 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;
* entries for this inode. */
struct wim_ads_entry *i_ads_entries;
+ /* If not NULL, a pointer to the extra data that was read from the
+ * dentry. This should be a series of tagged items, each of which
+ * represents a bit of extra metadata, such as the file's object ID.
+ * See tagged_items.c for more information. */
+ void *i_extra;
+
+ /* Size of @i_extra buffer in bytes. If 0, there is no extra data. */
+ size_t i_extra_size;
+
/* Creation time, last access time, and last write time for this inode, in
* 100-nanosecond intervals since 12:00 a.m UTC January 1, 1601. They
* should correspond to the times gotten by calling GetFileTime() on
* to 0 otherwise. */
u64 i_devno;
+ /* Fields used only during extraction */
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;
+ /* List of aliases of this dentry that are being
+ * extracted in the current extraction operation. This
+ * will be a (possibly nonproper) subset of the dentries
+ * in the i_dentry list. This list will be constructed
+ * regardless of whether the extraction backend supports
+ * hard links or not. */
+ struct list_head i_extraction_aliases;
+
+ #ifdef WITH_NTFS_3G
+ /* In NTFS-3g extraction mode, this is set to the Master
+ * File Table (MFT) number of the NTFS file that was
+ * created for this inode. */
+ u64 i_mft_no;
+ #endif
};
#ifdef WITH_FUSE
le16 stream_name_nbytes;
/* Stream name in UTF-16LE. It is @stream_name_nbytes bytes long,
- * excluding the the null terminator. There is a null terminator
+ * excluding the null terminator. There is a null terminator
* character if @stream_name_nbytes != 0; i.e., if this stream is named.
* */
utf16lechar stream_name[];
inode_remove_ads(struct wim_inode *inode, u16 idx,
struct wim_lookup_table *lookup_table);
-static inline bool
-ads_entry_is_unix_data(const struct wim_ads_entry *entry)
-{
- return (entry->stream_name_nbytes ==
- WIMLIB_UNIX_DATA_TAG_UTF16LE_NBYTES) &&
- !memcmp(entry->stream_name, WIMLIB_UNIX_DATA_TAG_UTF16LE,
- WIMLIB_UNIX_DATA_TAG_UTF16LE_NBYTES);
-}
-
static inline bool
ads_entry_is_named_stream(const struct wim_ads_entry *entry)
{
- return entry->stream_name_nbytes != 0 && !ads_entry_is_unix_data(entry);
+ return entry->stream_name_nbytes != 0;
}
/* Is the inode a directory?
/* Does the inode have children?
* Currently (based on read_dentry_tree()), this can only return true for inodes
- * for which inode_is_directory() returns true. However, if a directory is
- * empty, this returns false. */
+ * for which inode_is_directory() returns true. (This also returns false on
+ * empty directories.) */
static inline bool
inode_has_children(const struct wim_inode *inode)
{
- return !rb_empty_root(&inode->i_children);
+ return inode->i_children != NULL;
}
extern int
extern void
inode_ref_streams(struct wim_inode *inode);
+extern void
+inode_unref_streams(struct wim_inode *inode,
+ struct wim_lookup_table *lookup_table);
+
/* inode_fixup.c */
extern int
dentry_tree_fix_inodes(struct wim_dentry *root, struct list_head *inode_list);