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