Struct std::os::unix::net::SocketAncillary
pub struct SocketAncillary<'a> { /* fields omitted */ }
A Unix socket Ancillary data struct.
Example
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixStream, SocketAncillary, AncillaryData}; use std::io::IoSliceMut; fn main() -> std::io::Result<()> { let sock = UnixStream::connect("/tmp/sock")?; let mut fds = [0; 8]; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); let mut buf = [1; 8]; let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..]; sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?; for ancillary_result in ancillary.messages() { if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() { for fd in scm_rights { println!("receive file descriptor: {}", fd); } } } Ok(()) }
Implementations
impl<'a> SocketAncillary<'a>
pub fn new(buffer: &'a mut [u8]) -> Self
Create an ancillary data with the given buffer.
Example
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::SocketAncillary; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]);
pub fn capacity(&self) -> usize
Returns the capacity of the buffer.
pub fn is_empty(&self) -> bool
Returns true
if the ancillary data is empty.
pub fn len(&self) -> usize
Returns the number of used bytes.
pub fn messages(&self) -> Messages<'_>
impl<'a> Iterator for Messages<'a> type Item = Result<AncillaryData<'a>, AncillaryError>;
Returns the iterator of the control messages.
pub fn truncated(&self) -> bool
Is true
if during a recv operation the ancillary was truncated.
Example
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixStream, SocketAncillary}; use std::io::IoSliceMut; fn main() -> std::io::Result<()> { let sock = UnixStream::connect("/tmp/sock")?; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); let mut buf = [1; 8]; let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..]; sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?; println!("Is truncated: {}", ancillary.truncated()); Ok(()) }
pub fn add_fds(&mut self, fds: &[RawFd]) -> bool
Add file descriptors to the ancillary data.
The function returns true
if there was enough space in the buffer. If there was not enough space then no file descriptors was appended. Technically, that means this operation adds a control message with the level SOL_SOCKET
and type SCM_RIGHTS
.
Example
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixStream, SocketAncillary}; use std::os::unix::io::AsRawFd; use std::io::IoSlice; fn main() -> std::io::Result<()> { let sock = UnixStream::connect("/tmp/sock")?; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); ancillary.add_fds(&[sock.as_raw_fd()][..]); let mut buf = [1; 8]; let mut bufs = &mut [IoSlice::new(&mut buf[..])][..]; sock.send_vectored_with_ancillary(bufs, &mut ancillary)?; Ok(()) }
pub fn add_creds(&mut self, creds: &[SocketCred]) -> bool
Add credentials to the ancillary data.
The function returns true
if there was enough space in the buffer. If there was not enough space then no credentials was appended. Technically, that means this operation adds a control message with the level SOL_SOCKET
and type SCM_CREDENTIALS
or SCM_CREDS
.
pub fn clear(&mut self)
Clears the ancillary data, removing all values.
Example
#![feature(unix_socket_ancillary_data)] use std::os::unix::net::{UnixStream, SocketAncillary, AncillaryData}; use std::io::IoSliceMut; fn main() -> std::io::Result<()> { let sock = UnixStream::connect("/tmp/sock")?; let mut fds1 = [0; 8]; let mut fds2 = [0; 8]; let mut ancillary_buffer = [0; 128]; let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); let mut buf = [1; 8]; let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..]; sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?; for ancillary_result in ancillary.messages() { if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() { for fd in scm_rights { println!("receive file descriptor: {}", fd); } } } ancillary.clear(); sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?; for ancillary_result in ancillary.messages() { if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() { for fd in scm_rights { println!("receive file descriptor: {}", fd); } } } Ok(()) }
Trait Implementations
impl<'a> Debug for SocketAncillary<'a>
Auto Trait Implementations
impl<'a> RefUnwindSafe for SocketAncillary<'a>
impl<'a> Send for SocketAncillary<'a>
impl<'a> Sync for SocketAncillary<'a>
impl<'a> Unpin for SocketAncillary<'a>
impl<'a> !UnwindSafe for SocketAncillary<'a>
Blanket Implementations
impl<T> From<T> for T
pub fn from(t: T) -> T
Performs the conversion.
pub fn into(self) -> U
Performs the conversion.
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
Performs the conversion.
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
Performs the conversion.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/os/unix/net/struct.SocketAncillary.html