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 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 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