SocketAncillary in std::os::unix::net - Rust (original) (raw)
Struct SocketAncillary
pub struct SocketAncillary<'a> { /* private fields */ }
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Available on (Android or Linux) and Unix only.
Expand description
A Unix socket Ancillary data struct.
§Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix:🥅:{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(())
}
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Creates an ancillary data with the given buffer.
§Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix:🥅:SocketAncillary;
let mut ancillary_buffer = [0; 128];
let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]);
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Returns the capacity of the buffer.
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Returns true
if the ancillary data is empty.
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Returns the number of used bytes.
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Returns the iterator of the control messages.
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Is true
if during a recv operation the ancillary was truncated.
§Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix:🥅:{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(())
}
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
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:🥅:{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 buf = [1; 8];
let mut bufs = &mut [IoSlice::new(&buf[..])][..];
sock.send_vectored_with_ancillary(bufs, &mut ancillary)?;
Ok(())
}
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Add credentials to the ancillary data.
The function returns true
if there is enough space in the buffer. If there is not enough space then no credentials will be appended. Technically, that means this operation adds a control message with the level SOL_SOCKET
and type SCM_CREDENTIALS
, SCM_CREDS
, or SCM_CREDS2
.
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
Clears the ancillary data, removing all values.
§Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix:🥅:{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(())
}