1#[cfg(unix)]
2mod_use![unix];
3
4#[cfg(io_uring)]
5mod_use![iour];
6
7#[cfg(windows)]
8mod_use![iocp];
9
10#[cfg(polling)]
11mod_use![poll];
12
13#[cfg(stub)]
14mod_use![stub];
15
16use rustix::net::{RecvFlags, SendFlags};
17
18use crate::sys::prelude::*;
19
20pub struct Connect<S> {
22 pub(crate) fd: S,
23 pub(crate) addr: SockAddr,
24}
25
26pub struct CloseSocket {
28 pub(crate) fd: ManuallyDrop<OwnedFd>,
29}
30
31pub struct Send<T: IoBuf, S> {
37 pub(crate) fd: S,
38 pub(crate) buffer: T,
39 pub(crate) flags: SendFlags,
40}
41
42pub struct SendVectored<T: IoVectoredBuf, S> {
44 pub(crate) fd: S,
45 pub(crate) buffer: T,
46 pub(crate) flags: SendFlags,
47}
48
49pub(crate) struct SendToHeader<S> {
50 pub(crate) fd: S,
51 pub(crate) addr: SockAddr,
52 pub(crate) flags: SendFlags,
53}
54
55pub struct SendTo<T: IoBuf, S> {
57 pub(crate) header: SendToHeader<S>,
58 pub(crate) buffer: T,
59}
60
61pub struct SendToVectored<T: IoVectoredBuf, S> {
63 pub(crate) header: SendToHeader<S>,
64 pub(crate) buffer: T,
65}
66
67pub struct SendMsg<T: IoVectoredBuf, C: IoBuf, S> {
70 pub(crate) fd: S,
71 pub(crate) buffer: T,
72 pub(crate) control: C,
73 pub(crate) addr: Option<SockAddr>,
74 pub(crate) flags: SendFlags,
75}
76
77pub struct Recv<T: IoBufMut, S> {
83 pub(crate) fd: S,
84 pub(crate) buffer: T,
85 pub(crate) flags: RecvFlags,
86}
87
88pub struct RecvVectored<T: IoVectoredBufMut, S> {
90 pub(crate) fd: S,
91 pub(crate) buffer: T,
92 pub(crate) flags: RecvFlags,
93}
94
95pub(crate) struct RecvFromHeader<S> {
96 pub(crate) fd: S,
97 pub(crate) flags: RecvFlags,
98 pub(crate) addr: SockAddrStorage,
99 pub(crate) addr_len: socklen_t,
100}
101
102pub struct RecvFrom<T: IoBufMut, S> {
104 pub(crate) header: RecvFromHeader<S>,
105 pub(crate) buffer: T,
106}
107
108pub struct RecvFromVectored<T: IoVectoredBufMut, S> {
110 pub(crate) header: RecvFromHeader<S>,
111 pub(crate) buffer: T,
112}
113
114pub struct RecvMsg<T: IoVectoredBufMut, C: IoBufMut, S> {
117 pub(crate) header: RecvFromHeader<S>,
118 pub(crate) buffer: T,
119 pub(crate) control: C,
120 pub(crate) control_len: usize,
121}
122
123impl<S> Connect<S> {
124 pub fn new(fd: S, addr: SockAddr) -> Self {
126 Self { fd, addr }
127 }
128}
129
130impl CloseSocket {
131 pub fn new(fd: OwnedFd) -> Self {
133 Self {
134 fd: ManuallyDrop::new(fd),
135 }
136 }
137}
138
139impl<T: IoBuf, S> Send<T, S> {
140 pub fn new(fd: S, buffer: T, flags: SendFlags) -> Self {
142 Self { fd, buffer, flags }
143 }
144}
145
146impl<T: IoBuf, S> IntoInner for Send<T, S> {
147 type Inner = T;
148
149 fn into_inner(self) -> Self::Inner {
150 self.buffer
151 }
152}
153
154impl<T: IoVectoredBuf, S> SendVectored<T, S> {
155 pub fn new(fd: S, buffer: T, flags: SendFlags) -> Self {
157 Self { fd, buffer, flags }
158 }
159}
160
161impl<T: IoVectoredBuf, S> IntoInner for SendVectored<T, S> {
162 type Inner = T;
163
164 fn into_inner(self) -> Self::Inner {
165 self.buffer
166 }
167}
168
169impl<S> SendToHeader<S> {
170 pub fn new(fd: S, addr: SockAddr, flags: SendFlags) -> Self {
171 Self { fd, addr, flags }
172 }
173}
174
175impl<T: IoBuf, S> SendTo<T, S> {
176 pub fn new(fd: S, buffer: T, addr: SockAddr, flags: SendFlags) -> Self {
178 Self {
179 header: SendToHeader::new(fd, addr, flags),
180 buffer,
181 }
182 }
183}
184
185impl<T: IoBuf, S> IntoInner for SendTo<T, S> {
186 type Inner = T;
187
188 fn into_inner(self) -> Self::Inner {
189 self.buffer
190 }
191}
192
193impl<T: IoVectoredBuf, S> SendToVectored<T, S> {
194 pub fn new(fd: S, buffer: T, addr: SockAddr, flags: SendFlags) -> Self {
196 Self {
197 header: SendToHeader::new(fd, addr, flags),
198 buffer,
199 }
200 }
201}
202
203impl<T: IoVectoredBuf, S> IntoInner for SendToVectored<T, S> {
204 type Inner = T;
205
206 fn into_inner(self) -> Self::Inner {
207 self.buffer
208 }
209}
210
211impl<T: IoVectoredBuf, C: IoBuf, S> SendMsg<T, C, S> {
212 pub fn new(fd: S, buffer: T, control: C, addr: Option<SockAddr>, flags: SendFlags) -> Self {
218 assert!(
219 control.buf_len() == 0 || control.buf_ptr().cast::<CmsgHeader>().is_aligned(),
220 "misaligned control message buffer"
221 );
222 Self {
223 fd,
224 buffer,
225 control,
226 addr,
227 flags,
228 }
229 }
230}
231
232impl<T: IoVectoredBuf, C: IoBuf, S> IntoInner for SendMsg<T, C, S> {
233 type Inner = (T, C);
234
235 fn into_inner(self) -> Self::Inner {
236 (self.buffer, self.control)
237 }
238}
239
240impl<T: IoVectoredBufMut, C: IoBufMut, S> RecvMsg<T, C, S> {
241 pub fn new(fd: S, buffer: T, control: C, flags: RecvFlags) -> Self {
248 assert!(
249 control.buf_ptr().cast::<CmsgHeader>().is_aligned(),
250 "misaligned control message buffer"
251 );
252 Self {
253 header: RecvFromHeader::new(fd, flags),
254 buffer,
255 control,
256 control_len: 0,
257 }
258 }
259}
260
261impl<T: IoVectoredBufMut, C: IoBufMut, S> IntoInner for RecvMsg<T, C, S> {
262 type Inner = ((T, C), Option<SockAddr>, usize);
263
264 fn into_inner(self) -> Self::Inner {
265 (
266 (self.buffer, self.control),
267 self.header.into_addr(),
268 self.control_len,
269 )
270 }
271}
272
273impl<T: IoBufMut, S> Recv<T, S> {
274 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
276 Self { fd, buffer, flags }
277 }
278}
279
280impl<T: IoBufMut, S> IntoInner for Recv<T, S> {
281 type Inner = T;
282
283 fn into_inner(self) -> Self::Inner {
284 self.buffer
285 }
286}
287
288impl<T: IoVectoredBufMut, S> RecvVectored<T, S> {
289 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
291 Self { fd, buffer, flags }
292 }
293}
294
295impl<T: IoVectoredBufMut, S> IntoInner for RecvVectored<T, S> {
296 type Inner = T;
297
298 fn into_inner(self) -> Self::Inner {
299 self.buffer
300 }
301}
302
303impl<S> RecvFromHeader<S> {
304 pub fn new(fd: S, flags: RecvFlags) -> Self {
305 let addr = SockAddrStorage::zeroed();
306 let name_len = addr.size_of();
307 Self {
308 fd,
309 addr,
310 flags,
311 addr_len: name_len,
312 }
313 }
314
315 pub fn into_addr(self) -> Option<SockAddr> {
316 (self.addr_len > 0).then(|| unsafe { SockAddr::new(self.addr, self.addr_len) })
317 }
318}
319
320impl<T: IoVectoredBufMut, S> RecvFromVectored<T, S> {
321 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
323 Self {
324 header: RecvFromHeader::new(fd, flags),
325 buffer,
326 }
327 }
328}
329
330impl<T: IoVectoredBufMut, S: AsFd> IntoInner for RecvFromVectored<T, S> {
331 type Inner = (T, Option<SockAddr>);
332
333 fn into_inner(self) -> Self::Inner {
334 let addr = self.header.into_addr();
335 (self.buffer, addr)
336 }
337}
338
339impl<T: IoBufMut, S> RecvFrom<T, S> {
340 pub fn new(fd: S, buffer: T, flags: RecvFlags) -> Self {
342 Self {
343 header: RecvFromHeader::new(fd, flags),
344 buffer,
345 }
346 }
347}
348
349impl<T: IoBufMut, S> IntoInner for RecvFrom<T, S> {
350 type Inner = (T, Option<SockAddr>);
351
352 fn into_inner(self) -> Self::Inner {
353 (self.buffer, self.header.into_addr())
354 }
355}