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 6 unsafe fn test_path_exists(dir_fd: wasip1::Fd) { 7 // Create a temporary directory 8 wasip1::path_create_directory(dir_fd, "subdir").expect("create directory"); 9 10 // Check directory exists: 11 let file_stat = wasip1::path_filestat_get(dir_fd, 0, "subdir").expect("reading file stats"); 12 assert_eq!(file_stat.filetype, wasip1::FILETYPE_DIRECTORY); 13 14 // Should still exist with symlink follow flag: 15 let file_stat = wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir") 16 .expect("reading file stats"); 17 assert_eq!(file_stat.filetype, wasip1::FILETYPE_DIRECTORY); 18 19 // Create a file: 20 create_file(dir_fd, "subdir/file"); 21 // Check directory exists: 22 let file_stat = 23 wasip1::path_filestat_get(dir_fd, 0, "subdir/file").expect("reading file stats"); 24 assert_eq!(file_stat.filetype, wasip1::FILETYPE_REGULAR_FILE); 25 26 // Should still exist with symlink follow flag: 27 let file_stat = 28 wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir/file") 29 .expect("reading file stats"); 30 assert_eq!(file_stat.filetype, wasip1::FILETYPE_REGULAR_FILE); 31 32 // Create a symlink to a file: 33 wasip1::path_symlink("subdir/file", dir_fd, "link1").expect("create symlink"); 34 // Check symlink exists: 35 let file_stat = wasip1::path_filestat_get(dir_fd, 0, "link1").expect("reading file stats"); 36 assert_eq!(file_stat.filetype, wasip1::FILETYPE_SYMBOLIC_LINK); 37 38 // Should still exist with symlink follow flag, pointing to regular file 39 let file_stat = wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "link1") 40 .expect("reading file stats"); 41 assert_eq!(file_stat.filetype, wasip1::FILETYPE_REGULAR_FILE); 42 43 // Create a symlink to a dir: 44 wasip1::path_symlink("subdir", dir_fd, "link2").expect("create symlink"); 45 // Check symlink exists: 46 let file_stat = wasip1::path_filestat_get(dir_fd, 0, "link2").expect("reading file stats"); 47 assert_eq!(file_stat.filetype, wasip1::FILETYPE_SYMBOLIC_LINK); 48 49 // Should still exist with symlink follow flag, pointing to directory 50 let file_stat = wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "link2") 51 .expect("reading file stats"); 52 assert_eq!(file_stat.filetype, wasip1::FILETYPE_DIRECTORY); 53 54 wasip1::path_unlink_file(dir_fd, "link1").expect("clean up"); 55 wasip1::path_unlink_file(dir_fd, "link2").expect("clean up"); 56 wasip1::path_unlink_file(dir_fd, "subdir/file").expect("clean up"); 57 wasip1::path_remove_directory(dir_fd, "subdir").expect("clean up"); 58 } 59 60 fn main() { 61 let mut args = env::args(); 62 let prog = args.next().unwrap(); 63 let arg = if let Some(arg) = args.next() { 64 arg 65 } else { 66 eprintln!("usage: {prog} <scratch directory>"); 67 process::exit(1); 68 }; 69 70 // Open scratch directory 71 let dir_fd = match open_scratch_directory(&arg) { 72 Ok(dir_fd) => dir_fd, 73 Err(err) => { 74 eprintln!("{err}"); 75 process::exit(1) 76 } 77 }; 78 // Run the tests. 79 unsafe { test_path_exists(dir_fd) } 80 } 81