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::{create_file, open_scratch_directory};
5 
test_path_open_lots(dir_fd: wasip1::Fd)6 unsafe fn test_path_open_lots(dir_fd: wasip1::Fd) {
7     create_file(dir_fd, "file");
8 
9     for _ in 0..2000 {
10         let f_readonly = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_READ, 0, 0)
11             .expect("open file readonly");
12 
13         let buffer = &mut [0u8; 100];
14         let iovec = wasip1::Iovec {
15             buf: buffer.as_mut_ptr(),
16             buf_len: buffer.len(),
17         };
18         let nread = wasip1::fd_read(f_readonly, &[iovec]).expect("reading readonly file");
19         assert_eq!(nread, 0, "readonly file is empty");
20 
21         wasip1::fd_close(f_readonly).expect("close readonly");
22     }
23 
24     for _ in 0..2000 {
25         let f_readonly = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_READ, 0, 0)
26             .expect("open file readonly");
27 
28         let buffer = &mut [0u8; 100];
29         let iovec = wasip1::Iovec {
30             buf: buffer.as_mut_ptr(),
31             buf_len: buffer.len(),
32         };
33         let nread = wasip1::fd_pread(f_readonly, &[iovec], 0).expect("reading readonly file");
34         assert_eq!(nread, 0, "readonly file is empty");
35 
36         wasip1::fd_close(f_readonly).expect("close readonly");
37     }
38 
39     for _ in 0..2000 {
40         let f = wasip1::path_open(
41             dir_fd,
42             0,
43             "file",
44             0,
45             wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE,
46             0,
47             0,
48         )
49         .unwrap();
50 
51         let buffer = &[0u8; 100];
52         let ciovec = wasip1::Ciovec {
53             buf: buffer.as_ptr(),
54             buf_len: buffer.len(),
55         };
56         let nwritten = wasip1::fd_write(f, &[ciovec]).expect("write failed");
57         assert_eq!(nwritten, 100);
58 
59         wasip1::fd_close(f).unwrap();
60     }
61 
62     for _ in 0..2000 {
63         let f = wasip1::path_open(
64             dir_fd,
65             0,
66             "file",
67             0,
68             wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE,
69             0,
70             0,
71         )
72         .unwrap();
73 
74         let buffer = &[0u8; 100];
75         let ciovec = wasip1::Ciovec {
76             buf: buffer.as_ptr(),
77             buf_len: buffer.len(),
78         };
79         let nwritten = wasip1::fd_pwrite(f, &[ciovec], 0).expect("write failed");
80         assert_eq!(nwritten, 100);
81 
82         wasip1::fd_close(f).unwrap();
83     }
84 
85     wasip1::path_unlink_file(dir_fd, "file").expect("removing a file");
86 }
87 
main()88 fn main() {
89     let mut args = env::args();
90     let prog = args.next().unwrap();
91     let arg = if let Some(arg) = args.next() {
92         arg
93     } else {
94         eprintln!("usage: {prog} <scratch directory>");
95         process::exit(1);
96     };
97 
98     // Open scratch directory
99     let dir_fd = match open_scratch_directory(&arg) {
100         Ok(dir_fd) => dir_fd,
101         Err(err) => {
102             eprintln!("{err}");
103             process::exit(1)
104         }
105     };
106 
107     // Run the tests.
108     unsafe { test_path_open_lots(dir_fd) }
109 }
110