summaryrefslogtreecommitdiffstats
path: root/vendor/nix/src/poll.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nix/src/poll.rs')
-rw-r--r--vendor/nix/src/poll.rs197
1 files changed, 0 insertions, 197 deletions
diff --git a/vendor/nix/src/poll.rs b/vendor/nix/src/poll.rs
deleted file mode 100644
index 6f227fee9..000000000
--- a/vendor/nix/src/poll.rs
+++ /dev/null
@@ -1,197 +0,0 @@
-//! Wait for events to trigger on specific file descriptors
-use std::os::unix::io::{AsRawFd, RawFd};
-
-use crate::errno::Errno;
-use crate::Result;
-
-/// This is a wrapper around `libc::pollfd`.
-///
-/// It's meant to be used as an argument to the [`poll`](fn.poll.html) and
-/// [`ppoll`](fn.ppoll.html) functions to specify the events of interest
-/// for a specific file descriptor.
-///
-/// After a call to `poll` or `ppoll`, the events that occurred can be
-/// retrieved by calling [`revents()`](#method.revents) on the `PollFd`.
-#[repr(transparent)]
-#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
-pub struct PollFd {
- pollfd: libc::pollfd,
-}
-
-impl PollFd {
- /// Creates a new `PollFd` specifying the events of interest
- /// for a given file descriptor.
- pub const fn new(fd: RawFd, events: PollFlags) -> PollFd {
- PollFd {
- pollfd: libc::pollfd {
- fd,
- events: events.bits(),
- revents: PollFlags::empty().bits(),
- },
- }
- }
-
- /// Returns the events that occurred in the last call to `poll` or `ppoll`. Will only return
- /// `None` if the kernel provides status flags that Nix does not know about.
- pub fn revents(self) -> Option<PollFlags> {
- PollFlags::from_bits(self.pollfd.revents)
- }
-
- /// Returns if any of the events of interest occured in the last call to `poll` or `ppoll`. Will
- /// only return `None` if the kernel provides status flags that Nix does not know about.
- ///
- /// Equivalent to `x.revents()? != PollFlags::empty()`.
- ///
- /// This is marginally more efficient than [`PollFd::all`].
- pub fn any(self) -> Option<bool> {
- Some(self.revents()? != PollFlags::empty())
- }
-
- /// Returns if all the events of interest occured in the last call to `poll` or `ppoll`. Will
- /// only return `None` if the kernel provides status flags that Nix does not know about.
- ///
- /// Equivalent to `x.revents()? & x.events() == x.events()`.
- ///
- /// This is marginally less efficient than [`PollFd::any`].
- pub fn all(self) -> Option<bool> {
- Some(self.revents()? & self.events() == self.events())
- }
-
- /// The events of interest for this `PollFd`.
- pub fn events(self) -> PollFlags {
- PollFlags::from_bits(self.pollfd.events).unwrap()
- }
-
- /// Modify the events of interest for this `PollFd`.
- pub fn set_events(&mut self, events: PollFlags) {
- self.pollfd.events = events.bits();
- }
-}
-
-impl AsRawFd for PollFd {
- fn as_raw_fd(&self) -> RawFd {
- self.pollfd.fd
- }
-}
-
-libc_bitflags! {
- /// These flags define the different events that can be monitored by `poll` and `ppoll`
- pub struct PollFlags: libc::c_short {
- /// There is data to read.
- POLLIN;
- /// There is some exceptional condition on the file descriptor.
- ///
- /// Possibilities include:
- ///
- /// * There is out-of-band data on a TCP socket (see
- /// [tcp(7)](https://man7.org/linux/man-pages/man7/tcp.7.html)).
- /// * A pseudoterminal master in packet mode has seen a state
- /// change on the slave (see
- /// [ioctl_tty(2)](https://man7.org/linux/man-pages/man2/ioctl_tty.2.html)).
- /// * A cgroup.events file has been modified (see
- /// [cgroups(7)](https://man7.org/linux/man-pages/man7/cgroups.7.html)).
- POLLPRI;
- /// Writing is now possible, though a write larger that the
- /// available space in a socket or pipe will still block (unless
- /// `O_NONBLOCK` is set).
- POLLOUT;
- /// Equivalent to [`POLLIN`](constant.POLLIN.html)
- #[cfg(not(target_os = "redox"))]
- #[cfg_attr(docsrs, doc(cfg(all())))]
- POLLRDNORM;
- #[cfg(not(target_os = "redox"))]
- #[cfg_attr(docsrs, doc(cfg(all())))]
- /// Equivalent to [`POLLOUT`](constant.POLLOUT.html)
- POLLWRNORM;
- /// Priority band data can be read (generally unused on Linux).
- #[cfg(not(target_os = "redox"))]
- #[cfg_attr(docsrs, doc(cfg(all())))]
- POLLRDBAND;
- /// Priority data may be written.
- #[cfg(not(target_os = "redox"))]
- #[cfg_attr(docsrs, doc(cfg(all())))]
- POLLWRBAND;
- /// Error condition (only returned in
- /// [`PollFd::revents`](struct.PollFd.html#method.revents);
- /// ignored in [`PollFd::new`](struct.PollFd.html#method.new)).
- /// This bit is also set for a file descriptor referring to the
- /// write end of a pipe when the read end has been closed.
- POLLERR;
- /// Hang up (only returned in [`PollFd::revents`](struct.PollFd.html#method.revents);
- /// ignored in [`PollFd::new`](struct.PollFd.html#method.new)).
- /// Note that when reading from a channel such as a pipe or a stream
- /// socket, this event merely indicates that the peer closed its
- /// end of the channel. Subsequent reads from the channel will
- /// return 0 (end of file) only after all outstanding data in the
- /// channel has been consumed.
- POLLHUP;
- /// Invalid request: `fd` not open (only returned in
- /// [`PollFd::revents`](struct.PollFd.html#method.revents);
- /// ignored in [`PollFd::new`](struct.PollFd.html#method.new)).
- POLLNVAL;
- }
-}
-
-/// `poll` waits for one of a set of file descriptors to become ready to perform I/O.
-/// ([`poll(2)`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html))
-///
-/// `fds` contains all [`PollFd`](struct.PollFd.html) to poll.
-/// The function will return as soon as any event occur for any of these `PollFd`s.
-///
-/// The `timeout` argument specifies the number of milliseconds that `poll()`
-/// should block waiting for a file descriptor to become ready. The call
-/// will block until either:
-///
-/// * a file descriptor becomes ready;
-/// * the call is interrupted by a signal handler; or
-/// * the timeout expires.
-///
-/// Note that the timeout interval will be rounded up to the system clock
-/// granularity, and kernel scheduling delays mean that the blocking
-/// interval may overrun by a small amount. Specifying a negative value
-/// in timeout means an infinite timeout. Specifying a timeout of zero
-/// causes `poll()` to return immediately, even if no file descriptors are
-/// ready.
-pub fn poll(fds: &mut [PollFd], timeout: libc::c_int) -> Result<libc::c_int> {
- let res = unsafe {
- libc::poll(
- fds.as_mut_ptr() as *mut libc::pollfd,
- fds.len() as libc::nfds_t,
- timeout,
- )
- };
-
- Errno::result(res)
-}
-
-feature! {
-#![feature = "signal"]
-/// `ppoll()` allows an application to safely wait until either a file
-/// descriptor becomes ready or until a signal is caught.
-/// ([`poll(2)`](https://man7.org/linux/man-pages/man2/poll.2.html))
-///
-/// `ppoll` behaves like `poll`, but let you specify what signals may interrupt it
-/// with the `sigmask` argument. If you want `ppoll` to block indefinitely,
-/// specify `None` as `timeout` (it is like `timeout = -1` for `poll`).
-/// If `sigmask` is `None`, then no signal mask manipulation is performed,
-/// so in that case `ppoll` differs from `poll` only in the precision of the
-/// timeout argument.
-///
-#[cfg(any(target_os = "android", target_os = "dragonfly", target_os = "freebsd", target_os = "linux"))]
-pub fn ppoll(
- fds: &mut [PollFd],
- timeout: Option<crate::sys::time::TimeSpec>,
- sigmask: Option<crate::sys::signal::SigSet>
- ) -> Result<libc::c_int>
-{
- let timeout = timeout.as_ref().map_or(core::ptr::null(), |r| r.as_ref());
- let sigmask = sigmask.as_ref().map_or(core::ptr::null(), |r| r.as_ref());
- let res = unsafe {
- libc::ppoll(fds.as_mut_ptr() as *mut libc::pollfd,
- fds.len() as libc::nfds_t,
- timeout,
- sigmask)
- };
- Errno::result(res)
-}
-}