viaduct/
os.rs

1use interprocess::unnamed_pipe::{UnnamedPipeReader, UnnamedPipeWriter};
2
3pub(super) trait RawPipe: Sized {
4	type Raw: std::fmt::Debug;
5	fn raw(self) -> Self::Raw;
6	fn as_raw(&self) -> Self::Raw;
7	fn close(self);
8	unsafe fn from_raw(raw: Self::Raw) -> Self;
9}
10#[cfg(windows)]
11impl RawPipe for UnnamedPipeReader {
12	type Raw = std::os::windows::io::RawHandle;
13
14	fn raw(self) -> Self::Raw {
15		use std::os::windows::prelude::IntoRawHandle;
16		self.into_raw_handle()
17	}
18
19	fn as_raw(&self) -> Self::Raw {
20		use std::os::windows::prelude::AsRawHandle;
21		self.as_raw_handle()
22	}
23
24	fn close(self) {
25		use std::os::windows::prelude::IntoRawHandle;
26		unsafe { windows::Win32::Foundation::CloseHandle(Some(windows::Win32::Foundation::HANDLE(self.into_raw_handle() as _))) };
27	}
28
29	unsafe fn from_raw(raw: Self::Raw) -> Self {
30		use std::os::windows::prelude::FromRawHandle;
31		unsafe { Self::from_raw_handle(raw) }
32	}
33}
34#[cfg(windows)]
35impl RawPipe for UnnamedPipeWriter {
36	type Raw = std::os::windows::io::RawHandle;
37
38	fn raw(self) -> Self::Raw {
39		use std::os::windows::prelude::IntoRawHandle;
40		self.into_raw_handle()
41	}
42
43	fn as_raw(&self) -> Self::Raw {
44		use std::os::windows::prelude::AsRawHandle;
45		self.as_raw_handle()
46	}
47
48	fn close(self) {
49		use std::os::windows::prelude::IntoRawHandle;
50		unsafe { windows::Win32::Foundation::CloseHandle(Some(windows::Win32::Foundation::HANDLE(self.into_raw_handle() as _))) };
51	}
52
53	unsafe fn from_raw(raw: Self::Raw) -> Self {
54		use std::os::windows::prelude::FromRawHandle;
55		unsafe { Self::from_raw_handle(raw) }
56	}
57}
58#[cfg(unix)]
59impl RawPipe for UnnamedPipeReader {
60	type Raw = std::os::unix::io::RawFd;
61
62	fn raw(self) -> Self::Raw {
63		use std::os::unix::prelude::IntoRawFd;
64		self.into_raw_fd()
65	}
66
67	fn as_raw(&self) -> Self::Raw {
68		use std::os::unix::prelude::AsRawFd;
69		self.as_raw_fd()
70	}
71
72	fn close(self) {
73		use std::os::unix::prelude::IntoRawFd;
74		unsafe { libc::close(self.into_raw_fd()) };
75	}
76
77	unsafe fn from_raw(raw: Self::Raw) -> Self {
78		use std::os::unix::prelude::FromRawFd;
79		unsafe { Self::from_raw_fd(raw) }
80	}
81}
82#[cfg(unix)]
83impl RawPipe for UnnamedPipeWriter {
84	type Raw = std::os::unix::io::RawFd;
85
86	fn raw(self) -> Self::Raw {
87		use std::os::unix::prelude::IntoRawFd;
88		self.into_raw_fd()
89	}
90
91	fn as_raw(&self) -> Self::Raw {
92		use std::os::unix::prelude::AsRawFd;
93		self.as_raw_fd()
94	}
95
96	fn close(self) {
97		use std::os::unix::prelude::IntoRawFd;
98		unsafe { libc::close(self.into_raw_fd()) };
99	}
100
101	unsafe fn from_raw(raw: Self::Raw) -> Self {
102		use std::os::unix::prelude::FromRawFd;
103		unsafe { Self::from_raw_fd(raw) }
104	}
105}