Coverage Report

Created: 2025-07-12 06:48

/rust/registry/src/index.crates.io-6f17d22bba15001f/io-lifetimes-2.0.4/src/raw.rs
Line
Count
Source (jump to first uncovered line)
1
//! Portability abstractions over `Raw*`.
2
//!
3
//! On Unix, "everything is a file descriptor". On Windows, file/pipe/process
4
//! handles are distinct from socket descriptors. This file provides a minimal
5
//! layer of portability over this difference.
6
7
#[cfg(target_os = "hermit")]
8
use std::os::hermit::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
9
#[cfg(unix)]
10
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
11
#[cfg(target_os = "wasi")]
12
use std::os::wasi::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
13
#[cfg(windows)]
14
use std::os::windows::io::{
15
    AsRawHandle, AsRawSocket, FromRawHandle, FromRawSocket, IntoRawHandle, IntoRawSocket,
16
    RawHandle, RawSocket,
17
};
18
19
/// A raw filelike object.
20
///
21
/// This is a portability abstraction over Unix-like [`RawFd`] and
22
/// Windows' `RawHandle`.
23
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
24
pub type RawFilelike = RawFd;
25
26
/// A raw filelike object.
27
///
28
/// This is a portability abstraction over Unix-like `RawFd` and
29
/// Windows' [`RawHandle`].
30
#[cfg(windows)]
31
pub type RawFilelike = RawHandle;
32
33
/// A raw socketlike object.
34
///
35
/// This is a portability abstraction over Unix-like [`RawFd`] and
36
/// Windows' `RawSocket`.
37
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
38
pub type RawSocketlike = RawFd;
39
40
/// A raw socketlike object.
41
///
42
/// This is a portability abstraction over Unix-like `RawFd` and
43
/// Windows' [`RawSocket`].
44
#[cfg(windows)]
45
pub type RawSocketlike = RawSocket;
46
47
/// A portable trait to obtain the raw value of an underlying filelike object.
48
///
49
/// This is a portability abstraction over Unix-like [`AsRawFd`] and Windows'
50
/// `AsRawHandle`.
51
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
52
pub trait AsRawFilelike: AsRawFd {
53
    /// Returns the raw value.
54
    fn as_raw_filelike(&self) -> RawFilelike;
55
}
56
57
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
58
impl<T: AsRawFd> AsRawFilelike for T {
59
    #[inline]
60
0
    fn as_raw_filelike(&self) -> RawFilelike {
61
0
        self.as_raw_fd()
62
0
    }
63
}
64
65
/// This is a portability abstraction over Unix-like `AsRawFd` and Windows'
66
/// [`AsRawHandle`].
67
#[cfg(windows)]
68
pub trait AsRawFilelike: AsRawHandle {
69
    /// Returns the raw value.
70
    fn as_raw_filelike(&self) -> RawFilelike;
71
}
72
73
#[cfg(windows)]
74
impl<T: AsRawHandle> AsRawFilelike for T {
75
    #[inline]
76
    fn as_raw_filelike(&self) -> RawFilelike {
77
        self.as_raw_handle()
78
    }
79
}
80
81
/// This is a portability abstraction over Unix-like [`AsRawFd`] and Windows'
82
/// `AsRawSocket`.
83
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
84
pub trait AsRawSocketlike: AsRawFd {
85
    /// Returns the raw value.
86
    fn as_raw_socketlike(&self) -> RawSocketlike;
87
}
88
89
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
90
impl<T: AsRawFd> AsRawSocketlike for T {
91
    #[inline]
92
    fn as_raw_socketlike(&self) -> RawSocketlike {
93
        self.as_raw_fd()
94
    }
95
}
96
97
/// This is a portability abstraction over Unix-like `AsRawFd` and Windows'
98
/// [`AsRawSocket`].
99
#[cfg(windows)]
100
pub trait AsRawSocketlike: AsRawSocket {
101
    /// Returns the raw value.
102
    fn as_raw_socketlike(&self) -> RawSocketlike;
103
}
104
105
#[cfg(windows)]
106
impl<T: AsRawSocket> AsRawSocketlike for T {
107
    #[inline]
108
    fn as_raw_socketlike(&self) -> RawSocketlike {
109
        self.as_raw_socket()
110
    }
111
}
112
113
/// This is a portability abstraction over Unix-like [`IntoRawFd`] and Windows'
114
/// `IntoRawHandle`.
115
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
116
pub trait IntoRawFilelike: IntoRawFd {
117
    /// Returns the raw value.
118
    fn into_raw_filelike(self) -> RawFilelike;
119
}
120
121
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
122
impl<T: IntoRawFd> IntoRawFilelike for T {
123
    #[inline]
124
0
    fn into_raw_filelike(self) -> RawFilelike {
125
0
        self.into_raw_fd()
126
0
    }
127
}
128
129
/// This is a portability abstraction over Unix-like `IntoRawFd` and Windows'
130
/// [`IntoRawHandle`].
131
#[cfg(windows)]
132
pub trait IntoRawFilelike: IntoRawHandle {
133
    /// Returns the raw value.
134
    fn into_raw_filelike(self) -> RawFilelike;
135
}
136
137
#[cfg(windows)]
138
impl<T: IntoRawHandle> IntoRawFilelike for T {
139
    #[inline]
140
    fn into_raw_filelike(self) -> RawFilelike {
141
        self.into_raw_handle()
142
    }
143
}
144
145
/// This is a portability abstraction over Unix-like [`IntoRawFd`] and Windows'
146
/// `IntoRawSocket`.
147
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
148
pub trait IntoRawSocketlike: IntoRawFd {
149
    /// Returns the raw value.
150
    fn into_raw_socketlike(self) -> RawSocketlike;
151
}
152
153
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
154
impl<T: IntoRawFd> IntoRawSocketlike for T {
155
    #[inline]
156
    fn into_raw_socketlike(self) -> RawSocketlike {
157
        self.into_raw_fd()
158
    }
159
}
160
161
/// This is a portability abstraction over Unix-like `IntoRawFd` and Windows'
162
/// [`IntoRawSocket`].
163
#[cfg(windows)]
164
pub trait IntoRawSocketlike: IntoRawSocket {
165
    /// Returns the raw value.
166
    fn into_raw_socketlike(self) -> RawSocketlike;
167
}
168
169
#[cfg(windows)]
170
impl<T: IntoRawSocket> IntoRawSocketlike for T {
171
    #[inline]
172
    fn into_raw_socketlike(self) -> RawSocketlike {
173
        self.into_raw_socket()
174
    }
175
}
176
177
/// This is a portability abstraction over Unix-like [`FromRawFd`] and Windows'
178
/// `FromRawHandle`.
179
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
180
pub trait FromRawFilelike: FromRawFd {
181
    /// Constructs `Self` from the raw value.
182
    ///
183
    /// # Safety
184
    ///
185
    /// This is `unsafe` for the same reason as [`from_raw_fd`] and
186
    /// [`from_raw_handle`].
187
    ///
188
    /// [`from_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.from_raw_fd
189
    /// [`from_raw_handle`]: https://doc.rust-lang.org/stable/std/os/windows/io/trait.FromRawHandle.html#tymethod.from_raw_handle
190
    unsafe fn from_raw_filelike(raw: RawFilelike) -> Self;
191
}
192
193
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
194
impl<T: FromRawFd> FromRawFilelike for T {
195
    #[inline]
196
0
    unsafe fn from_raw_filelike(raw: RawFilelike) -> Self {
197
0
        Self::from_raw_fd(raw)
198
0
    }
199
}
200
201
/// This is a portability abstraction over Unix-like `FromRawFd` and Windows'
202
/// [`FromRawHandle`].
203
#[cfg(windows)]
204
pub trait FromRawFilelike: FromRawHandle {
205
    /// Constructs `Self` from the raw value.
206
    unsafe fn from_raw_filelike(raw: RawFilelike) -> Self;
207
}
208
209
#[cfg(windows)]
210
impl<T: FromRawHandle> FromRawFilelike for T {
211
    #[inline]
212
    unsafe fn from_raw_filelike(raw: RawFilelike) -> Self {
213
        Self::from_raw_handle(raw)
214
    }
215
}
216
217
/// This is a portability abstraction over Unix-like [`FromRawFd`] and Windows'
218
/// `FromRawSocket`.
219
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
220
pub trait FromRawSocketlike: FromRawFd {
221
    /// Constructs `Self` from the raw value.
222
    ///
223
    /// # Safety
224
    ///
225
    /// This is `unsafe` for the same reason as [`from_raw_fd`] and
226
    /// [`from_raw_socket`].
227
    ///
228
    /// [`from_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.from_raw_fd
229
    /// [`from_raw_socket`]: https://doc.rust-lang.org/stable/std/os/windows/io/trait.FromRawSocket.html#tymethod.from_raw_socket
230
    unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self;
231
}
232
233
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
234
impl<T: FromRawFd> FromRawSocketlike for T {
235
    #[inline]
236
    unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self {
237
        Self::from_raw_fd(raw)
238
    }
239
}
240
241
/// This is a portability abstraction over Unix-like `FromRawFd` and Windows'
242
/// [`FromRawSocket`].
243
#[cfg(windows)]
244
pub trait FromRawSocketlike: FromRawSocket {
245
    /// Constructs `Self` from the raw value.
246
    unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self;
247
}
248
249
#[cfg(windows)]
250
impl<T: FromRawSocket> FromRawSocketlike for T {
251
    #[inline]
252
    unsafe fn from_raw_socketlike(raw: RawSocketlike) -> Self {
253
        Self::from_raw_socket(raw)
254
    }
255
}