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_close_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 // Try to close a preopened directory handle. 12 wasip1::fd_close(pre_fd).expect("closing a preopened file descriptor"); 13 14 // Ensure that dir_fd is still open. 15 let dir_fdstat = wasip1::fd_fdstat_get(dir_fd).expect("failed fd_fdstat_get"); 16 assert_eq!( 17 dir_fdstat.fs_filetype, 18 wasip1::FILETYPE_DIRECTORY, 19 "expected the scratch directory to be a directory", 20 ); 21 22 // Ensure that pre_fd is closed. 23 assert_errno!( 24 wasip1::fd_fdstat_get(pre_fd).expect_err("failed fd_fdstat_get"), 25 wasip1::ERRNO_BADF 26 ); 27 } 28 29 fn main() { 30 let mut args = env::args(); 31 let prog = args.next().unwrap(); 32 let arg = if let Some(arg) = args.next() { 33 arg 34 } else { 35 eprintln!("usage: {prog} <scratch directory>"); 36 process::exit(1); 37 }; 38 39 // Open scratch directory 40 let dir_fd = match open_scratch_directory(&arg) { 41 Ok(dir_fd) => dir_fd, 42 Err(err) => { 43 eprintln!("{err}"); 44 process::exit(1) 45 } 46 }; 47 48 // Run the tests. 49 unsafe { test_close_preopen(dir_fd) } 50 } 51