use crate::ffi::OsString; use crate::fmt; use crate::hash::Hash; use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, SeekFrom}; use crate::path::{Path, PathBuf}; use crate::sys::time::SystemTime; use crate::sys::unsupported; #[expect(dead_code)] const FILE_PERMISSIONS_MASK: u64 = r_efi::protocols::file::READ_ONLY; pub struct File(!); #[derive(Clone)] pub struct FileAttr { attr: u64, size: u64, } pub struct ReadDir(!); pub struct DirEntry(!); #[derive(Clone, Debug)] pub struct OpenOptions {} #[derive(Copy, Clone, Debug, Default)] pub struct FileTimes {} #[derive(Clone, PartialEq, Eq, Debug)] // Bool indicates if file is readonly pub struct FilePermissions(bool); #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] // Bool indicates if directory pub struct FileType(bool); #[derive(Debug)] pub struct DirBuilder {} impl FileAttr { pub fn size(&self) -> u64 { self.size } pub fn perm(&self) -> FilePermissions { FilePermissions::from_attr(self.attr) } pub fn file_type(&self) -> FileType { FileType::from_attr(self.attr) } pub fn modified(&self) -> io::Result { unsupported() } pub fn accessed(&self) -> io::Result { unsupported() } pub fn created(&self) -> io::Result { unsupported() } } impl FilePermissions { pub fn readonly(&self) -> bool { self.0 } pub fn set_readonly(&mut self, readonly: bool) { self.0 = readonly } const fn from_attr(attr: u64) -> Self { Self(attr & r_efi::protocols::file::READ_ONLY != 0) } #[expect(dead_code)] const fn to_attr(&self) -> u64 { if self.0 { r_efi::protocols::file::READ_ONLY } else { 0 } } } impl FileTimes { pub fn set_accessed(&mut self, _t: SystemTime) {} pub fn set_modified(&mut self, _t: SystemTime) {} } impl FileType { pub fn is_dir(&self) -> bool { self.0 } pub fn is_file(&self) -> bool { !self.is_dir() } // Symlinks are not supported in UEFI pub fn is_symlink(&self) -> bool { false } const fn from_attr(attr: u64) -> Self { Self(attr & r_efi::protocols::file::DIRECTORY != 0) } } impl fmt::Debug for ReadDir { fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result { self.0 } } impl Iterator for ReadDir { type Item = io::Result; fn next(&mut self) -> Option> { self.0 } } impl DirEntry { pub fn path(&self) -> PathBuf { self.0 } pub fn file_name(&self) -> OsString { self.0 } pub fn metadata(&self) -> io::Result { self.0 } pub fn file_type(&self) -> io::Result { self.0 } } impl OpenOptions { pub fn new() -> OpenOptions { OpenOptions {} } pub fn read(&mut self, _read: bool) {} pub fn write(&mut self, _write: bool) {} pub fn append(&mut self, _append: bool) {} pub fn truncate(&mut self, _truncate: bool) {} pub fn create(&mut self, _create: bool) {} pub fn create_new(&mut self, _create_new: bool) {} } impl File { pub fn open(_path: &Path, _opts: &OpenOptions) -> io::Result { unsupported() } pub fn file_attr(&self) -> io::Result { self.0 } pub fn fsync(&self) -> io::Result<()> { self.0 } pub fn datasync(&self) -> io::Result<()> { self.0 } pub fn lock(&self) -> io::Result<()> { self.0 } pub fn lock_shared(&self) -> io::Result<()> { self.0 } pub fn try_lock(&self) -> io::Result { self.0 } pub fn try_lock_shared(&self) -> io::Result { self.0 } pub fn unlock(&self) -> io::Result<()> { self.0 } pub fn truncate(&self, _size: u64) -> io::Result<()> { self.0 } pub fn read(&self, _buf: &mut [u8]) -> io::Result { self.0 } pub fn read_vectored(&self, _bufs: &mut [IoSliceMut<'_>]) -> io::Result { self.0 } pub fn is_read_vectored(&self) -> bool { self.0 } pub fn read_buf(&self, _cursor: BorrowedCursor<'_>) -> io::Result<()> { self.0 } pub fn write(&self, _buf: &[u8]) -> io::Result { self.0 } pub fn write_vectored(&self, _bufs: &[IoSlice<'_>]) -> io::Result { self.0 } pub fn is_write_vectored(&self) -> bool { self.0 } pub fn flush(&self) -> io::Result<()> { self.0 } pub fn seek(&self, _pos: SeekFrom) -> io::Result { self.0 } pub fn tell(&self) -> io::Result { self.0 } pub fn duplicate(&self) -> io::Result { self.0 } pub fn set_permissions(&self, _perm: FilePermissions) -> io::Result<()> { self.0 } pub fn set_times(&self, _times: FileTimes) -> io::Result<()> { self.0 } } impl DirBuilder { pub fn new() -> DirBuilder { DirBuilder {} } pub fn mkdir(&self, _p: &Path) -> io::Result<()> { unsupported() } } impl fmt::Debug for File { fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result { self.0 } } pub fn readdir(_p: &Path) -> io::Result { unsupported() } pub fn unlink(_p: &Path) -> io::Result<()> { unsupported() } pub fn rename(_old: &Path, _new: &Path) -> io::Result<()> { unsupported() } pub fn set_perm(_p: &Path, _perm: FilePermissions) -> io::Result<()> { unsupported() } pub fn rmdir(_p: &Path) -> io::Result<()> { unsupported() } pub fn remove_dir_all(_path: &Path) -> io::Result<()> { unsupported() } pub fn exists(_path: &Path) -> io::Result { unsupported() } pub fn readlink(_p: &Path) -> io::Result { unsupported() } pub fn symlink(_original: &Path, _link: &Path) -> io::Result<()> { unsupported() } pub fn link(_src: &Path, _dst: &Path) -> io::Result<()> { unsupported() } pub fn stat(_p: &Path) -> io::Result { unsupported() } pub fn lstat(_p: &Path) -> io::Result { unsupported() } pub fn canonicalize(_p: &Path) -> io::Result { unsupported() } pub fn copy(_from: &Path, _to: &Path) -> io::Result { unsupported() }