Rollup merge of #104901 - krtab:filetype_compare, r=the8472

Implement masking in FileType comparison on Unix

Fixes: https://github.com/rust-lang/rust/issues/104900
This commit is contained in:
Matthias Krüger 2022-12-10 09:24:42 +01:00 committed by GitHub
commit eb1159cbd8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 2 deletions

View File

@ -1551,3 +1551,19 @@ fn hiberfil_sys() {
fs::metadata(hiberfil).unwrap();
assert_eq!(true, hiberfil.exists());
}
/// Test that two different ways of obtaining the FileType give the same result.
/// Cf. https://github.com/rust-lang/rust/issues/104900
#[test]
fn test_eq_direntry_metadata() {
let tmpdir = tmpdir();
let file_path = tmpdir.join("file");
File::create(file_path).unwrap();
for e in fs::read_dir(tmpdir.path()).unwrap() {
let e = e.unwrap();
let p = e.path();
let ft1 = e.file_type().unwrap();
let ft2 = p.metadata().unwrap().file_type();
assert_eq!(ft1, ft2);
}
}

View File

@ -332,11 +332,23 @@ pub struct FileTimes {
modified: Option<SystemTime>,
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
#[derive(Copy, Clone, Eq, Debug)]
pub struct FileType {
mode: mode_t,
}
impl PartialEq for FileType {
fn eq(&self, other: &Self) -> bool {
self.masked() == other.masked()
}
}
impl core::hash::Hash for FileType {
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
self.masked().hash(state);
}
}
#[derive(Debug)]
pub struct DirBuilder {
mode: mode_t,
@ -548,7 +560,11 @@ impl FileType {
}
pub fn is(&self, mode: mode_t) -> bool {
self.mode & libc::S_IFMT == mode
self.masked() == mode
}
fn masked(&self) -> mode_t {
self.mode & libc::S_IFMT
}
}