aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/mod.rs2
-rw-r--r--src/platform/unix_common.rs23
2 files changed, 24 insertions, 1 deletions
diff --git a/src/platform/mod.rs b/src/platform/mod.rs
index eb84e0b1..2ba3e6f3 100644
--- a/src/platform/mod.rs
+++ b/src/platform/mod.rs
@@ -48,7 +48,7 @@ impl ChildExitReason {
}
#[cfg(unix)]
-pub(crate) use unix_common::classify_child_exit;
+pub(crate) use unix_common::{classify_child_exit, poll_fd_readable, read_fd};
#[cfg(not(any(unix, windows)))]
pub(crate) fn classify_child_exit(_status: &portable_pty::ExitStatus) -> ChildExitReason {
diff --git a/src/platform/unix_common.rs b/src/platform/unix_common.rs
index a937b863..6063edd9 100644
--- a/src/platform/unix_common.rs
+++ b/src/platform/unix_common.rs
@@ -8,6 +8,29 @@ pub(crate) fn classify_child_exit(status: &portable_pty::ExitStatus) -> super::C
}
}
+pub(crate) fn read_fd(fd: std::os::fd::RawFd, data: &mut [u8]) -> std::io::Result<usize> {
+ let result = unsafe { libc::read(fd, data.as_mut_ptr().cast(), data.len()) };
+ if result < 0 {
+ Err(std::io::Error::last_os_error())
+ } else {
+ Ok(result as usize)
+ }
+}
+
+pub(crate) fn poll_fd_readable(fd: std::os::fd::RawFd, timeout_ms: i32) -> std::io::Result<bool> {
+ let mut descriptor = libc::pollfd {
+ fd,
+ events: libc::POLLIN,
+ revents: 0,
+ };
+ let result = unsafe { libc::poll(&mut descriptor, 1, timeout_ms) };
+ if result < 0 {
+ Err(std::io::Error::last_os_error())
+ } else {
+ Ok(result > 0)
+ }
+}
+
pub(crate) fn shutdown_client_stream(stream: &crate::ipc::LocalStream) -> std::io::Result<()> {
let crate::ipc::LocalStream::UdSocket(stream) = stream;
stream.inner().shutdown(std::net::Shutdown::Both)