/* Size of each lookup table entry in the WIM file. */
#define WIM_LOOKUP_TABLE_ENTRY_DISK_SIZE 50
+#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
* offsets and sizes of uncompressed or compressed file resources. It is
u64 capacity;
};
+struct wimlib_fd;
+
/* An entry in the lookup table in the WIM file. */
struct lookup_table_entry {
/* Currently ignored; set to 1 in new lookup table entries. */
u16 part_number;
+ /* 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;
- /* SHA1 hash of the file resource pointed to by this lookup table entry */
- u8 hash[WIM_HASH_SIZE];
+ union {
+ /* SHA1 hash of the file resource pointed to by this lookup
+ * table entry */
+ u8 hash[WIM_HASH_SIZE];
+
+ /* First 4 or 8 bytes of the SHA1 hash, used for inserting the
+ * entry into the hash table. Since the SHA1 hashes can be
+ * considered random, we don't really need the full 20 byte hash
+ * just to insert the entry in a hash table. */
+ size_t hash_short;
+ };
/* If @file_on_disk != NULL, the file resource indicated by this lookup
* table entry is not in the WIM file, but rather a file on disk; this
union {
char *file_on_disk;
char *staging_file_name;
+ void *symlink_buf;
struct lookup_table_entry *next_lte_in_swm;
};
/* Compression type used in other WIM. */
int other_wim_ctype;
};
-
- struct { /* Used for read-write mounts. */
-
-
- /* Offset of the stream file_on_disk_fd. */
- off_t staging_offset;
-
-
- /* 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;
+ struct {
+ struct wimlib_fd **fds;
+ u16 num_allocated_fds;
+ u16 num_opened_fds;
};
};
* output_resource_entry is the struct resource_entry for the position of the
* file resource when written to the output file. */
u32 out_refcnt;
- struct resource_entry output_resource_entry;
+ union {
+ struct resource_entry output_resource_entry;
+ struct list_head staging_list;
+ };
+ struct dentry *hard_link_sets;
};
extern struct lookup_table *new_lookup_table(size_t capacity);
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 *new_lookup_table_entry();
int (*visitor)(struct lookup_table_entry *, void *),
void *arg);
-extern struct lookup_table_entry *lookup_resource(const struct lookup_table *table,
- const u8 hash[]);
+extern struct lookup_table_entry *
+__lookup_resource(const struct lookup_table *lookup_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 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);
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);
/* Writes the lookup table to the output file. */
static inline int write_lookup_table(struct lookup_table *table, FILE *out)
static inline struct resource_entry* wim_metadata_resource_entry(WIMStruct *w)
{
- return &w->image_metadata[w->current_image - 1].
- lookup_table_entry->resource_entry;
+ return &w->image_metadata[
+ w->current_image - 1].metadata_lte->resource_entry;
}
#endif