* Support fd_fdstat_get on stdin/stdout/stderr. Add a routine for obtaining an `OsFile` containing a file descriptor for stdin/stdout/stderr so that we can do fd_fdstat_get on them. * Add a testcase for fd_fdstat_get etc. on stdin etc. * Don't dup file descriptors in fd_renumber. * Fix compilation on macOS * Rename OsFile to OsHandle This commits renames `OsFile` to `OsHandle` which seems to make more sense semantically as it is permitted to hold a valid OS handle to OS entities other than simply file/dir (e.g., socket, stream, etc.). As such, this commit also renames methods on `Descriptor` struct from `as_actual_file` to `as_file` as this in reality does pertain ops on FS entities such as files/dirs, and `as_file` to `as_os_handle` as in this case it can be anything, from file, through a socket, to a stream. * Fix compilation on Linux * Introduce `OsHandleRef` for borrowing OS resources. To prevent a `ManuallyDrop<OsHandleRef>` from outliving the resource it holds on to, create an `OsHandleRef` class parameterized on the lifetime of the `Descriptor`. * Fix scoping to pub-priv and backport to snapshot_0
38 lines
1.2 KiB
Rust
38 lines
1.2 KiB
Rust
pub(crate) mod filetime;
|
|
pub(crate) mod hostcalls_impl;
|
|
pub(crate) mod oshandle;
|
|
|
|
pub(crate) mod fdentry_impl {
|
|
use crate::{sys::host_impl, Result};
|
|
use std::os::unix::prelude::AsRawFd;
|
|
|
|
pub(crate) unsafe fn isatty(fd: &impl AsRawFd) -> Result<bool> {
|
|
let res = libc::isatty(fd.as_raw_fd());
|
|
if res == 1 {
|
|
// isatty() returns 1 if fd is an open file descriptor referring to a terminal...
|
|
Ok(true)
|
|
} else {
|
|
// ... otherwise 0 is returned, and errno is set to indicate the error.
|
|
match nix::errno::Errno::last() {
|
|
nix::errno::Errno::ENOTTY => Ok(false),
|
|
x => Err(host_impl::errno_from_nix(x)),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pub(crate) mod host_impl {
|
|
use crate::{wasi, Result};
|
|
use std::convert::TryFrom;
|
|
|
|
pub(crate) const O_RSYNC: nix::fcntl::OFlag = nix::fcntl::OFlag::O_SYNC;
|
|
|
|
pub(crate) fn stdev_from_nix(dev: nix::libc::dev_t) -> Result<wasi::__wasi_device_t> {
|
|
wasi::__wasi_device_t::try_from(dev).map_err(Into::into)
|
|
}
|
|
|
|
pub(crate) fn stino_from_nix(ino: nix::libc::ino_t) -> Result<wasi::__wasi_inode_t> {
|
|
wasi::__wasi_device_t::try_from(ino).map_err(Into::into)
|
|
}
|
|
}
|