Skip to main content

compio_driver\sys\pal\windows/
fd.rs

1use std::os::windows::prelude::*;
2
3use windows_sys::Win32::Foundation::HANDLE;
4
5/// On windows, handle and socket are in the same size.
6/// Both of them could be attached to an IOCP.
7/// Therefore, both could be seen as fd.
8pub type RawFd = HANDLE;
9
10pub use std::os::windows::io::{FromRawHandle as FromRawFd, IntoRawHandle as IntoRawFd};
11
12/// Extracts raw fds.
13pub trait AsRawFd {
14    /// Extracts the raw fd.
15    fn as_raw_fd(&self) -> RawFd;
16}
17
18/// Owned handle or socket on Windows.
19#[derive(Debug)]
20pub enum OwnedFd {
21    /// Win32 handle.
22    File(OwnedHandle),
23    /// Windows socket handle.
24    Socket(OwnedSocket),
25}
26
27impl AsRawFd for OwnedFd {
28    fn as_raw_fd(&self) -> RawFd {
29        match self {
30            Self::File(fd) => fd.as_raw_handle() as _,
31            Self::Socket(s) => s.as_raw_socket() as _,
32        }
33    }
34}
35
36impl AsRawFd for RawFd {
37    fn as_raw_fd(&self) -> RawFd {
38        *self
39    }
40}
41
42impl AsRawFd for std::fs::File {
43    fn as_raw_fd(&self) -> RawFd {
44        self.as_raw_handle() as _
45    }
46}
47
48impl AsRawFd for OwnedHandle {
49    fn as_raw_fd(&self) -> RawFd {
50        self.as_raw_handle() as _
51    }
52}
53
54impl AsRawFd for socket2::Socket {
55    fn as_raw_fd(&self) -> RawFd {
56        self.as_raw_socket() as _
57    }
58}
59
60impl AsRawFd for OwnedSocket {
61    fn as_raw_fd(&self) -> RawFd {
62        self.as_raw_socket() as _
63    }
64}
65
66impl AsRawFd for std::process::ChildStdin {
67    fn as_raw_fd(&self) -> RawFd {
68        self.as_raw_handle() as _
69    }
70}
71
72impl AsRawFd for std::process::ChildStdout {
73    fn as_raw_fd(&self) -> RawFd {
74        self.as_raw_handle() as _
75    }
76}
77
78impl AsRawFd for std::process::ChildStderr {
79    fn as_raw_fd(&self) -> RawFd {
80        self.as_raw_handle() as _
81    }
82}
83
84impl From<OwnedHandle> for OwnedFd {
85    fn from(value: OwnedHandle) -> Self {
86        Self::File(value)
87    }
88}
89
90impl From<std::fs::File> for OwnedFd {
91    fn from(value: std::fs::File) -> Self {
92        Self::File(OwnedHandle::from(value))
93    }
94}
95
96impl From<std::process::ChildStdin> for OwnedFd {
97    fn from(value: std::process::ChildStdin) -> Self {
98        Self::File(OwnedHandle::from(value))
99    }
100}
101
102impl From<std::process::ChildStdout> for OwnedFd {
103    fn from(value: std::process::ChildStdout) -> Self {
104        Self::File(OwnedHandle::from(value))
105    }
106}
107
108impl From<std::process::ChildStderr> for OwnedFd {
109    fn from(value: std::process::ChildStderr) -> Self {
110        Self::File(OwnedHandle::from(value))
111    }
112}
113
114impl From<OwnedSocket> for OwnedFd {
115    fn from(value: OwnedSocket) -> Self {
116        Self::Socket(value)
117    }
118}
119
120impl From<socket2::Socket> for OwnedFd {
121    fn from(value: socket2::Socket) -> Self {
122        Self::Socket(OwnedSocket::from(value))
123    }
124}
125
126/// Borrowed handle or socket on Windows.
127#[derive(Debug)]
128pub enum BorrowedFd<'a> {
129    /// Win32 handle.
130    File(BorrowedHandle<'a>),
131    /// Windows socket handle.
132    Socket(BorrowedSocket<'a>),
133}
134
135impl AsRawFd for BorrowedFd<'_> {
136    fn as_raw_fd(&self) -> RawFd {
137        match self {
138            Self::File(fd) => fd.as_raw_handle() as RawFd,
139            Self::Socket(s) => s.as_raw_socket() as RawFd,
140        }
141    }
142}
143
144impl<'a> From<BorrowedHandle<'a>> for BorrowedFd<'a> {
145    fn from(value: BorrowedHandle<'a>) -> Self {
146        Self::File(value)
147    }
148}
149
150impl<'a> From<BorrowedSocket<'a>> for BorrowedFd<'a> {
151    fn from(value: BorrowedSocket<'a>) -> Self {
152        Self::Socket(value)
153    }
154}
155
156/// Extracts fds.
157pub trait AsFd {
158    /// Extracts the borrowed fd.
159    fn as_fd(&self) -> BorrowedFd<'_>;
160}
161
162impl AsFd for OwnedFd {
163    fn as_fd(&self) -> BorrowedFd<'_> {
164        match self {
165            Self::File(fd) => fd.as_fd(),
166            Self::Socket(s) => s.as_fd(),
167        }
168    }
169}
170
171impl AsFd for std::fs::File {
172    fn as_fd(&self) -> BorrowedFd<'_> {
173        self.as_handle().into()
174    }
175}
176
177impl AsFd for OwnedHandle {
178    fn as_fd(&self) -> BorrowedFd<'_> {
179        self.as_handle().into()
180    }
181}
182
183impl AsFd for BorrowedHandle<'_> {
184    fn as_fd(&self) -> BorrowedFd<'_> {
185        (*self).into()
186    }
187}
188
189impl AsFd for socket2::Socket {
190    fn as_fd(&self) -> BorrowedFd<'_> {
191        self.as_socket().into()
192    }
193}
194
195impl AsFd for OwnedSocket {
196    fn as_fd(&self) -> BorrowedFd<'_> {
197        self.as_socket().into()
198    }
199}
200
201impl AsFd for BorrowedSocket<'_> {
202    fn as_fd(&self) -> BorrowedFd<'_> {
203        (*self).into()
204    }
205}
206
207impl AsFd for std::process::ChildStdin {
208    fn as_fd(&self) -> BorrowedFd<'_> {
209        self.as_handle().into()
210    }
211}
212
213impl AsFd for std::process::ChildStdout {
214    fn as_fd(&self) -> BorrowedFd<'_> {
215        self.as_handle().into()
216    }
217}
218
219impl AsFd for std::process::ChildStderr {
220    fn as_fd(&self) -> BorrowedFd<'_> {
221        self.as_handle().into()
222    }
223}