xref: /aosp_15_r20/external/crosvm/base/src/sys/macos/mod.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::File;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use crate::descriptor::FromRawDescriptor;
8*bb4ee6a4SAndroid Build Coastguard Worker use crate::sys::unix::RawDescriptor;
9*bb4ee6a4SAndroid Build Coastguard Worker use crate::unix::set_descriptor_cloexec;
10*bb4ee6a4SAndroid Build Coastguard Worker use crate::unix::Pid;
11*bb4ee6a4SAndroid Build Coastguard Worker use crate::MmapError;
12*bb4ee6a4SAndroid Build Coastguard Worker 
13*bb4ee6a4SAndroid Build Coastguard Worker mod event;
14*bb4ee6a4SAndroid Build Coastguard Worker pub(in crate::sys::macos) mod kqueue;
15*bb4ee6a4SAndroid Build Coastguard Worker mod net;
16*bb4ee6a4SAndroid Build Coastguard Worker mod timer;
17*bb4ee6a4SAndroid Build Coastguard Worker 
18*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use event::PlatformEvent;
19*bb4ee6a4SAndroid Build Coastguard Worker pub(in crate::sys) use libc::sendmsg;
20*bb4ee6a4SAndroid Build Coastguard Worker pub(in crate::sys) use net::sockaddr_un;
21*bb4ee6a4SAndroid Build Coastguard Worker pub(in crate::sys) use net::sockaddrv4_to_lib_c;
22*bb4ee6a4SAndroid Build Coastguard Worker pub(in crate::sys) use net::sockaddrv6_to_lib_c;
23*bb4ee6a4SAndroid Build Coastguard Worker 
set_thread_name(_name: &str) -> crate::errno::Result<()>24*bb4ee6a4SAndroid Build Coastguard Worker pub fn set_thread_name(_name: &str) -> crate::errno::Result<()> {
25*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
26*bb4ee6a4SAndroid Build Coastguard Worker }
27*bb4ee6a4SAndroid Build Coastguard Worker 
get_cpu_affinity() -> crate::errno::Result<Vec<usize>>28*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_cpu_affinity() -> crate::errno::Result<Vec<usize>> {
29*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
30*bb4ee6a4SAndroid Build Coastguard Worker }
31*bb4ee6a4SAndroid Build Coastguard Worker 
getpid() -> Pid32*bb4ee6a4SAndroid Build Coastguard Worker pub fn getpid() -> Pid {
33*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
34*bb4ee6a4SAndroid Build Coastguard Worker }
35*bb4ee6a4SAndroid Build Coastguard Worker 
open_file_or_duplicate<P: AsRef<std::path::Path>>( _path: P, _options: &std::fs::OpenOptions, ) -> crate::Result<std::fs::File>36*bb4ee6a4SAndroid Build Coastguard Worker pub fn open_file_or_duplicate<P: AsRef<std::path::Path>>(
37*bb4ee6a4SAndroid Build Coastguard Worker     _path: P,
38*bb4ee6a4SAndroid Build Coastguard Worker     _options: &std::fs::OpenOptions,
39*bb4ee6a4SAndroid Build Coastguard Worker ) -> crate::Result<std::fs::File> {
40*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
41*bb4ee6a4SAndroid Build Coastguard Worker }
42*bb4ee6a4SAndroid Build Coastguard Worker 
43*bb4ee6a4SAndroid Build Coastguard Worker pub mod platform_timer_resolution {
44*bb4ee6a4SAndroid Build Coastguard Worker     pub struct UnixSetTimerResolution {}
45*bb4ee6a4SAndroid Build Coastguard Worker     impl crate::EnabledHighResTimer for UnixSetTimerResolution {}
46*bb4ee6a4SAndroid Build Coastguard Worker 
enable_high_res_timers() -> crate::Result<Box<dyn crate::EnabledHighResTimer>>47*bb4ee6a4SAndroid Build Coastguard Worker     pub fn enable_high_res_timers() -> crate::Result<Box<dyn crate::EnabledHighResTimer>> {
48*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
49*bb4ee6a4SAndroid Build Coastguard Worker     }
50*bb4ee6a4SAndroid Build Coastguard Worker }
51*bb4ee6a4SAndroid Build Coastguard Worker 
set_cpu_affinity<I: IntoIterator<Item = usize>>(_cpus: I) -> crate::errno::Result<()>52*bb4ee6a4SAndroid Build Coastguard Worker pub fn set_cpu_affinity<I: IntoIterator<Item = usize>>(_cpus: I) -> crate::errno::Result<()> {
53*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
54*bb4ee6a4SAndroid Build Coastguard Worker }
55*bb4ee6a4SAndroid Build Coastguard Worker 
56*bb4ee6a4SAndroid Build Coastguard Worker pub struct EventContext<T: crate::EventToken> {
57*bb4ee6a4SAndroid Build Coastguard Worker     p: std::marker::PhantomData<T>,
58*bb4ee6a4SAndroid Build Coastguard Worker }
59*bb4ee6a4SAndroid Build Coastguard Worker 
60*bb4ee6a4SAndroid Build Coastguard Worker impl<T: crate::EventToken> EventContext<T> {
new() -> crate::errno::Result<EventContext<T>>61*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new() -> crate::errno::Result<EventContext<T>> {
62*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
63*bb4ee6a4SAndroid Build Coastguard Worker     }
build_with( _fd_tokens: &[(&dyn crate::AsRawDescriptor, T)], ) -> crate::errno::Result<EventContext<T>>64*bb4ee6a4SAndroid Build Coastguard Worker     pub fn build_with(
65*bb4ee6a4SAndroid Build Coastguard Worker         _fd_tokens: &[(&dyn crate::AsRawDescriptor, T)],
66*bb4ee6a4SAndroid Build Coastguard Worker     ) -> crate::errno::Result<EventContext<T>> {
67*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
68*bb4ee6a4SAndroid Build Coastguard Worker     }
add_for_event( &self, _descriptor: &dyn crate::AsRawDescriptor, _event_type: crate::EventType, _token: T, ) -> crate::errno::Result<()>69*bb4ee6a4SAndroid Build Coastguard Worker     pub fn add_for_event(
70*bb4ee6a4SAndroid Build Coastguard Worker         &self,
71*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &dyn crate::AsRawDescriptor,
72*bb4ee6a4SAndroid Build Coastguard Worker         _event_type: crate::EventType,
73*bb4ee6a4SAndroid Build Coastguard Worker         _token: T,
74*bb4ee6a4SAndroid Build Coastguard Worker     ) -> crate::errno::Result<()> {
75*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
76*bb4ee6a4SAndroid Build Coastguard Worker     }
modify( &self, _fd: &dyn crate::AsRawDescriptor, _event_type: crate::EventType, _token: T, ) -> crate::errno::Result<()>77*bb4ee6a4SAndroid Build Coastguard Worker     pub fn modify(
78*bb4ee6a4SAndroid Build Coastguard Worker         &self,
79*bb4ee6a4SAndroid Build Coastguard Worker         _fd: &dyn crate::AsRawDescriptor,
80*bb4ee6a4SAndroid Build Coastguard Worker         _event_type: crate::EventType,
81*bb4ee6a4SAndroid Build Coastguard Worker         _token: T,
82*bb4ee6a4SAndroid Build Coastguard Worker     ) -> crate::errno::Result<()> {
83*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
84*bb4ee6a4SAndroid Build Coastguard Worker     }
delete(&self, _fd: &dyn crate::AsRawDescriptor) -> crate::errno::Result<()>85*bb4ee6a4SAndroid Build Coastguard Worker     pub fn delete(&self, _fd: &dyn crate::AsRawDescriptor) -> crate::errno::Result<()> {
86*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
87*bb4ee6a4SAndroid Build Coastguard Worker     }
wait(&self) -> crate::errno::Result<smallvec::SmallVec<[crate::TriggeredEvent<T>; 16]>>88*bb4ee6a4SAndroid Build Coastguard Worker     pub fn wait(&self) -> crate::errno::Result<smallvec::SmallVec<[crate::TriggeredEvent<T>; 16]>> {
89*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
90*bb4ee6a4SAndroid Build Coastguard Worker     }
wait_timeout( &self, _timeout: std::time::Duration, ) -> crate::errno::Result<smallvec::SmallVec<[crate::TriggeredEvent<T>; 16]>>91*bb4ee6a4SAndroid Build Coastguard Worker     pub fn wait_timeout(
92*bb4ee6a4SAndroid Build Coastguard Worker         &self,
93*bb4ee6a4SAndroid Build Coastguard Worker         _timeout: std::time::Duration,
94*bb4ee6a4SAndroid Build Coastguard Worker     ) -> crate::errno::Result<smallvec::SmallVec<[crate::TriggeredEvent<T>; 16]>> {
95*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
96*bb4ee6a4SAndroid Build Coastguard Worker     }
97*bb4ee6a4SAndroid Build Coastguard Worker }
98*bb4ee6a4SAndroid Build Coastguard Worker 
99*bb4ee6a4SAndroid Build Coastguard Worker impl<T: crate::EventToken> crate::AsRawDescriptor for EventContext<T> {
as_raw_descriptor(&self) -> RawDescriptor100*bb4ee6a4SAndroid Build Coastguard Worker     fn as_raw_descriptor(&self) -> RawDescriptor {
101*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
102*bb4ee6a4SAndroid Build Coastguard Worker     }
103*bb4ee6a4SAndroid Build Coastguard Worker }
104*bb4ee6a4SAndroid Build Coastguard Worker 
105*bb4ee6a4SAndroid Build Coastguard Worker pub struct MemoryMappingArena {}
106*bb4ee6a4SAndroid Build Coastguard Worker 
107*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)]
108*bb4ee6a4SAndroid Build Coastguard Worker pub struct MemoryMapping {}
109*bb4ee6a4SAndroid Build Coastguard Worker 
110*bb4ee6a4SAndroid Build Coastguard Worker impl MemoryMapping {
size(&self) -> usize111*bb4ee6a4SAndroid Build Coastguard Worker     pub fn size(&self) -> usize {
112*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
113*bb4ee6a4SAndroid Build Coastguard Worker     }
range_end(&self, _offset: usize, _count: usize) -> Result<usize, MmapError>114*bb4ee6a4SAndroid Build Coastguard Worker     pub(crate) fn range_end(&self, _offset: usize, _count: usize) -> Result<usize, MmapError> {
115*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
116*bb4ee6a4SAndroid Build Coastguard Worker     }
msync(&self) -> Result<(), MmapError>117*bb4ee6a4SAndroid Build Coastguard Worker     pub fn msync(&self) -> Result<(), MmapError> {
118*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
119*bb4ee6a4SAndroid Build Coastguard Worker     }
new_protection_fixed( _addr: *mut u8, _size: usize, _prot: crate::Protection, ) -> Result<MemoryMapping, MmapError>120*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new_protection_fixed(
121*bb4ee6a4SAndroid Build Coastguard Worker         _addr: *mut u8,
122*bb4ee6a4SAndroid Build Coastguard Worker         _size: usize,
123*bb4ee6a4SAndroid Build Coastguard Worker         _prot: crate::Protection,
124*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Result<MemoryMapping, MmapError> {
125*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
126*bb4ee6a4SAndroid Build Coastguard Worker     }
127*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
128*bb4ee6a4SAndroid Build Coastguard Worker     ///
129*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
from_descriptor_offset_protection_fixed( _addr: *mut u8, _fd: &dyn crate::AsRawDescriptor, _size: usize, _offset: u64, _prot: crate::Protection, ) -> Result<MemoryMapping, MmapError>130*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn from_descriptor_offset_protection_fixed(
131*bb4ee6a4SAndroid Build Coastguard Worker         _addr: *mut u8,
132*bb4ee6a4SAndroid Build Coastguard Worker         _fd: &dyn crate::AsRawDescriptor,
133*bb4ee6a4SAndroid Build Coastguard Worker         _size: usize,
134*bb4ee6a4SAndroid Build Coastguard Worker         _offset: u64,
135*bb4ee6a4SAndroid Build Coastguard Worker         _prot: crate::Protection,
136*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Result<MemoryMapping, MmapError> {
137*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
138*bb4ee6a4SAndroid Build Coastguard Worker     }
139*bb4ee6a4SAndroid Build Coastguard Worker }
140*bb4ee6a4SAndroid Build Coastguard Worker 
141*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Unimplemented, always aborts
142*bb4ee6a4SAndroid Build Coastguard Worker unsafe impl crate::MappedRegion for MemoryMapping {
as_ptr(&self) -> *mut u8143*bb4ee6a4SAndroid Build Coastguard Worker     fn as_ptr(&self) -> *mut u8 {
144*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
145*bb4ee6a4SAndroid Build Coastguard Worker     }
size(&self) -> usize146*bb4ee6a4SAndroid Build Coastguard Worker     fn size(&self) -> usize {
147*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
148*bb4ee6a4SAndroid Build Coastguard Worker     }
149*bb4ee6a4SAndroid Build Coastguard Worker }
150*bb4ee6a4SAndroid Build Coastguard Worker 
151*bb4ee6a4SAndroid Build Coastguard Worker pub mod ioctl {
152*bb4ee6a4SAndroid Build Coastguard Worker     pub type IoctlNr = std::ffi::c_ulong;
153*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
154*bb4ee6a4SAndroid Build Coastguard Worker     ///
155*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
ioctl<F: crate::AsRawDescriptor>( _descriptor: &F, _nr: IoctlNr, ) -> std::ffi::c_int156*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn ioctl<F: crate::AsRawDescriptor>(
157*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &F,
158*bb4ee6a4SAndroid Build Coastguard Worker         _nr: IoctlNr,
159*bb4ee6a4SAndroid Build Coastguard Worker     ) -> std::ffi::c_int {
160*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
161*bb4ee6a4SAndroid Build Coastguard Worker     }
162*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
163*bb4ee6a4SAndroid Build Coastguard Worker     ///
164*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
ioctl_with_val( _descriptor: &dyn crate::AsRawDescriptor, _nr: IoctlNr, _arg: std::ffi::c_ulong, ) -> std::ffi::c_int165*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn ioctl_with_val(
166*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &dyn crate::AsRawDescriptor,
167*bb4ee6a4SAndroid Build Coastguard Worker         _nr: IoctlNr,
168*bb4ee6a4SAndroid Build Coastguard Worker         _arg: std::ffi::c_ulong,
169*bb4ee6a4SAndroid Build Coastguard Worker     ) -> std::ffi::c_int {
170*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
171*bb4ee6a4SAndroid Build Coastguard Worker     }
172*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
173*bb4ee6a4SAndroid Build Coastguard Worker     ///
174*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
ioctl_with_ref<T>( _descriptor: &dyn crate::AsRawDescriptor, _nr: IoctlNr, _arg: &T, ) -> std::ffi::c_int175*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn ioctl_with_ref<T>(
176*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &dyn crate::AsRawDescriptor,
177*bb4ee6a4SAndroid Build Coastguard Worker         _nr: IoctlNr,
178*bb4ee6a4SAndroid Build Coastguard Worker         _arg: &T,
179*bb4ee6a4SAndroid Build Coastguard Worker     ) -> std::ffi::c_int {
180*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
181*bb4ee6a4SAndroid Build Coastguard Worker     }
182*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
183*bb4ee6a4SAndroid Build Coastguard Worker     ///
184*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
ioctl_with_mut_ref<T>( _descriptor: &dyn crate::AsRawDescriptor, _nr: IoctlNr, _arg: &mut T, ) -> std::ffi::c_int185*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn ioctl_with_mut_ref<T>(
186*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &dyn crate::AsRawDescriptor,
187*bb4ee6a4SAndroid Build Coastguard Worker         _nr: IoctlNr,
188*bb4ee6a4SAndroid Build Coastguard Worker         _arg: &mut T,
189*bb4ee6a4SAndroid Build Coastguard Worker     ) -> std::ffi::c_int {
190*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
191*bb4ee6a4SAndroid Build Coastguard Worker     }
192*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
193*bb4ee6a4SAndroid Build Coastguard Worker     ///
194*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
ioctl_with_ptr<T>( _descriptor: &dyn crate::AsRawDescriptor, _nr: IoctlNr, _arg: *const T, ) -> std::ffi::c_int195*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn ioctl_with_ptr<T>(
196*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &dyn crate::AsRawDescriptor,
197*bb4ee6a4SAndroid Build Coastguard Worker         _nr: IoctlNr,
198*bb4ee6a4SAndroid Build Coastguard Worker         _arg: *const T,
199*bb4ee6a4SAndroid Build Coastguard Worker     ) -> std::ffi::c_int {
200*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
201*bb4ee6a4SAndroid Build Coastguard Worker     }
202*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
203*bb4ee6a4SAndroid Build Coastguard Worker     ///
204*bb4ee6a4SAndroid Build Coastguard Worker     /// unimplemented, always aborts
ioctl_with_mut_ptr<T>( _descriptor: &dyn crate::AsRawDescriptor, _nr: IoctlNr, _arg: *mut T, ) -> std::ffi::c_int205*bb4ee6a4SAndroid Build Coastguard Worker     pub unsafe fn ioctl_with_mut_ptr<T>(
206*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: &dyn crate::AsRawDescriptor,
207*bb4ee6a4SAndroid Build Coastguard Worker         _nr: IoctlNr,
208*bb4ee6a4SAndroid Build Coastguard Worker         _arg: *mut T,
209*bb4ee6a4SAndroid Build Coastguard Worker     ) -> std::ffi::c_int {
210*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
211*bb4ee6a4SAndroid Build Coastguard Worker     }
212*bb4ee6a4SAndroid Build Coastguard Worker }
213*bb4ee6a4SAndroid Build Coastguard Worker 
file_punch_hole(_file: &std::fs::File, _offset: u64, _length: u64) -> std::io::Result<()>214*bb4ee6a4SAndroid Build Coastguard Worker pub fn file_punch_hole(_file: &std::fs::File, _offset: u64, _length: u64) -> std::io::Result<()> {
215*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
216*bb4ee6a4SAndroid Build Coastguard Worker }
217*bb4ee6a4SAndroid Build Coastguard Worker 
file_write_zeroes_at( _file: &std::fs::File, _offset: u64, _length: usize, ) -> std::io::Result<usize>218*bb4ee6a4SAndroid Build Coastguard Worker pub fn file_write_zeroes_at(
219*bb4ee6a4SAndroid Build Coastguard Worker     _file: &std::fs::File,
220*bb4ee6a4SAndroid Build Coastguard Worker     _offset: u64,
221*bb4ee6a4SAndroid Build Coastguard Worker     _length: usize,
222*bb4ee6a4SAndroid Build Coastguard Worker ) -> std::io::Result<usize> {
223*bb4ee6a4SAndroid Build Coastguard Worker     todo!();
224*bb4ee6a4SAndroid Build Coastguard Worker }
225*bb4ee6a4SAndroid Build Coastguard Worker 
226*bb4ee6a4SAndroid Build Coastguard Worker pub mod syslog {
227*bb4ee6a4SAndroid Build Coastguard Worker     pub struct PlatformSyslog {}
228*bb4ee6a4SAndroid Build Coastguard Worker 
229*bb4ee6a4SAndroid Build Coastguard Worker     impl crate::syslog::Syslog for PlatformSyslog {
new( _proc_name: String, _facility: crate::syslog::Facility, ) -> Result< ( Option<Box<dyn crate::syslog::Log + Send>>, Option<crate::RawDescriptor>, ), crate::syslog::Error, >230*bb4ee6a4SAndroid Build Coastguard Worker         fn new(
231*bb4ee6a4SAndroid Build Coastguard Worker             _proc_name: String,
232*bb4ee6a4SAndroid Build Coastguard Worker             _facility: crate::syslog::Facility,
233*bb4ee6a4SAndroid Build Coastguard Worker         ) -> Result<
234*bb4ee6a4SAndroid Build Coastguard Worker             (
235*bb4ee6a4SAndroid Build Coastguard Worker                 Option<Box<dyn crate::syslog::Log + Send>>,
236*bb4ee6a4SAndroid Build Coastguard Worker                 Option<crate::RawDescriptor>,
237*bb4ee6a4SAndroid Build Coastguard Worker             ),
238*bb4ee6a4SAndroid Build Coastguard Worker             crate::syslog::Error,
239*bb4ee6a4SAndroid Build Coastguard Worker         > {
240*bb4ee6a4SAndroid Build Coastguard Worker             todo!();
241*bb4ee6a4SAndroid Build Coastguard Worker         }
242*bb4ee6a4SAndroid Build Coastguard Worker     }
243*bb4ee6a4SAndroid Build Coastguard Worker }
244*bb4ee6a4SAndroid Build Coastguard Worker 
245*bb4ee6a4SAndroid Build Coastguard Worker impl PartialEq for crate::SafeDescriptor {
eq(&self, _other: &Self) -> bool246*bb4ee6a4SAndroid Build Coastguard Worker     fn eq(&self, _other: &Self) -> bool {
247*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
248*bb4ee6a4SAndroid Build Coastguard Worker     }
249*bb4ee6a4SAndroid Build Coastguard Worker }
250*bb4ee6a4SAndroid Build Coastguard Worker 
251*bb4ee6a4SAndroid Build Coastguard Worker impl crate::shm::PlatformSharedMemory for crate::SharedMemory {
new(_debug_name: &std::ffi::CStr, _size: u64) -> crate::Result<crate::SharedMemory>252*bb4ee6a4SAndroid Build Coastguard Worker     fn new(_debug_name: &std::ffi::CStr, _size: u64) -> crate::Result<crate::SharedMemory> {
253*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
254*bb4ee6a4SAndroid Build Coastguard Worker     }
from_safe_descriptor( _descriptor: crate::SafeDescriptor, _size: u64, ) -> crate::Result<crate::SharedMemory>255*bb4ee6a4SAndroid Build Coastguard Worker     fn from_safe_descriptor(
256*bb4ee6a4SAndroid Build Coastguard Worker         _descriptor: crate::SafeDescriptor,
257*bb4ee6a4SAndroid Build Coastguard Worker         _size: u64,
258*bb4ee6a4SAndroid Build Coastguard Worker     ) -> crate::Result<crate::SharedMemory> {
259*bb4ee6a4SAndroid Build Coastguard Worker         todo!();
260*bb4ee6a4SAndroid Build Coastguard Worker     }
261*bb4ee6a4SAndroid Build Coastguard Worker }
262*bb4ee6a4SAndroid Build Coastguard Worker 
263*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use libc::off_t;
264*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use libc::pread;
265*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use libc::preadv;
266*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use libc::pwrite;
267*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use libc::pwritev;
268*bb4ee6a4SAndroid Build Coastguard Worker 
269*bb4ee6a4SAndroid Build Coastguard Worker /// Spawns a pipe pair where the first pipe is the read end and the second pipe is the write end.
270*bb4ee6a4SAndroid Build Coastguard Worker ///
271*bb4ee6a4SAndroid Build Coastguard Worker /// The `O_CLOEXEC` flag will be applied after pipe creation.
pipe() -> crate::errno::Result<(File, File)>272*bb4ee6a4SAndroid Build Coastguard Worker pub fn pipe() -> crate::errno::Result<(File, File)> {
273*bb4ee6a4SAndroid Build Coastguard Worker     let mut pipe_fds = [-1; 2];
274*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
275*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because pipe will only write 2 element array of i32 to the given pointer, and we check
276*bb4ee6a4SAndroid Build Coastguard Worker     // for error.
277*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe { libc::pipe(pipe_fds.as_mut_ptr()) };
278*bb4ee6a4SAndroid Build Coastguard Worker     if ret == -1 {
279*bb4ee6a4SAndroid Build Coastguard Worker         return crate::errno::errno_result();
280*bb4ee6a4SAndroid Build Coastguard Worker     }
281*bb4ee6a4SAndroid Build Coastguard Worker 
282*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
283*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because both fds must be valid for pipe to have returned sucessfully and we have
284*bb4ee6a4SAndroid Build Coastguard Worker     // exclusive ownership of them.
285*bb4ee6a4SAndroid Build Coastguard Worker     let pipes = unsafe {
286*bb4ee6a4SAndroid Build Coastguard Worker         (
287*bb4ee6a4SAndroid Build Coastguard Worker             File::from_raw_descriptor(pipe_fds[0]),
288*bb4ee6a4SAndroid Build Coastguard Worker             File::from_raw_descriptor(pipe_fds[1]),
289*bb4ee6a4SAndroid Build Coastguard Worker         )
290*bb4ee6a4SAndroid Build Coastguard Worker     };
291*bb4ee6a4SAndroid Build Coastguard Worker 
292*bb4ee6a4SAndroid Build Coastguard Worker     set_descriptor_cloexec(&pipes.0)?;
293*bb4ee6a4SAndroid Build Coastguard Worker     set_descriptor_cloexec(&pipes.1)?;
294*bb4ee6a4SAndroid Build Coastguard Worker 
295*bb4ee6a4SAndroid Build Coastguard Worker     Ok(pipes)
296*bb4ee6a4SAndroid Build Coastguard Worker }
297