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