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::open_scratch_directory; 5 6 unsafe fn test_file_unbuffered_write(dir_fd: wasip1::Fd) { 7 // Create and open file for reading 8 let fd_read = wasip1::path_open( 9 dir_fd, 10 0, 11 "file", 12 wasip1::OFLAGS_CREAT, 13 wasip1::RIGHTS_FD_READ, 14 0, 15 0, 16 ) 17 .expect("create and open file for reading"); 18 assert!( 19 fd_read > libc::STDERR_FILENO as wasip1::Fd, 20 "file descriptor range check", 21 ); 22 23 // Open the same file but for writing 24 let fd_write = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_WRITE, 0, 0) 25 .expect("opening file for writing"); 26 assert!( 27 fd_write > libc::STDERR_FILENO as wasip1::Fd, 28 "file descriptor range check", 29 ); 30 31 // Write to file 32 let contents = &[1u8]; 33 let ciovec = wasip1::Ciovec { 34 buf: contents.as_ptr() as *const _, 35 buf_len: contents.len(), 36 }; 37 let nwritten = wasip1::fd_write(fd_write, &[ciovec]).expect("writing byte to file"); 38 assert_eq!(nwritten, 1, "nwritten bytes check"); 39 40 // Read from file 41 let contents = &mut [0u8; 1]; 42 let iovec = wasip1::Iovec { 43 buf: contents.as_mut_ptr() as *mut _, 44 buf_len: contents.len(), 45 }; 46 let nread = wasip1::fd_read(fd_read, &[iovec]).expect("reading bytes from file"); 47 assert_eq!(nread, 1, "nread bytes check"); 48 assert_eq!(contents, &[1u8], "written bytes equal read bytes"); 49 50 // Clean up 51 wasip1::fd_close(fd_write).expect("closing a file"); 52 wasip1::fd_close(fd_read).expect("closing a file"); 53 wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); 54 } 55 fn main() { 56 let mut args = env::args(); 57 let prog = args.next().unwrap(); 58 let arg = if let Some(arg) = args.next() { 59 arg 60 } else { 61 eprintln!("usage: {prog} <scratch directory>"); 62 process::exit(1); 63 }; 64 65 // Open scratch directory 66 let dir_fd = match open_scratch_directory(&arg) { 67 Ok(dir_fd) => dir_fd, 68 Err(err) => { 69 eprintln!("{err}"); 70 process::exit(1) 71 } 72 }; 73 74 // Run the tests. 75 unsafe { test_file_unbuffered_write(dir_fd) } 76 } 77