use core::mem::MaybeUninit;
use sc::syscall;
use crate::platform::{Fd, SocketAddressInet, SocketAddressUnix, SocketArgUnix, SocketFlags};
use crate::Result;
#[inline]
pub fn accept_unix(sock_fd: Fd, flags: SocketFlags) -> Result<(Fd, SocketArgUnix)> {
let mut addr = MaybeUninit::zeroed();
let mut addr_len = core::mem::size_of::<SocketAddressUnix>();
let res = unsafe {
syscall!(
ACCEPT4,
sock_fd.0,
core::ptr::addr_of_mut!(addr),
core::ptr::addr_of_mut!(addr_len),
flags.0
)
};
let fd = Fd::coerce_from_register(res, "`ACCEPT4` syscall failed")?;
unsafe {
Ok((
fd,
SocketArgUnix {
addr: addr.assume_init(),
addr_len,
},
))
}
}
#[inline]
pub fn accept_inet(sock_fd: Fd, flags: SocketFlags) -> Result<(Fd, SocketAddressInet)> {
let mut addr = MaybeUninit::zeroed();
let mut addr_len = core::mem::size_of::<SocketAddressUnix>();
let res = unsafe {
syscall!(
ACCEPT4,
sock_fd.0,
core::ptr::addr_of_mut!(addr),
core::ptr::addr_of_mut!(addr_len),
flags.0
)
};
let fd = Fd::coerce_from_register(res, "`ACCEPT4` syscall failed")?;
unsafe { Ok((fd, addr.assume_init())) }
}