#![deny(unsafe_op_in_unsafe_fn)] use crate::io; use crate::path::{Path, PathBuf}; pub mod common; cfg_if::cfg_if! { if #[cfg(target_family = "unix")] { mod unix; use unix as imp; pub use unix::{chown, fchown, lchown, mkfifo}; #[cfg(not(target_os = "fuchsia"))] pub use unix::chroot; pub(crate) use unix::debug_assert_fd_is_open; #[cfg(any(target_os = "linux", target_os = "android"))] pub(crate) use unix::CachedFileMetadata; use crate::sys::common::small_c_string::run_path_with_cstr as with_native_path; } else if #[cfg(target_os = "windows")] { mod windows; use windows as imp; pub use windows::{symlink_inner, junction_point}; use crate::sys::path::with_native_path; } else if #[cfg(target_os = "hermit")] { mod hermit; use hermit as imp; } else if #[cfg(target_os = "solid_asp3")] { mod solid; use solid as imp; } else if #[cfg(target_os = "uefi")] { mod uefi; use uefi as imp; } else if #[cfg(target_os = "wasi")] { mod wasi; use wasi as imp; } else { mod unsupported; use unsupported as imp; } } // FIXME: Replace this with platform-specific path conversion functions. #[cfg(not(any(target_family = "unix", target_os = "windows")))] #[inline] pub fn with_native_path(path: &Path, f: &dyn Fn(&Path) -> io::Result) -> io::Result { f(path) } pub use imp::{ DirBuilder, DirEntry, File, FileAttr, FilePermissions, FileTimes, FileType, OpenOptions, ReadDir, }; pub fn read_dir(path: &Path) -> io::Result { // FIXME: use with_native_path on all platforms imp::readdir(path) } pub fn remove_file(path: &Path) -> io::Result<()> { with_native_path(path, &imp::unlink) } pub fn rename(old: &Path, new: &Path) -> io::Result<()> { with_native_path(old, &|old| with_native_path(new, &|new| imp::rename(old, new))) } pub fn remove_dir(path: &Path) -> io::Result<()> { with_native_path(path, &imp::rmdir) } pub fn remove_dir_all(path: &Path) -> io::Result<()> { // FIXME: use with_native_path on all platforms #[cfg(not(windows))] return imp::remove_dir_all(path); #[cfg(windows)] with_native_path(path, &imp::remove_dir_all) } pub fn read_link(path: &Path) -> io::Result { with_native_path(path, &imp::readlink) } pub fn symlink(original: &Path, link: &Path) -> io::Result<()> { // FIXME: use with_native_path on all platforms #[cfg(windows)] return imp::symlink(original, link); #[cfg(not(windows))] with_native_path(original, &|original| { with_native_path(link, &|link| imp::symlink(original, link)) }) } pub fn hard_link(original: &Path, link: &Path) -> io::Result<()> { with_native_path(original, &|original| { with_native_path(link, &|link| imp::link(original, link)) }) } pub fn metadata(path: &Path) -> io::Result { with_native_path(path, &imp::stat) } pub fn symlink_metadata(path: &Path) -> io::Result { with_native_path(path, &imp::lstat) } pub fn set_permissions(path: &Path, perm: FilePermissions) -> io::Result<()> { with_native_path(path, &|path| imp::set_perm(path, perm.clone())) } pub fn canonicalize(path: &Path) -> io::Result { with_native_path(path, &imp::canonicalize) } pub fn copy(from: &Path, to: &Path) -> io::Result { // FIXME: use with_native_path on all platforms #[cfg(not(windows))] return imp::copy(from, to); #[cfg(windows)] with_native_path(from, &|from| with_native_path(to, &|to| imp::copy(from, to))) } pub fn exists(path: &Path) -> io::Result { // FIXME: use with_native_path on all platforms #[cfg(not(windows))] return imp::exists(path); #[cfg(windows)] with_native_path(path, &imp::exists) }