X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fdentry.h;h=09de869a99e07464fb5eaf8909bd60257f60146d;hb=773fafce334bd429d35365adfd377a0b63c66953;hp=a571e0213f93c93b5885bdf401b301895a7edee0;hpb=ce6b853107173c96fb04754aeb9e250a07bd4a07;p=wimlib diff --git a/include/wimlib/dentry.h b/include/wimlib/dentry.h index a571e021..09de869a 100644 --- a/include/wimlib/dentry.h +++ b/include/wimlib/dentry.h @@ -153,16 +153,13 @@ struct wim_dentry { * including the terminating null character. */ u32 full_path_nbytes; - /* For extraction operations, a subtree of dentries will have this flag - * set so we can keep track of which dentries still need to be - * extracted. Otherwise this will always be 0. */ - u8 needs_extraction : 1; - /* For extraction operations, this flag will be set when a dentry in the * tree being extracted is not being extracted for some reason (file * type not supported by target filesystem or contains invalid * characters). Otherwise this will always be 0. */ - u8 not_extracted : 1; + u8 extraction_skipped : 1; + + u8 skeleton_extracted : 1; /* When capturing from a NTFS volume using NTFS-3g, this flag is set on * dentries that were created from a filename in the WIN32 or WIN32+DOS @@ -177,6 +174,10 @@ struct wim_dentry { * names. */ u8 dos_name_invalid : 1; + u8 tmp_flag : 1; + + u8 was_hardlinked : 1; + /* Temporary list field used to make lists of dentries in a few places. * */ struct list_head tmp_list; @@ -312,8 +313,7 @@ struct wim_inode { * error paths. */ u8 i_visited : 1; - /* For NTFS-3g extraction: Set after the DOS name for this inode has - * been extracted. */ + /* Set if the DOS name of an inode has already been extracted. */ u8 i_dos_name_extracted : 1; /* Pointer to a malloc()ed array of i_num_ads alternate data stream @@ -368,17 +368,21 @@ struct wim_inode { * Freed and set to NULL after the extraction is done (either * success or failure). */ tchar *i_extracted_file; + +#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 { + struct wimfs_fd **i_fds; + u16 i_num_opened_fds; + u16 i_num_allocated_fds; + }; +#endif }; /* Next alternate data stream ID to be assigned */ u32 i_next_stream_id; - -#ifdef WITH_FUSE - /* wimfs file descriptors table for the inode */ - u16 i_num_opened_fds; - u16 i_num_allocated_fds; - struct wimfs_fd **i_fds; -#endif }; #define inode_for_each_dentry(dentry, inode) \ @@ -434,10 +438,10 @@ extern int set_dentry_name(struct wim_dentry *dentry, const tchar *new_name); extern struct wim_dentry * -get_dentry(struct WIMStruct *w, const tchar *path); +get_dentry(struct WIMStruct *wim, const tchar *path); extern struct wim_inode * -wim_pathname_to_inode(struct WIMStruct *w, const tchar *path); +wim_pathname_to_inode(struct WIMStruct *wim, const tchar *path); extern struct wim_dentry * get_dentry_child_with_name(const struct wim_dentry *dentry, @@ -449,7 +453,7 @@ get_dentry_child_with_utf16le_name(const struct wim_dentry *dentry, size_t name_nbytes); extern struct wim_dentry * -get_parent_dentry(struct WIMStruct *w, const tchar *path); +get_parent_dentry(struct WIMStruct *wim, const tchar *path); extern int print_dentry(struct wim_dentry *dentry, void *lookup_table); @@ -518,6 +522,9 @@ inode_add_ads_with_data(struct wim_inode *inode, const tchar *name, const void *value, size_t size, struct wim_lookup_table *lookup_table); +bool +inode_has_named_stream(const struct wim_inode *inode); + extern int inode_set_unnamed_stream(struct wim_inode *inode, const void *data, size_t len, struct wim_lookup_table *lookup_table); @@ -533,6 +540,22 @@ inode_remove_ads(struct wim_inode *inode, u16 idx, #define WIMLIB_UNIX_DATA_TAG_UTF16LE "$\0$\0_\0_\0w\0i\0m\0l\0i\0b\0_\0U\0N\0I\0X\0_\0d\0a\0t\0a\0" #define WIMLIB_UNIX_DATA_TAG_UTF16LE_NBYTES (sizeof(WIMLIB_UNIX_DATA_TAG_UTF16LE) - 1) +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); +} + +#ifndef __WIN32__ /* Format for special alternate data stream entries to store UNIX data for files * and directories (see: WIMLIB_ADD_FLAG_UNIX_DATA) */ struct wimlib_unix_data { @@ -542,8 +565,6 @@ struct wimlib_unix_data { u16 mode; } _packed_attribute; -#ifndef __WIN32__ - #define NO_UNIX_DATA (-1) #define BAD_UNIX_DATA (-2) extern int @@ -559,7 +580,10 @@ inode_get_unix_data(const struct wim_inode *inode, extern int inode_set_unix_data(struct wim_inode *inode, uid_t uid, gid_t gid, mode_t mode, struct wim_lookup_table *lookup_table, int which); -#endif +#endif /* !__WIN32__ */ + +extern bool +inode_has_unix_data(const struct wim_inode *inode); extern int read_dentry(const u8 * restrict metadata_resource, @@ -589,6 +613,14 @@ inode_is_directory(const struct wim_inode *inode) == FILE_ATTRIBUTE_DIRECTORY; } +static inline bool +inode_is_encrypted_directory(const struct wim_inode *inode) +{ + return ((inode->i_attributes & (FILE_ATTRIBUTE_DIRECTORY | + FILE_ATTRIBUTE_ENCRYPTED)) + == (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ENCRYPTED)); +} + static inline bool dentry_is_directory(const struct wim_dentry *dentry) {