Skip to content

Commit

Permalink
Make msghdr.msg_name optional
Browse files Browse the repository at this point in the history
sendmsg can be used on connected sockets without
msg_name.
  • Loading branch information
redbaron committed Feb 5, 2023
1 parent 8929e95 commit b8094f3
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 10 deletions.
22 changes: 16 additions & 6 deletions src/io/send_to.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,39 @@ pub(crate) struct SendTo<T> {
#[allow(dead_code)]
io_slices: Vec<IoSlice<'static>>,
#[allow(dead_code)]
socket_addr: Box<SockAddr>,
socket_addr: Option<Box<SockAddr>>,
pub(crate) msghdr: Box<libc::msghdr>,
}

impl<T: BoundedBuf> Op<SendTo<T>> {
pub(crate) fn send_to(
fd: &SharedFd,
buf: T,
socket_addr: SocketAddr,
socket_addr: Option<SocketAddr>,
) -> io::Result<Op<SendTo<T>>> {
use io_uring::{opcode, types};

let io_slices = vec![IoSlice::new(unsafe {
std::slice::from_raw_parts(buf.stable_ptr(), buf.bytes_init())
})];

let socket_addr = Box::new(SockAddr::from(socket_addr));

let mut msghdr: Box<libc::msghdr> = Box::new(unsafe { std::mem::zeroed() });
msghdr.msg_iov = io_slices.as_ptr() as *mut _;
msghdr.msg_iovlen = io_slices.len() as _;
msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void;
msghdr.msg_namelen = socket_addr.len();

let socket_addr = match socket_addr {
Some(ref _socket_addr) => {
let socket_addr = Some(Box::new(SockAddr::from(_socket_addr)));
msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void;
msghdr.msg_namelen = socket_addr.len();
socket_addr
}
None => {
msghdr.msg_name = std::ptr::null_mut();
msghdr.msg_namelen = 0;
None
}
};

CONTEXT.with(|x| {
x.handle().expect("Not in a runtime context").submit_op(
Expand Down
20 changes: 16 additions & 4 deletions src/io/sendmsg_zc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ pub(crate) struct SendMsgZc<T, U> {
#[allow(dead_code)]
io_bufs: Vec<T>,
#[allow(dead_code)]
socket_addr: Box<SockAddr>,
socket_addr: Option<Box<SockAddr>>,
msg_control: Option<U>,
msghdr: libc::msghdr,

Expand All @@ -25,13 +25,11 @@ impl<T: BoundedBuf, U: BoundedBuf> Op<SendMsgZc<T, U>, MultiCQEFuture> {
pub(crate) fn sendmsg_zc(
fd: &SharedFd,
io_bufs: Vec<T>,
socket_addr: SocketAddr,
socket_addr: Option<SocketAddr>,
msg_control: Option<U>,
) -> io::Result<Self> {
use io_uring::{opcode, types};

let socket_addr = Box::new(SockAddr::from(socket_addr));

let mut msghdr: libc::msghdr = unsafe { std::mem::zeroed() };

let mut io_slices: Vec<IoSlice> = Vec::with_capacity(io_bufs.len());
Expand All @@ -47,6 +45,20 @@ impl<T: BoundedBuf, U: BoundedBuf> Op<SendMsgZc<T, U>, MultiCQEFuture> {
msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void;
msghdr.msg_namelen = socket_addr.len();

let socket_addr = match socket_addr {
Some(ref _socket_addr) => {
let socket_addr = Some(Box::new(SockAddr::from(_socket_addr)));
msghdr.msg_name = socket_addr.as_ptr() as *mut libc::c_void;
msghdr.msg_namelen = socket_addr.len();
socket_addr
}
None => {
msghdr.msg_name = std::ptr::null_mut();
msghdr.msg_namelen = 0;
None
}
};

match msg_control {
Some(ref _msg_control) => {
msghdr.msg_control = _msg_control.stable_ptr() as *mut _;
Expand Down

0 comments on commit b8094f3

Please sign in to comment.