1#[cfg(windows)]
6use crate::os::windows::{
7 AsHandleOrSocket, AsRawHandleOrSocket, AsRawReadWriteHandleOrSocket, AsReadWriteHandleOrSocket,
8 BorrowedHandleOrSocket, FromRawHandleOrSocket, IntoRawHandleOrSocket, OwnedHandleOrSocket,
9 RawHandleOrSocket,
10};
11#[cfg(not(windows))]
12use {
13 crate::os::rustix::{AsRawFd, AsRawReadWriteFd, AsReadWriteFd, FromRawFd, IntoRawFd, RawFd},
14 io_lifetimes::{AsFd, BorrowedFd, OwnedFd},
15};
16
17#[cfg(not(windows))]
19pub type BorrowedGrip<'a> = BorrowedFd<'a>;
20#[cfg(not(windows))]
22pub type OwnedGrip = OwnedFd;
23
24#[cfg(windows)]
26pub type BorrowedGrip<'a> = BorrowedHandleOrSocket<'a>;
27#[cfg(windows)]
29pub type OwnedGrip = OwnedHandleOrSocket;
30
31#[cfg(not(windows))]
33pub trait AsGrip: AsFd {
34 fn as_grip(&self) -> BorrowedGrip<'_>;
36}
37
38#[cfg(windows)]
40pub trait AsGrip: AsHandleOrSocket {
41 fn as_grip(&self) -> BorrowedGrip<'_>;
43}
44
45#[cfg(not(windows))]
48pub trait AsReadWriteGrip: AsReadWriteFd {
49 fn as_read_grip(&self) -> BorrowedGrip<'_>;
54
55 fn as_write_grip(&self) -> BorrowedGrip<'_>;
60}
61
62#[cfg(windows)]
65pub trait AsReadWriteGrip: AsReadWriteHandleOrSocket {
66 fn as_read_grip(&self) -> BorrowedGrip<'_>;
71
72 fn as_write_grip(&self) -> BorrowedGrip<'_>;
77}
78
79#[cfg(not(windows))]
82pub trait IntoGrip: Into<OwnedFd> {
83 fn into_grip(self) -> OwnedGrip;
85}
86
87#[cfg(windows)]
90pub trait IntoGrip: Into<OwnedHandleOrSocket> {
91 fn into_grip(self) -> OwnedGrip;
93}
94
95#[cfg(not(windows))]
98pub trait FromGrip: From<OwnedFd> {
99 fn from_grip(owned_grip: OwnedGrip) -> Self;
101}
102
103#[cfg(windows)]
106pub trait FromGrip: From<OwnedHandleOrSocket> {
107 fn from_grip(owned_grip: OwnedGrip) -> Self;
109}
110
111#[cfg(not(windows))]
112impl<T: AsFd> AsGrip for T {
113 #[inline]
114 fn as_grip(&self) -> BorrowedGrip<'_> {
115 self.as_fd()
116 }
117}
118
119#[cfg(windows)]
120impl<T: AsHandleOrSocket> AsGrip for T {
121 #[inline]
122 fn as_grip(&self) -> BorrowedGrip<'_> {
123 self.as_handle_or_socket()
124 }
125}
126
127#[cfg(not(windows))]
128impl<T: AsReadWriteFd> AsReadWriteGrip for T {
129 #[inline]
130 fn as_read_grip(&self) -> BorrowedGrip<'_> {
131 self.as_read_fd()
132 }
133
134 #[inline]
135 fn as_write_grip(&self) -> BorrowedGrip<'_> {
136 self.as_write_fd()
137 }
138}
139
140#[cfg(windows)]
141impl<T: AsReadWriteHandleOrSocket> AsReadWriteGrip for T {
142 #[inline]
143 fn as_read_grip(&self) -> BorrowedGrip<'_> {
144 self.as_read_handle_or_socket()
145 }
146
147 #[inline]
148 fn as_write_grip(&self) -> BorrowedGrip<'_> {
149 self.as_write_handle_or_socket()
150 }
151}
152
153#[cfg(not(windows))]
154impl<T: Into<OwnedFd>> IntoGrip for T {
155 #[inline]
156 fn into_grip(self) -> OwnedGrip {
157 self.into()
158 }
159}
160
161#[cfg(windows)]
162impl<T: Into<OwnedHandleOrSocket>> IntoGrip for T {
163 #[inline]
164 fn into_grip(self) -> OwnedGrip {
165 self.into()
166 }
167}
168
169#[cfg(not(windows))]
170impl<T: From<OwnedFd>> FromGrip for T {
171 #[inline]
172 fn from_grip(owned_grip: OwnedGrip) -> Self {
173 Self::from(owned_grip)
174 }
175}
176
177#[cfg(windows)]
178impl<T: From<OwnedHandleOrSocket>> FromGrip for T {
179 #[inline]
180 fn from_grip(owned_grip: OwnedGrip) -> Self {
181 Self::from(owned_grip)
182 }
183}
184
185#[cfg(not(windows))]
187pub type RawGrip = RawFd;
188
189#[cfg(windows)]
191pub type RawGrip = RawHandleOrSocket;
192
193#[cfg(not(windows))]
195pub trait AsRawGrip: AsRawFd {
196 fn as_raw_grip(&self) -> RawGrip;
198}
199
200#[cfg(windows)]
202pub trait AsRawGrip: AsRawHandleOrSocket {
203 fn as_raw_grip(&self) -> RawGrip;
205}
206
207#[cfg(not(windows))]
210pub trait AsRawReadWriteGrip: AsRawReadWriteFd {
211 fn as_raw_read_grip(&self) -> RawGrip;
216
217 fn as_raw_write_grip(&self) -> RawGrip;
222}
223
224#[cfg(windows)]
227pub trait AsRawReadWriteGrip: AsRawReadWriteHandleOrSocket {
228 fn as_raw_read_grip(&self) -> RawGrip;
233
234 fn as_raw_write_grip(&self) -> RawGrip;
239}
240
241#[cfg(not(windows))]
244pub trait IntoRawGrip: IntoRawFd {
245 fn into_raw_grip(self) -> RawGrip;
247}
248
249#[cfg(windows)]
252pub trait IntoRawGrip: IntoRawHandleOrSocket {
253 fn into_raw_grip(self) -> RawGrip;
255}
256
257#[cfg(not(windows))]
260pub trait FromRawGrip: FromRawFd {
261 unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self;
267}
268
269#[cfg(windows)]
272pub trait FromRawGrip: FromRawHandleOrSocket {
273 unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self;
279}
280
281#[cfg(not(windows))]
282impl<T: AsRawFd> AsRawGrip for T {
283 #[inline]
284 fn as_raw_grip(&self) -> RawGrip {
285 self.as_raw_fd()
286 }
287}
288
289#[cfg(windows)]
290impl<T: AsRawHandleOrSocket> AsRawGrip for T {
291 #[inline]
292 fn as_raw_grip(&self) -> RawGrip {
293 self.as_raw_handle_or_socket()
294 }
295}
296
297#[cfg(not(windows))]
298impl<T: AsRawReadWriteFd> AsRawReadWriteGrip for T {
299 #[inline]
300 fn as_raw_read_grip(&self) -> RawGrip {
301 self.as_raw_read_fd()
302 }
303
304 #[inline]
305 fn as_raw_write_grip(&self) -> RawGrip {
306 self.as_raw_write_fd()
307 }
308}
309
310#[cfg(windows)]
311impl<T: AsRawReadWriteHandleOrSocket> AsRawReadWriteGrip for T {
312 #[inline]
313 fn as_raw_read_grip(&self) -> RawGrip {
314 self.as_raw_read_handle_or_socket()
315 }
316
317 #[inline]
318 fn as_raw_write_grip(&self) -> RawGrip {
319 self.as_raw_write_handle_or_socket()
320 }
321}
322
323#[cfg(not(windows))]
324impl<T: IntoRawFd> IntoRawGrip for T {
325 #[inline]
326 fn into_raw_grip(self) -> RawGrip {
327 self.into_raw_fd()
328 }
329}
330
331#[cfg(windows)]
332impl<T: IntoRawHandleOrSocket> IntoRawGrip for T {
333 #[inline]
334 fn into_raw_grip(self) -> RawGrip {
335 self.into_raw_handle_or_socket()
336 }
337}
338
339#[cfg(not(windows))]
340impl<T: FromRawFd> FromRawGrip for T {
341 #[inline]
342 unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self {
343 Self::from_raw_fd(raw_grip)
344 }
345}
346
347#[cfg(windows)]
348impl<T: FromRawHandleOrSocket> FromRawGrip for T {
349 #[inline]
350 unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self {
351 Self::from_raw_handle_or_socket(raw_grip)
352 }
353}
354
355#[cfg(not(windows))]
364#[must_use]
365#[inline]
366pub unsafe fn borrow_raw<'a>(grip: RawGrip) -> BorrowedGrip<'a> {
367 BorrowedFd::borrow_raw(grip)
368}
369
370#[cfg(windows)]
381#[must_use]
382#[inline]
383pub unsafe fn borrow_raw<'a>(grip: RawGrip) -> BorrowedGrip<'a> {
384 BorrowedHandleOrSocket::borrow_raw(grip)
385}