]> wimlib.net Git - wimlib/blobdiff - include/wimlib/inode.h
Update mount implementation
[wimlib] / include / wimlib / inode.h
index c787a9d2443395a093a2e0c4f7c9774cc8b7768c..84b49590ef73620e63e9ed5654a5d222b115cc56 100644 (file)
@@ -5,7 +5,6 @@
 #include "wimlib/list.h"
 #include "wimlib/lookup_table.h"
 #include "wimlib/sha1.h"
-#include "wimlib/unix_data.h"
 
 #include <string.h>
 
@@ -107,6 +106,15 @@ struct wim_inode {
         * 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
@@ -169,10 +177,17 @@ struct wim_inode {
                };
 
 #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 wimfs_fd **i_fds;
+               struct {
+                       /* Used only during image mount:  Table of file
+                        * descriptors that have been opened to this inode.
+                        * This table is freed when the last file descriptor is
+                        * closed.  */
+                       struct wimfs_fd **i_fds;
+
+                       /* Lower bound on the index of the next available entry
+                        * in 'i_fds'.  */
+                       u16 i_next_fd;
+               };
 #endif
        };
 
@@ -308,8 +323,7 @@ free_inode(struct wim_inode *inode);
                dentry_full_path(inode_first_dentry(inode))
 
 extern struct wim_ads_entry *
-inode_get_ads_entry(struct wim_inode *inode, const tchar *stream_name,
-                   u16 *idx_ret);
+inode_get_ads_entry(struct wim_inode *inode, const tchar *stream_name);
 
 extern struct wim_ads_entry *
 inode_add_ads_utf16le(struct wim_inode *inode,
@@ -319,7 +333,7 @@ inode_add_ads_utf16le(struct wim_inode *inode,
 extern struct wim_ads_entry *
 inode_add_ads(struct wim_inode *dentry, const tchar *stream_name);
 
-extern int
+extern struct wim_ads_entry *
 inode_add_ads_with_data(struct wim_inode *inode, const tchar *name,
                        const void *value, size_t size,
                        struct wim_lookup_table *lookup_table);
@@ -332,22 +346,13 @@ inode_set_unnamed_stream(struct wim_inode *inode, const void *data, size_t len,
                         struct wim_lookup_table *lookup_table);
 
 extern void
-inode_remove_ads(struct wim_inode *inode, u16 idx,
+inode_remove_ads(struct wim_inode *inode, struct wim_ads_entry *entry,
                 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?
@@ -482,6 +487,15 @@ inode_stream_name_nbytes(const struct wim_inode *inode, unsigned stream_idx)
                return inode->i_ads_entries[stream_idx - 1].stream_name_nbytes;
 }
 
+static inline u32
+inode_stream_idx_to_id(const struct wim_inode *inode, unsigned stream_idx)
+{
+       if (stream_idx == 0)
+               return 0;
+       else
+               return inode->i_ads_entries[stream_idx - 1].stream_id;
+}
+
 extern struct wim_lookup_table_entry *
 inode_unnamed_stream_resolved(const struct wim_inode *inode, u16 *stream_idx_ret);