1 #![expect(unsafe_op_in_unsafe_fn, reason = "old code, not worth updating yet")]
2
3 use std::{env, process};
4 use test_programs::preview1::{assert_errno, open_scratch_directory};
5
test_overwrite_preopen(dir_fd: wasip1::Fd)6 unsafe fn test_overwrite_preopen(dir_fd: wasip1::Fd) {
7 let pre_fd: wasip1::Fd = (libc::STDERR_FILENO + 1) as wasip1::Fd;
8
9 assert!(dir_fd > pre_fd, "dir_fd number");
10
11 let old_dir_filestat = wasip1::fd_filestat_get(dir_fd).expect("failed fd_filestat_get");
12
13 // Try to renumber over a preopened directory handle.
14 wasip1::fd_renumber(dir_fd, pre_fd).expect("renumbering over a preopened file descriptor");
15
16 // Ensure that pre_fd is still open.
17 let new_dir_filestat = wasip1::fd_filestat_get(pre_fd).expect("failed fd_filestat_get");
18
19 // Ensure that we renumbered.
20 assert_eq!(old_dir_filestat.dev, new_dir_filestat.dev);
21 assert_eq!(old_dir_filestat.ino, new_dir_filestat.ino);
22
23 // Ensure that dir_fd is closed.
24 assert_errno!(
25 wasip1::fd_fdstat_get(dir_fd).expect_err("failed fd_fdstat_get"),
26 wasip1::ERRNO_BADF
27 );
28 }
29
main()30 fn main() {
31 let mut args = env::args();
32 let prog = args.next().unwrap();
33 let arg = if let Some(arg) = args.next() {
34 arg
35 } else {
36 eprintln!("usage: {prog} <scratch directory>");
37 process::exit(1);
38 };
39
40 // Open scratch directory
41 let dir_fd = match open_scratch_directory(&arg) {
42 Ok(dir_fd) => dir_fd,
43 Err(err) => {
44 eprintln!("{err}");
45 process::exit(1)
46 }
47 };
48
49 // Run the tests.
50 unsafe { test_overwrite_preopen(dir_fd) }
51 }
52