-
Notifications
You must be signed in to change notification settings - Fork 122
/
accept.rs
53 lines (48 loc) · 1.55 KB
/
accept.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use crate::driver::op::Completable;
use crate::driver::{Op, SharedFd, Socket};
use std::net::SocketAddr;
use std::{boxed::Box, io};
pub(crate) struct Accept {
fd: SharedFd,
pub(crate) socketaddr: Box<(libc::sockaddr_storage, libc::socklen_t)>,
}
impl Op<Accept> {
pub(crate) fn accept(fd: &SharedFd) -> io::Result<Op<Accept>> {
use io_uring::{opcode, types};
let socketaddr = Box::new((
unsafe { std::mem::zeroed() },
std::mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t,
));
Op::submit_with(
Accept {
fd: fd.clone(),
socketaddr,
},
|accept| {
opcode::Accept::new(
types::Fd(accept.fd.raw_fd()),
&mut accept.socketaddr.0 as *mut _ as *mut _,
&mut accept.socketaddr.1,
)
.flags(libc::O_CLOEXEC)
.build()
},
)
}
}
impl Completable for Accept {
type Output = io::Result<(Socket, Option<SocketAddr>)>;
fn complete(self, result: io::Result<u32>, _flags: u32) -> Self::Output {
let fd = result?;
let fd = SharedFd::new(fd as i32);
let socket = Socket { fd };
let (_, addr) = unsafe {
socket2::SockAddr::init(move |addr_storage, len| {
*addr_storage = self.socketaddr.0.to_owned();
*len = self.socketaddr.1;
Ok(())
})?
};
Ok((socket, addr.as_socket()))
}
}