1 #[test]
test_statx_unknown_flags()2 fn test_statx_unknown_flags() {
3 use rustix::fs::{AtFlags, StatxFlags};
4
5 let f = std::fs::File::open(".").unwrap();
6
7 // It's ok (though still unwise) to construct flags values that have
8 // unknown bits. Exclude `STATX__RESERVED` here as that evokes an explicit
9 // failure; that's tested separately below.
10 let too_many_flags =
11 unsafe { StatxFlags::from_bits_unchecked(!0 & !linux_raw_sys::general::STATX__RESERVED) };
12
13 // It's also ok to pass such flags to `statx`.
14 let result = rustix::fs::statx(&f, "Cargo.toml", AtFlags::empty(), too_many_flags).unwrap();
15
16 // But, rustix should mask off bits it doesn't recognize, because these
17 // extra flags may tell future kernels to set extra fields beyond the
18 // extend of rustix's statx buffer. So make sure we didn't get extra
19 // fields.
20 assert_eq!(result.stx_mask & !StatxFlags::all().bits(), 0);
21 }
22
23 #[test]
test_statx_reserved()24 fn test_statx_reserved() {
25 use rustix::fs::{AtFlags, StatxFlags};
26
27 let f = std::fs::File::open(".").unwrap();
28
29 // It's ok (though still unwise) to construct a `STATX__RESERVED` flag
30 // value but `statx` should reliably fail with `INVAL`.
31 let reserved =
32 unsafe { StatxFlags::from_bits_unchecked(linux_raw_sys::general::STATX__RESERVED) };
33 match rustix::fs::statx(&f, "Cargo.toml", AtFlags::empty(), reserved) {
34 Ok(_) => panic!("statx succeeded with `STATX__RESERVED`"),
35 Err(err) => assert_eq!(err, rustix::io::Errno::INVAL),
36 }
37 }
38