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 
test_file_unbuffered_write(dir_fd: wasip1::Fd)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 }
main()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