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