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