pub struct UnixSeqpacketConn { /* private fields */ }Expand description
A non-blocking unix domain sequential-packet connection.
Differs from uds_fork::UnixSeqpacketConn
in that all operations that send or receive data will return an Error of
kind ErrorKind::WouldBlock instead of blocking.
This is done by creating the socket as non-blocking, and not by passing
MSG_DONTWAIT. If creating this type from a raw file descriptor, ensure
the fd is set to nonblocking before using it through this type.
§Examples
Sending or receiving when it would block a normal socket:
use uds_fork::nonblocking::UnixSeqpacketConn;
use std::io::ErrorKind;
let (a, b) = UnixSeqpacketConn::pair().expect("create nonblocking seqpacket pair");
// trying to receive when there are no packets waiting
assert_eq!(a.recv(&mut[0]).unwrap_err().kind(), ErrorKind::WouldBlock);
// trying to send when the OS buffer for the connection is full
loop {
if let Err(error) = a.send(&[0u8; 1000]) {
assert_eq!(error.kind(), ErrorKind::WouldBlock);
break;
}
}Implementations§
Source§impl NonblockingUnixSeqpacketConn
impl NonblockingUnixSeqpacketConn
Sourcepub fn connect<P: AsRef<Path>>(path: P) -> Result<Self, Error>
pub fn connect<P: AsRef<Path>>(path: P) -> Result<Self, Error>
Connects to an unix seqpacket server listening at path.
This is a wrapper around connect_unix_addr()
for convenience and compatibility with std.
Sourcepub fn connect_unix_addr(addr: &UnixSocketAddr) -> Result<Self, Error>
pub fn connect_unix_addr(addr: &UnixSocketAddr) -> Result<Self, Error>
Connects to an unix seqpacket server listening at addr.
Sourcepub fn connect_from_to_unix_addr(
from: &UnixSocketAddr,
to: &UnixSocketAddr,
) -> Result<Self, Error>
pub fn connect_from_to_unix_addr( from: &UnixSocketAddr, to: &UnixSocketAddr, ) -> Result<Self, Error>
Binds to an address before connecting to a listening seqpacket socket.
Sourcepub fn pair() -> Result<(Self, Self), Error>
pub fn pair() -> Result<(Self, Self), Error>
Creates a pair of nonblocking unix-domain seqpacket conneections connected to each other.
§Examples
let (a, b) = uds_fork::nonblocking::UnixSeqpacketConn::pair().unwrap();
assert!(a.local_unix_addr().unwrap().is_unnamed());
assert!(b.local_unix_addr().unwrap().is_unnamed());
assert_eq!(b.recv(&mut[0; 20]).unwrap_err().kind(), std::io::ErrorKind::WouldBlock);
a.send(b"hello").unwrap();
assert_eq!(b.recv(&mut[0; 20]).unwrap(), 5);Sourcepub fn local_unix_addr(&self) -> Result<UnixSocketAddr, Error>
pub fn local_unix_addr(&self) -> Result<UnixSocketAddr, Error>
Returns the address of this side of the connection.
Sourcepub fn peer_unix_addr(&self) -> Result<UnixSocketAddr, Error>
pub fn peer_unix_addr(&self) -> Result<UnixSocketAddr, Error>
Returns the address of the other side of the connection.
Sourcepub fn initial_peer_credentials(&self) -> Result<ConnCredentials, Error>
pub fn initial_peer_credentials(&self) -> Result<ConnCredentials, Error>
Returns information about the process of the peer when the connection was established.
See documentation of the returned type for details.
Sourcepub fn initial_peer_selinux_context(
&self,
buf: &mut [u8],
) -> Result<usize, Error>
pub fn initial_peer_selinux_context( &self, buf: &mut [u8], ) -> Result<usize, Error>
Returns the SELinux security context of the process that created the other end of this connection.
Will return an error on other operating systems than Linux or Android,
and also if running inside kubernetes.
On success the number of bytes used is returned. (like Read)
The default security context is unconfined, without any trailing NUL.
A buffor of 50 bytes is probably always big enough.
pub fn send_flags(&self, packet: &[u8], flags: i32) -> Result<usize, Error>
Sourcepub fn send_vectored(&self, slices: &[IoSlice<'_>]) -> Result<usize, Error>
pub fn send_vectored(&self, slices: &[IoSlice<'_>]) -> Result<usize, Error>
Sends a packet assembled from multiple byte slices.
Sourcepub fn recv_vectored(
&self,
buffers: &mut [IoSliceMut<'_>],
) -> Result<(usize, bool), Error>
pub fn recv_vectored( &self, buffers: &mut [IoSliceMut<'_>], ) -> Result<(usize, bool), Error>
Reads a packet into multiple buffers.
The returned bool indicates whether the packet was truncated due to
too short buffers.
Sourcepub fn send_fds(&self, bytes: &[u8], fds: Vec<OwnedFd>) -> Result<usize, Error>
pub fn send_fds(&self, bytes: &[u8], fds: Vec<OwnedFd>) -> Result<usize, Error>
Sends a packet with associated file descriptors.
Sourcepub fn recv_fds(
&self,
byte_buffer: &mut [u8],
fd_buffer: &mut Vec<OwnedFd>,
) -> Result<(usize, bool, usize), Error>
pub fn recv_fds( &self, byte_buffer: &mut [u8], fd_buffer: &mut Vec<OwnedFd>, ) -> Result<(usize, bool, usize), Error>
Receives a packet and associated file descriptors.
Sourcepub fn peek(&self, buffer: &mut [u8]) -> Result<usize, Error>
pub fn peek(&self, buffer: &mut [u8]) -> Result<usize, Error>
Receives a packet without removing it from the incoming queue.
§Examples
let (a, b) = uds_fork::nonblocking::UnixSeqpacketConn::pair().unwrap();
let mut buf = [0u8; 10];
assert_eq!(b.peek(&mut buf).unwrap_err().kind(), WouldBlock);
a.send(b"hello").unwrap();
assert_eq!(b.peek(&mut buf).unwrap(), 5);
assert_eq!(&buf[..5], b"hello");
assert_eq!(b.recv(&mut buf).unwrap(), 5);
assert_eq!(&buf[..5], b"hello");
assert_eq!(b.peek(&mut buf).unwrap_err().kind(), WouldBlock);Sourcepub fn peek_vectored(
&self,
buffers: &mut [IoSliceMut<'_>],
) -> Result<(usize, bool), Error>
pub fn peek_vectored( &self, buffers: &mut [IoSliceMut<'_>], ) -> Result<(usize, bool), Error>
Receives a packet without removing it from the incoming queue.
The returned bool indicates whether the packet was truncated due to
the combined buffers being too small.
Sourcepub fn take_error(&self) -> Result<Option<Error>, Error>
pub fn take_error(&self) -> Result<Option<Error>, Error>
Returns the value of the SO_ERROR option.
This might only provide errors generated from nonblocking connect()s,
which this library doesn’t support. It is therefore unlikely to be
useful, but is provided for parity with mios UnixStream.
§Examples
let (a, _b) = uds_fork::nonblocking::UnixSeqpacketConn::pair().unwrap();
assert!(a.recv(&mut[0u8; 1024]).is_err());
assert!(a.take_error().unwrap().is_none());Sourcepub fn try_clone(&self) -> Result<Self, Error>
pub fn try_clone(&self) -> Result<Self, Error>
Creates a new file descriptor also pointing to this side of this connection.
§Examples
let (a1, b) = UnixSeqpacketConn::pair().unwrap();
b.send(b"first come first serve").unwrap();
let a2 = a1.try_clone().unwrap();
a2.recv(&mut[0u8; 10]).unwrap();
assert_eq!(a1.recv(&mut[0u8; 10]).unwrap_err().kind(), ErrorKind::WouldBlock);
b.send(b"more").unwrap();
a1.recv(&mut[0u8; 10]).unwrap();
assert_eq!(a2.recv(&mut[0u8; 10]).unwrap_err().kind(), ErrorKind::WouldBlock);Trait Implementations§
Source§impl AsFd for NonblockingUnixSeqpacketConn
impl AsFd for NonblockingUnixSeqpacketConn
Source§fn as_fd(&self) -> BorrowedFd<'_>
fn as_fd(&self) -> BorrowedFd<'_>
Source§impl Debug for NonblockingUnixSeqpacketConn
impl Debug for NonblockingUnixSeqpacketConn
Source§impl From<NonblockingUnixSeqpacketConn> for OwnedFd
impl From<NonblockingUnixSeqpacketConn> for OwnedFd
Source§fn from(value: NonblockingUnixSeqpacketConn) -> Self
fn from(value: NonblockingUnixSeqpacketConn) -> Self
Source§impl FromRawFd for NonblockingUnixSeqpacketConn
impl FromRawFd for NonblockingUnixSeqpacketConn
Source§unsafe fn from_raw_fd(fd: RawFd) -> Self
unsafe fn from_raw_fd(fd: RawFd) -> Self
Self from the given raw file
descriptor. Read more