Rollup merge of #93471 - cuviper:direntry-file_type-stat, r=the8472

unix: Use metadata for `DirEntry::file_type` fallback

When `DirEntry::file_type` fails to match a known `d_type`, we should
fall back to `DirEntry::metadata` instead of a bare `lstat`, because
this is faster and more reliable on targets with `fstatat`.
This commit is contained in:
Matthias Krüger 2022-01-31 07:00:44 +01:00 committed by GitHub
commit cd27f1b56e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -598,7 +598,7 @@ pub fn metadata(&self) -> io::Result<FileAttr> {
target_os = "vxworks" target_os = "vxworks"
))] ))]
pub fn file_type(&self) -> io::Result<FileType> { pub fn file_type(&self) -> io::Result<FileType> {
lstat(&self.path()).map(|m| m.file_type()) self.metadata().map(|m| m.file_type())
} }
#[cfg(not(any( #[cfg(not(any(
@ -616,7 +616,7 @@ pub fn file_type(&self) -> io::Result<FileType> {
libc::DT_SOCK => Ok(FileType { mode: libc::S_IFSOCK }), libc::DT_SOCK => Ok(FileType { mode: libc::S_IFSOCK }),
libc::DT_DIR => Ok(FileType { mode: libc::S_IFDIR }), libc::DT_DIR => Ok(FileType { mode: libc::S_IFDIR }),
libc::DT_BLK => Ok(FileType { mode: libc::S_IFBLK }), libc::DT_BLK => Ok(FileType { mode: libc::S_IFBLK }),
_ => lstat(&self.path()).map(|m| m.file_type()), _ => self.metadata().map(|m| m.file_type()),
} }
} }