From: Eric Biggers Date: Wed, 22 May 2013 23:34:43 +0000 (-0500) Subject: dentry.{c,h}: Cleanup and fixes X-Git-Tag: v1.4.1~20 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=ce6b853107173c96fb04754aeb9e250a07bd4a07 dentry.{c,h}: Cleanup and fixes --- diff --git a/include/wimlib/dentry.h b/include/wimlib/dentry.h index 9e24529a..a571e021 100644 --- a/include/wimlib/dentry.h +++ b/include/wimlib/dentry.h @@ -562,15 +562,18 @@ inode_set_unix_data(struct wim_inode *inode, uid_t uid, gid_t gid, mode_t mode, #endif extern int -read_dentry(const u8 *metadata_resource, u64 metadata_resource_len, - u64 offset, struct wim_dentry *dentry); +read_dentry(const u8 * restrict metadata_resource, + u64 metadata_resource_len, u64 offset, + struct wim_dentry * restrict dentry); extern int -read_dentry_tree(const u8 metadata_resource[], u64 metadata_resource_len, - struct wim_dentry *dentry); +read_dentry_tree(const u8 * restrict metadata_resource, + u64 metadata_resource_len, + struct wim_dentry * restrict dentry); extern u8 * -write_dentry_tree(const struct wim_dentry *tree, u8 *p); +write_dentry_tree(const struct wim_dentry * restrict tree, + u8 * restrict p); static inline bool dentry_is_root(const struct wim_dentry *dentry) @@ -581,8 +584,9 @@ dentry_is_root(const struct wim_dentry *dentry) static inline bool inode_is_directory(const struct wim_inode *inode) { - return (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY) - && !(inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT); + return (inode->i_attributes & (FILE_ATTRIBUTE_DIRECTORY | + FILE_ATTRIBUTE_REPARSE_POINT)) + == FILE_ATTRIBUTE_DIRECTORY; } static inline bool @@ -601,18 +605,6 @@ inode_is_symlink(const struct wim_inode *inode) inode->i_reparse_tag == WIM_IO_REPARSE_TAG_MOUNT_POINT); } -static inline bool -inode_is_regular_file(const struct wim_inode *inode) -{ - return !inode_is_directory(inode) && !inode_is_symlink(inode); -} - -static inline bool -dentry_is_regular_file(const struct wim_dentry *dentry) -{ - return inode_is_regular_file(dentry->d_inode); -} - static inline bool inode_has_children(const struct wim_inode *inode) { @@ -643,7 +635,7 @@ inode_ref_streams(struct wim_inode *inode); extern int dentry_tree_fix_inodes(struct wim_dentry *root, struct list_head *inode_list); -int +extern int verify_inode(struct wim_inode *inode, const struct wim_security_data *sd); -#endif +#endif /* _WIMLIB_DENTRY_H */ diff --git a/src/dentry.c b/src/dentry.c index 451d412f..70250a7f 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -1994,8 +1994,9 @@ dentry_get_file_type_string(const struct wim_dentry *dentry) * Returns zero on success; nonzero on failure. */ int -read_dentry_tree(const u8 metadata_resource[], u64 metadata_resource_len, - struct wim_dentry *dentry) +read_dentry_tree(const u8 * restrict metadata_resource, + u64 metadata_resource_len, + struct wim_dentry * restrict dentry) { u64 cur_offset = dentry->subdir_offset; struct wim_dentry *child; @@ -2241,7 +2242,7 @@ write_dentry_tree_recursive(const struct wim_dentry *parent, u8 *p) * Returns pointer to the byte after the last byte we wrote. */ u8 * -write_dentry_tree(const struct wim_dentry *root, u8 *p) +write_dentry_tree(const struct wim_dentry * restrict root, u8 * restrict p) { DEBUG("Writing dentry tree."); wimlib_assert(dentry_is_root(root)); diff --git a/src/extract.c b/src/extract.c index 3e0e6af3..d6cc9c45 100644 --- a/src/extract.c +++ b/src/extract.c @@ -439,9 +439,11 @@ static int extract_dentry_to_stdout(struct wim_dentry *dentry) { int ret = 0; - if (!dentry_is_regular_file(dentry)) { + if (dentry->d_inode->i_attributes & (FILE_ATTRIBUTE_REPARSE_POINT | + FILE_ATTRIBUTE_DIRECTORY)) + { ERROR("\"%"TS"\" is not a regular file and therefore cannot be " - "extracted to standard output", dentry->_full_path); + "extracted to standard output", dentry_full_path(dentry)); ret = WIMLIB_ERR_NOT_A_REGULAR_FILE; } else { struct wim_lookup_table_entry *lte;