* Clean up the use of mutable Entry Until now, several syscalls including `fd_pwrite` etc. were relying on mutating `&mut Entry` by mutating its inner file handle. This is unnecessary in almost all cases since all methods mutating `std::fs::File` in Rust's libstd are also implemented for `&std::fs::File`. While here, I've also modified `OsHandle` in BSD to include `RefCell<Option<Dir>>` rather than `Option<Mutex<Dir>>` as was until now. While `RefCell` could easily be replaced with `RefCell`, since going multithreading will require a lot of (probably even) conceptual changes to `wasi-common`, I thought it'd be best not to mix single- with multithreading contexts and swap all places at once when it comes to it. I've also had to make some modifications to virtual FS which mainly swapped mutability for interior mutability in places. * Use one-liners wherever convenient
20 lines
939 B
Rust
20 lines
939 B
Rust
use crate::sys::entry::OsHandle;
|
|
use crate::wasi::Result;
|
|
use yanix::dir::Dir;
|
|
|
|
pub(crate) fn get_dir_from_os_handle(os_handle: &OsHandle) -> Result<Box<Dir>> {
|
|
// We need to duplicate the fd, because `opendir(3)`:
|
|
// After a successful call to fdopendir(), fd is used internally by the implementation,
|
|
// and should not otherwise be used by the application.
|
|
// `opendir(3p)` also says that it's undefined behavior to
|
|
// modify the state of the fd in a different way than by accessing DIR*.
|
|
//
|
|
// Still, rewinddir will be needed because the two file descriptors
|
|
// share progress. But we can safely execute closedir now.
|
|
let fd = os_handle.try_clone()?;
|
|
// TODO This doesn't look very clean. Can we do something about it?
|
|
// Boxing is needed here in order to satisfy `yanix`'s trait requirement for the `DirIter`
|
|
// where `T: Deref<Target = Dir>`.
|
|
Ok(Box::new(Dir::from(fd)?))
|
|
}
|