1 #[cfg(feature = "fs")]
2 #[test]
test_seals()3 fn test_seals() {
4 use rustix::fs::{
5 fcntl_add_seals, fcntl_get_seals, ftruncate, memfd_create, MemfdFlags, SealFlags,
6 };
7 use std::fs::File;
8 use std::io::Write;
9
10 let fd = match memfd_create("test", MemfdFlags::CLOEXEC | MemfdFlags::ALLOW_SEALING) {
11 Ok(fd) => fd,
12 Err(rustix::io::Errno::NOSYS) => return,
13 Err(err) => Err(err).unwrap(),
14 };
15 let mut file = File::from(fd);
16
17 let old = fcntl_get_seals(&file).unwrap();
18 assert_eq!(old, SealFlags::empty());
19
20 writeln!(&mut file, "Hello!").unwrap();
21
22 fcntl_add_seals(&file, SealFlags::GROW).unwrap();
23
24 let now = fcntl_get_seals(&file).unwrap();
25 assert_eq!(now, SealFlags::GROW);
26
27 // We sealed growing, so this should fail.
28 writeln!(&mut file, "World?").unwrap_err();
29
30 // We can still shrink for now.
31 ftruncate(&mut file, 1).unwrap();
32
33 fcntl_add_seals(&file, SealFlags::SHRINK).unwrap();
34
35 let now = fcntl_get_seals(&file).unwrap();
36 assert_eq!(now, SealFlags::GROW | SealFlags::SHRINK);
37
38 // We sealed shrinking, so this should fail.
39 ftruncate(&mut file, 0).unwrap_err();
40 }
41