mikros: implement read_dir
This commit is contained in:
parent
b9a358e1c5
commit
b78fffd9b0
@ -43,9 +43,16 @@ pub struct FileAttr {
|
|||||||
size: u64,
|
size: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ReadDir(!);
|
#[derive(Debug)]
|
||||||
|
pub struct ReadDir {
|
||||||
|
path: PathBuf,
|
||||||
|
fs_pid: u64,
|
||||||
|
fd: u64,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct DirEntry(!);
|
pub struct DirEntry {
|
||||||
|
path: PathBuf,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct OpenOptions {}
|
pub struct OpenOptions {}
|
||||||
@ -169,35 +176,46 @@ fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for ReadDir {
|
|
||||||
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Iterator for ReadDir {
|
impl Iterator for ReadDir {
|
||||||
type Item = io::Result<DirEntry>;
|
type Item = io::Result<DirEntry>;
|
||||||
|
|
||||||
fn next(&mut self) -> Option<io::Result<DirEntry>> {
|
fn next(&mut self) -> Option<io::Result<DirEntry>> {
|
||||||
self.0
|
let msg_data =
|
||||||
|
&rpc::send_call(self.fs_pid, 7, 0, &postcard::to_allocvec(&self.fd).unwrap())
|
||||||
|
.get_return();
|
||||||
|
let entry_res: Result<Option<String>, Errno> = postcard::from_bytes(msg_data).unwrap();
|
||||||
|
let entry_name = match entry_res.transpose()? {
|
||||||
|
Ok(val) => val,
|
||||||
|
Err(e) => return Some(Err(e.into())),
|
||||||
|
};
|
||||||
|
let mut entry_path = self.path.clone();
|
||||||
|
entry_path.push(entry_name);
|
||||||
|
Some(Ok(DirEntry { path: entry_path }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for ReadDir {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
let _ = &rpc::send_call(self.fs_pid, 7, 1, &postcard::to_allocvec(&self.fd).unwrap())
|
||||||
|
.get_return();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DirEntry {
|
impl DirEntry {
|
||||||
pub fn path(&self) -> PathBuf {
|
pub fn path(&self) -> PathBuf {
|
||||||
self.0
|
self.path.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn file_name(&self) -> OsString {
|
pub fn file_name(&self) -> OsString {
|
||||||
self.0
|
self.path.file_name().unwrap().to_owned()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn metadata(&self) -> io::Result<FileAttr> {
|
pub fn metadata(&self) -> io::Result<FileAttr> {
|
||||||
self.0
|
unsupported()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn file_type(&self) -> io::Result<FileType> {
|
pub fn file_type(&self) -> io::Result<FileType> {
|
||||||
self.0
|
unsupported()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,8 +381,18 @@ fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn readdir(_p: &Path) -> io::Result<ReadDir> {
|
pub fn readdir(path: &Path) -> io::Result<ReadDir> {
|
||||||
unsupported()
|
let vfs_pid = loop {
|
||||||
|
if let Some(pid) = syscalls::try_get_registered(0) {
|
||||||
|
break pid;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let open_res: Result<(u64, u64), Errno> = postcard::from_bytes(
|
||||||
|
&rpc::send_call(vfs_pid, 2, 6, &postcard::to_allocvec(path).unwrap()).get_return(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let (fs_pid, fd) = open_res?;
|
||||||
|
Ok(ReadDir { path: path.to_owned(), fs_pid, fd })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unlink(_p: &Path) -> io::Result<()> {
|
pub fn unlink(_p: &Path) -> io::Result<()> {
|
||||||
|
Loading…
Reference in New Issue
Block a user