]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.h
Various cleanups
[wimlib] / src / lookup_table.h
index a269e512ebef8465dc8d151eb02432278e046739..7d8474f68f0a8598ca1ea81c3dce3e6267bd8a9f 100644 (file)
@@ -7,7 +7,9 @@
 /* Size of each lookup table entry in the WIM file. */
 #define WIM_LOOKUP_TABLE_ENTRY_DISK_SIZE 50
 
-#define LOOKUP_FLAG_ADS_OK
+#define LOOKUP_FLAG_ADS_OK             0x00000001
+#define LOOKUP_FLAG_DIRECTORY_OK       0x00000002
+#define LOOKUP_FLAG_FOLLOW_SYMLINKS    0x00000004
 
 
 /* A lookup table that is used to translate the hash codes of dentries into the
@@ -19,7 +21,17 @@ struct lookup_table {
        u64 capacity;
 };
 
-/* An entry in the lookup table in the WIM file. */
+struct wimlib_fd;
+
+
+/* 
+ * An entry in the lookup table in the WIM file. 
+ *
+ * It is used to find data streams for files in the WIM. 
+ *
+ * The lookup_table_entry for a given dentry in the WIM is found using the SHA1
+ * message digest field. 
+ */
 struct lookup_table_entry {
 
        /* The next struct lookup_table_entry in the hash bucket.  NULL if this is the
@@ -34,14 +46,14 @@ struct lookup_table_entry {
        /* Currently ignored; set to 1 in new lookup table entries. */
        u16 part_number;
 
-       /* Number of times this lookup table entry is referenced by dentries. */
-       u32 refcnt;
-
        /* If %true, this lookup table entry corresponds to a symbolic link
         * reparse buffer.  @symlink_reparse_data_buf will give the target of
         * the symbolic link. */
        bool is_symlink;
 
+       /* Number of times this lookup table entry is referenced by dentries. */
+       u32 refcnt;
+
        union {
                /* SHA1 hash of the file resource pointed to by this lookup
                 * table entry */
@@ -79,21 +91,12 @@ struct lookup_table_entry {
                        int   other_wim_ctype;
                };
 
-               struct { /* Used for read-write mounts. */
-
-
-                       /* Offset of the stream file_on_disk_fd. */
-                       off_t staging_offset;
-
+               struct { /* Used for wimlib_mount */
 
-                       /* If file_on_disk_fd, if it is not -1, is the file
-                        * descriptor, opened for reading, for file_on_disk. */
-                       int staging_fd;
-
-                       /* Number of times the file has been opened.
-                        * file_on_disk_fd can be closed when num_times_opened
-                        * is decremented to 0.  */
-                       int staging_num_times_opened;
+                       /* File descriptors table for this data stream */
+                       struct wimlib_fd **fds;
+                       u16 num_allocated_fds;
+                       u16 num_opened_fds;
                };
        };
 
@@ -107,11 +110,20 @@ struct lookup_table_entry {
         *
         * output_resource_entry is the struct resource_entry for the position of the
         * file resource when written to the output file. */
-       union {
-               u32 out_refcnt;
-               bool refcnt_is_incremented;
-       };
+       u32 out_refcnt;
        struct resource_entry output_resource_entry;
+
+       /* Circular linked list of streams that share the same lookup table
+        * entry
+        * 
+        * This list of streams may include streams from different hard link
+        * sets that happen to be the same.  */
+       struct list_head lte_group_list;
+
+       /* List of lookup table entries that correspond to streams that have
+        * been extracted to the staging directory when modifying a read-write
+        * mounted WIM. */
+       struct list_head staging_list;
 };
 
 extern struct lookup_table *new_lookup_table(size_t capacity);
@@ -122,8 +134,12 @@ extern void lookup_table_insert(struct lookup_table *table,
 extern void lookup_table_unlink(struct lookup_table *table, 
                                struct lookup_table_entry *lte);
 
-extern void lookup_table_decrement_refcnt(struct lookup_table* table, 
-                                         const u8 hash[]);
+extern struct lookup_table_entry *
+lookup_table_decrement_refcnt(struct lookup_table* table, const u8 hash[]);
+
+extern struct lookup_table_entry *
+lte_decrement_refcnt(struct lookup_table_entry *lte,
+                    struct lookup_table *table);
 
 
 extern struct lookup_table_entry *new_lookup_table_entry();
@@ -132,15 +148,13 @@ extern int for_lookup_table_entry(struct lookup_table *table,
                                  int (*visitor)(struct lookup_table_entry *, void *), 
                                  void *arg);
 
-extern struct lookup_table_entry *lookup_resource(const struct lookup_table *table,
-                                           const u8 hash[]);
-
-static inline struct lookup_table_entry *
-wim_lookup_resource(const WIMStruct *w, const struct dentry *dentry)
-{
-       return lookup_resource(w->lookup_table, dentry->hash);
-}
+extern struct lookup_table_entry *
+__lookup_resource(const struct lookup_table *lookup_table, const u8 hash[]);
 
+extern int lookup_resource(WIMStruct *w, const char *path,
+                          int lookup_flags, struct dentry **dentry_ret,
+                          struct lookup_table_entry **lte_ret,
+                          unsigned *stream_idx_ret);
 
 extern int zero_out_refcnts(struct lookup_table_entry *entry, void *ignore);
 
@@ -153,13 +167,9 @@ extern void free_lookup_table(struct lookup_table *table);
 
 extern int write_lookup_table_entry(struct lookup_table_entry *lte, void *__out);
 
-static inline void free_lookup_table_entry(struct lookup_table_entry *lte)
-{
-       if (lte) {
-               FREE(lte->file_on_disk);
-               FREE(lte);
-       }
-}
+extern void free_lookup_table_entry(struct lookup_table_entry *lte);
+
+extern int dentry_resolve_ltes(struct dentry *dentry, void *__table);
 
 /* Writes the lookup table to the output file. */
 static inline int write_lookup_table(struct lookup_table *table, FILE *out)