]> wimlib.net Git - wimlib/blobdiff - include/wimlib/inode.h
Rename i_dentry => i_alias_list and d_alias => d_alias_node
[wimlib] / include / wimlib / inode.h
index 08ce3e91a8ea6bb99b94fe7a73cea8b00ad768eb..01254c82d1ccd9a7f9453ba7c345727e934ddc34 100644 (file)
@@ -70,7 +70,7 @@ struct wim_inode_stream {
        union {
                u8 _stream_hash[SHA1_HASH_SIZE];
                struct blob_descriptor *_stream_blob;
-       };
+       } _packed_attribute; /* union is SHA1_HASH_SIZE bytes */
 
        /* 'stream_resolved' determines whether 'stream_hash' or 'stream_blob'
         * is valid as described above.  */
@@ -119,33 +119,24 @@ struct wim_inode {
 
        /* List of dentries that are aliases for this inode.  There will be
         * i_nlink dentries in this list.  */
-       struct list_head i_dentry;
+       struct hlist_head i_alias_list;
 
-       /* Field to place this inode into a list. */
-       union {
-               /* Hash list node- used in inode_fixup.c when the inodes are
-                * placed into a hash table keyed by inode number and optionally
-                * device number, in order to detect dentries that are aliases
-                * for the same inode. */
-               struct hlist_node i_hlist;
-
-               /* Normal list node- used to connect all the inodes of a WIM
-                * image into a single linked list referenced from the `struct
-                * wim_image_metadata' for that image. */
-               struct list_head i_list;
-       };
+       /* Field to place this inode into a list.  While reading a WIM image or
+        * adding files to a WIM image this is owned by the inode table;
+        * otherwise this links the inodes for the WIM image.  */
+       struct hlist_node i_hlist;
 
        /* Number of dentries that are aliases for this inode.  */
-       u32 i_nlink;
+       u32 i_nlink : 30;
 
        /* Flag used to mark this inode as visited; this is used when visiting
         * all the inodes in a dentry tree exactly once.  It will be 0 by
         * default and must be cleared following the tree traversal, even in
         * error paths.  */
-       u8 i_visited : 1;
+       u32 i_visited : 1;
 
        /* Cached value  */
-       u8 i_can_externally_back : 1;
+       u32 i_can_externally_back : 1;
 
        /* 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
@@ -166,27 +157,20 @@ struct wim_inode {
 
        /* Corresponds to 'security_id' in `struct wim_dentry_on_disk':  The
         * index of this inode's security descriptor in the WIM image's table of
-        * security descriptors, or -1.  Note: when a WIM image is loaded,
-        * wimlib sets out-of-bounds indices and values less than -1 in this
-        * field to -1.  So the extraction code need not do an upper bound check
-        * after checking for -1 (or equivalently < 0).  */
-       int32_t i_security_id;
-
-       /* Identity of a reparse point.  See
-        * http://msdn.microsoft.com/en-us/library/windows/desktop/aa365503(v=vs.85).aspx
-        * for what a reparse point is. */
-       u32 i_reparse_tag;
+        * security descriptors, or -1 if this inode does not have a security
+        * descriptor.  */
+       s32 i_security_id;
 
-       /* Unused/unknown fields that we just read into memory so we can
-        * re-write them unchanged.  */
-       u32 i_rp_unknown_1;
-       u16 i_rp_unknown_2;
+       /* Unknown field that we only read into memory so we can re-write it
+        * unchanged.  Probably it's actually just padding...  */
+       u32 i_unknown_0x54;
 
-       /* Corresponds to not_rpfixed in `struct wim_dentry_on_disk':  Set to 0
-        * if reparse point fixups have been done.  Otherwise set to 1.  Note:
-        * this actually may reflect the SYMBOLIC_LINK_RELATIVE flag.
-        */
-       u16 i_not_rpfixed;
+       /* The following fields correspond to 'reparse_tag', 'rp_reserved', and
+        * 'rp_flags' in `struct wim_dentry_on_disk'.  They are only meaningful
+        * for reparse point files.  */
+       u32 i_reparse_tag;
+       u16 i_rp_reserved;
+       u16 i_rp_flags;
 
        /* Inode number; corresponds to hard_link_group_id in the `struct
         * wim_dentry_on_disk'.  */
@@ -196,19 +180,19 @@ struct wim_inode {
                /* Device number, used only during image capture, so we can
                 * identify hard linked files by the combination of inode number
                 * and device number (rather than just inode number, which could
-                * be ambigious if the captured tree spans a mountpoint).  Set
+                * be ambiguous if the captured tree spans a mountpoint).  Set
                 * to 0 otherwise.  */
                u64 i_devno;
 
                /* Fields used only during extraction  */
                struct {
-                       /* 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
+                       /* A singly linked list of aliases of this inode that
+                        * are being extracted in the current extraction
+                        * operation.  This list may be shorter than the inode's
+                        * full alias list.  This list will be constructed
                         * regardless of whether the extraction backend supports
                         * hard links or not.  */
-                       struct list_head i_extraction_aliases;
+                       struct wim_dentry *i_first_extraction_alias;
 
                #ifdef WITH_NTFS_3G
                        /* In NTFS-3g extraction mode, this is set to the Master
@@ -222,7 +206,7 @@ struct wim_inode {
                 * WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES:  the number
                 * of streams this inode has that have not yet been fully read.
                 * */
-               u32 num_remaining_streams;
+               u32 i_num_remaining_streams;
 
 #ifdef WITH_FUSE
                struct {
@@ -249,21 +233,20 @@ struct wim_inode {
 };
 
 /*
- * Reparse tags documented at
- * http://msdn.microsoft.com/en-us/library/dd541667(v=prot.10).aspx
+ * The available reparse tags are documented at
+ * http://msdn.microsoft.com/en-us/library/dd541667(v=prot.10).aspx.
+ * Here we only define the ones of interest to us.
  */
-#define WIM_IO_REPARSE_TAG_RESERVED_ZERO       0x00000000
-#define WIM_IO_REPARSE_TAG_RESERVED_ONE                0x00000001
 #define WIM_IO_REPARSE_TAG_MOUNT_POINT         0xA0000003
-#define WIM_IO_REPARSE_TAG_HSM                 0xC0000004
-#define WIM_IO_REPARSE_TAG_HSM2                        0x80000006
-#define WIM_IO_REPARSE_TAG_DRIVER_EXTENDER     0x80000005
-#define WIM_IO_REPARSE_TAG_SIS                 0x80000007
-#define WIM_IO_REPARSE_TAG_DFS                 0x8000000A
-#define WIM_IO_REPARSE_TAG_DFSR                        0x80000012
-#define WIM_IO_REPARSE_TAG_FILTER_MANAGER      0x8000000B
 #define WIM_IO_REPARSE_TAG_SYMLINK             0xA000000C
+#define WIM_IO_REPARSE_TAG_WOF                 0x80000017
 
+/* Flags for the rp_flags field.  Currently the only known flag is NOT_FIXED,
+ * which indicates that the target of the absolute symbolic link or junction was
+ * not changed when it was stored.  */
+#define WIM_RP_FLAG_NOT_FIXED             0x0001
+
+/* Windows file attribute flags  */
 #define FILE_ATTRIBUTE_READONLY            0x00000001
 #define FILE_ATTRIBUTE_HIDDEN              0x00000002
 #define FILE_ATTRIBUTE_SYSTEM              0x00000004
@@ -285,11 +268,11 @@ new_inode(struct wim_dentry *dentry, bool set_timestamps);
 
 /* Iterate through each alias of the specified inode.  */
 #define inode_for_each_dentry(dentry, inode) \
-       list_for_each_entry((dentry), &(inode)->i_dentry, d_alias)
+       hlist_for_each_entry((dentry), &(inode)->i_alias_list, d_alias_node)
 
 /* Return an alias of the specified inode.  */
 #define inode_first_dentry(inode) \
-       container_of(inode->i_dentry.next, struct wim_dentry, d_alias)
+       hlist_entry(inode->i_alias_list.first, struct wim_dentry, d_alias_node)
 
 /* Return the full path of an alias of the specified inode, or NULL if a full
  * path could not be determined.  */
@@ -339,6 +322,13 @@ inode_has_children(const struct wim_inode *inode)
        return inode->i_children != NULL;
 }
 
+/* Does the inode have a security descriptor?  */
+static inline bool
+inode_has_security_descriptor(const struct wim_inode *inode)
+{
+       return inode->i_security_id >= 0;
+}
+
 extern struct wim_inode_stream *
 inode_get_stream(const struct wim_inode *inode, int stream_type,
                 const utf16lechar *stream_name);
@@ -437,6 +427,6 @@ inode_unref_blobs(struct wim_inode *inode, struct blob_table *blob_table);
 
 /* inode_fixup.c  */
 extern int
-dentry_tree_fix_inodes(struct wim_dentry *root, struct list_head *inode_list);
+dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list);
 
 #endif /* _WIMLIB_INODE_H  */