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