1- #![allow (non_camel_case_types, unused )]
1+ #![expect (non_camel_case_types)]
22
3- use libc::{c_int, c_void, size_t} ;
3+ use libc::size_t;
44
5+ use crate::ffi::{c_char, c_int, c_void};
56use crate::io;
6- use crate::mem::MaybeUninit;
7- use crate::os::raw::c_char;
87
9- pub type zx_handle_t = u32;
10- pub type zx_vaddr_t = usize;
11- pub type zx_rights_t = u32;
12- pub type zx_status_t = i32;
13-
14- pub const ZX_HANDLE_INVALID: zx_handle_t = 0;
8+ //////////
9+ // Time //
10+ //////////
1511
1612pub type zx_time_t = i64;
17- pub const ZX_TIME_INFINITE: zx_time_t = i64::MAX;
18-
19- pub type zx_signals_t = u32;
20-
21- pub const ZX_OBJECT_SIGNAL_3: zx_signals_t = 1 << 3;
2213
23- pub const ZX_TASK_TERMINATED: zx_signals_t = ZX_OBJECT_SIGNAL_3 ;
14+ pub const ZX_TIME_INFINITE: zx_time_t = i64::MAX ;
2415
25- pub const ZX_RIGHT_SAME_RIGHTS: zx_rights_t = 1 << 31;
16+ unsafe extern "C" {
17+ pub safe fn zx_clock_get_monotonic() -> zx_time_t;
18+ }
2619
27- // The upper four bits gives the minor version.
28- pub type zx_object_info_topic_t = u32;
20+ /////////////
21+ // Handles //
22+ /////////////
2923
30- pub const ZX_INFO_PROCESS: zx_object_info_topic_t = 3 | (1 << 28) ;
24+ pub type zx_handle_t = u32 ;
3125
32- pub type zx_info_process_flags_t = u32 ;
26+ pub const ZX_HANDLE_INVALID: zx_handle_t = 0 ;
3327
34- pub fn zx_cvt<T>(t: T) -> io::Result<T>
35- where
36- T: TryInto<zx_status_t> + Copy,
37- {
38- if let Ok(status) = TryInto::try_into(t) {
39- if status < 0 { Err(io::Error::from_raw_os_error(status)) } else { Ok(t) }
40- } else {
41- Err(io::Error::last_os_error())
42- }
28+ unsafe extern "C" {
29+ pub fn zx_handle_close(handle: zx_handle_t) -> zx_status_t;
4330}
4431
45- // Safe wrapper around zx_handle_t
32+ /// A safe wrapper around ` zx_handle_t`.
4633pub struct Handle {
4734 raw: zx_handle_t,
4835}
@@ -65,6 +52,66 @@ impl Drop for Handle {
6552 }
6653}
6754
55+ ///////////
56+ // Futex //
57+ ///////////
58+
59+ pub type zx_futex_t = crate::sync::atomic::Atomic<u32>;
60+
61+ unsafe extern "C" {
62+ pub fn zx_object_wait_one(
63+ handle: zx_handle_t,
64+ signals: zx_signals_t,
65+ timeout: zx_time_t,
66+ pending: *mut zx_signals_t,
67+ ) -> zx_status_t;
68+
69+ pub fn zx_futex_wait(
70+ value_ptr: *const zx_futex_t,
71+ current_value: zx_futex_t,
72+ new_futex_owner: zx_handle_t,
73+ deadline: zx_time_t,
74+ ) -> zx_status_t;
75+ pub fn zx_futex_wake(value_ptr: *const zx_futex_t, wake_count: u32) -> zx_status_t;
76+ pub fn zx_futex_wake_single_owner(value_ptr: *const zx_futex_t) -> zx_status_t;
77+ pub safe fn zx_thread_self() -> zx_handle_t;
78+ }
79+
80+ ////////////////
81+ // Properties //
82+ ////////////////
83+
84+ pub const ZX_PROP_NAME: u32 = 3;
85+
86+ unsafe extern "C" {
87+ pub fn zx_object_set_property(
88+ handle: zx_handle_t,
89+ property: u32,
90+ value: *const libc::c_void,
91+ value_size: libc::size_t,
92+ ) -> zx_status_t;
93+ }
94+
95+ /////////////
96+ // Signals //
97+ /////////////
98+
99+ pub type zx_signals_t = u32;
100+
101+ pub const ZX_OBJECT_SIGNAL_3: zx_signals_t = 1 << 3;
102+ pub const ZX_TASK_TERMINATED: zx_signals_t = ZX_OBJECT_SIGNAL_3;
103+
104+ /////////////////
105+ // Object info //
106+ /////////////////
107+
108+ // The upper four bits gives the minor version.
109+ pub type zx_object_info_topic_t = u32;
110+
111+ pub const ZX_INFO_PROCESS: zx_object_info_topic_t = 3 | (1 << 28);
112+
113+ pub type zx_info_process_flags_t = u32;
114+
68115// Returned for topic ZX_INFO_PROCESS
69116#[derive(Default)]
70117#[repr(C)]
@@ -76,25 +123,6 @@ pub struct zx_info_process_t {
76123}
77124
78125unsafe extern "C" {
79- pub fn zx_job_default() -> zx_handle_t;
80-
81- pub fn zx_task_kill(handle: zx_handle_t) -> zx_status_t;
82-
83- pub fn zx_handle_close(handle: zx_handle_t) -> zx_status_t;
84-
85- pub fn zx_handle_duplicate(
86- handle: zx_handle_t,
87- rights: zx_rights_t,
88- out: *const zx_handle_t,
89- ) -> zx_handle_t;
90-
91- pub fn zx_object_wait_one(
92- handle: zx_handle_t,
93- signals: zx_signals_t,
94- timeout: zx_time_t,
95- pending: *mut zx_signals_t,
96- ) -> zx_status_t;
97-
98126 pub fn zx_object_get_info(
99127 handle: zx_handle_t,
100128 topic: u32,
@@ -105,6 +133,10 @@ unsafe extern "C" {
105133 ) -> zx_status_t;
106134}
107135
136+ ///////////////
137+ // Processes //
138+ ///////////////
139+
108140#[derive(Default)]
109141#[repr(C)]
110142pub struct fdio_spawn_action_t {
@@ -130,180 +162,43 @@ unsafe extern "C" {
130162
131163 pub fn fdio_fd_clone(fd: c_int, out_handle: *mut zx_handle_t) -> zx_status_t;
132164 pub fn fdio_fd_create(handle: zx_handle_t, fd: *mut c_int) -> zx_status_t;
165+
166+ pub fn zx_task_kill(handle: zx_handle_t) -> zx_status_t;
133167}
134168
135169// fdio_spawn_etc flags
136170
137171pub const FDIO_SPAWN_CLONE_JOB: u32 = 0x0001;
138172pub const FDIO_SPAWN_CLONE_LDSVC: u32 = 0x0002;
139173pub const FDIO_SPAWN_CLONE_NAMESPACE: u32 = 0x0004;
140- pub const FDIO_SPAWN_CLONE_STDIO: u32 = 0x0008;
141174pub const FDIO_SPAWN_CLONE_ENVIRON: u32 = 0x0010;
142175pub const FDIO_SPAWN_CLONE_UTC_CLOCK: u32 = 0x0020;
143- pub const FDIO_SPAWN_CLONE_ALL: u32 = 0xFFFF;
144176
145177// fdio_spawn_etc actions
146178
147- pub const FDIO_SPAWN_ACTION_CLONE_FD: u32 = 0x0001;
148179pub const FDIO_SPAWN_ACTION_TRANSFER_FD: u32 = 0x0002;
149180
150- // Errors
151-
152- #[allow(unused)]
153- pub const ERR_INTERNAL: zx_status_t = -1;
154-
155- // ERR_NOT_SUPPORTED: The operation is not implemented, supported,
156- // or enabled.
157- #[allow(unused)]
158- pub const ERR_NOT_SUPPORTED: zx_status_t = -2;
159-
160- // ERR_NO_RESOURCES: The system was not able to allocate some resource
161- // needed for the operation.
162- #[allow(unused)]
163- pub const ERR_NO_RESOURCES: zx_status_t = -3;
164-
165- // ERR_NO_MEMORY: The system was not able to allocate memory needed
166- // for the operation.
167- #[allow(unused)]
168- pub const ERR_NO_MEMORY: zx_status_t = -4;
169-
170- // ERR_CALL_FAILED: The second phase of zx_channel_call(; did not complete
171- // successfully.
172- #[allow(unused)]
173- pub const ERR_CALL_FAILED: zx_status_t = -5;
174-
175- // ERR_INTERRUPTED_RETRY: The system call was interrupted, but should be
176- // retried. This should not be seen outside of the VDSO.
177- #[allow(unused)]
178- pub const ERR_INTERRUPTED_RETRY: zx_status_t = -6;
179-
180- // ======= Parameter errors =======
181- // ERR_INVALID_ARGS: an argument is invalid, ex. null pointer
182- #[allow(unused)]
183- pub const ERR_INVALID_ARGS: zx_status_t = -10;
184-
185- // ERR_BAD_HANDLE: A specified handle value does not refer to a handle.
186- #[allow(unused)]
187- pub const ERR_BAD_HANDLE: zx_status_t = -11;
188-
189- // ERR_WRONG_TYPE: The subject of the operation is the wrong type to
190- // perform the operation.
191- // Example: Attempting a message_read on a thread handle.
192- #[allow(unused)]
193- pub const ERR_WRONG_TYPE: zx_status_t = -12;
194-
195- // ERR_BAD_SYSCALL: The specified syscall number is invalid.
196- #[allow(unused)]
197- pub const ERR_BAD_SYSCALL: zx_status_t = -13;
198-
199- // ERR_OUT_OF_RANGE: An argument is outside the valid range for this
200- // operation.
201- #[allow(unused)]
202- pub const ERR_OUT_OF_RANGE: zx_status_t = -14;
203-
204- // ERR_BUFFER_TOO_SMALL: A caller provided buffer is too small for
205- // this operation.
206- #[allow(unused)]
207- pub const ERR_BUFFER_TOO_SMALL: zx_status_t = -15;
208-
209- // ======= Precondition or state errors =======
210- // ERR_BAD_STATE: operation failed because the current state of the
211- // object does not allow it, or a precondition of the operation is
212- // not satisfied
213- #[allow(unused)]
214- pub const ERR_BAD_STATE: zx_status_t = -20;
215-
216- // ERR_TIMED_OUT: The time limit for the operation elapsed before
217- // the operation completed.
218- #[allow(unused)]
219- pub const ERR_TIMED_OUT: zx_status_t = -21;
220-
221- // ERR_SHOULD_WAIT: The operation cannot be performed currently but
222- // potentially could succeed if the caller waits for a prerequisite
223- // to be satisfied, for example waiting for a handle to be readable
224- // or writable.
225- // Example: Attempting to read from a message pipe that has no
226- // messages waiting but has an open remote will return ERR_SHOULD_WAIT.
227- // Attempting to read from a message pipe that has no messages waiting
228- // and has a closed remote end will return ERR_REMOTE_CLOSED.
229- #[allow(unused)]
230- pub const ERR_SHOULD_WAIT: zx_status_t = -22;
231-
232- // ERR_CANCELED: The in-progress operation (e.g., a wait) has been
233- // // canceled.
234- #[allow(unused)]
235- pub const ERR_CANCELED: zx_status_t = -23;
236-
237- // ERR_PEER_CLOSED: The operation failed because the remote end
238- // of the subject of the operation was closed.
239- #[allow(unused)]
240- pub const ERR_PEER_CLOSED: zx_status_t = -24;
241-
242- // ERR_NOT_FOUND: The requested entity is not found.
243- #[allow(unused)]
244- pub const ERR_NOT_FOUND: zx_status_t = -25;
245-
246- // ERR_ALREADY_EXISTS: An object with the specified identifier
247- // already exists.
248- // Example: Attempting to create a file when a file already exists
249- // with that name.
250- #[allow(unused)]
251- pub const ERR_ALREADY_EXISTS: zx_status_t = -26;
252-
253- // ERR_ALREADY_BOUND: The operation failed because the named entity
254- // is already owned or controlled by another entity. The operation
255- // could succeed later if the current owner releases the entity.
256- #[allow(unused)]
257- pub const ERR_ALREADY_BOUND: zx_status_t = -27;
258-
259- // ERR_UNAVAILABLE: The subject of the operation is currently unable
260- // to perform the operation.
261- // Note: This is used when there's no direct way for the caller to
262- // observe when the subject will be able to perform the operation
263- // and should thus retry.
264- #[allow(unused)]
265- pub const ERR_UNAVAILABLE: zx_status_t = -28;
266-
267- // ======= Permission check errors =======
268- // ERR_ACCESS_DENIED: The caller did not have permission to perform
269- // the specified operation.
270- #[allow(unused)]
271- pub const ERR_ACCESS_DENIED: zx_status_t = -30;
272-
273- // ======= Input-output errors =======
274- // ERR_IO: Otherwise unspecified error occurred during I/O.
275- #[allow(unused)]
276- pub const ERR_IO: zx_status_t = -40;
277-
278- // ERR_REFUSED: The entity the I/O operation is being performed on
279- // rejected the operation.
280- // Example: an I2C device NAK'ing a transaction or a disk controller
281- // rejecting an invalid command.
282- #[allow(unused)]
283- pub const ERR_IO_REFUSED: zx_status_t = -41;
284-
285- // ERR_IO_DATA_INTEGRITY: The data in the operation failed an integrity
286- // check and is possibly corrupted.
287- // Example: CRC or Parity error.
288- #[allow(unused)]
289- pub const ERR_IO_DATA_INTEGRITY: zx_status_t = -42;
290-
291- // ERR_IO_DATA_LOSS: The data in the operation is currently unavailable
292- // and may be permanently lost.
293- // Example: A disk block is irrecoverably damaged.
294- #[allow(unused)]
295- pub const ERR_IO_DATA_LOSS: zx_status_t = -43;
296-
297- // Filesystem specific errors
298- #[allow(unused)]
299- pub const ERR_BAD_PATH: zx_status_t = -50;
300- #[allow(unused)]
301- pub const ERR_NOT_DIR: zx_status_t = -51;
302- #[allow(unused)]
303- pub const ERR_NOT_FILE: zx_status_t = -52;
304- // ERR_FILE_BIG: A file exceeds a filesystem-specific size limit.
305- #[allow(unused)]
306- pub const ERR_FILE_BIG: zx_status_t = -53;
307- // ERR_NO_SPACE: Filesystem or device space is exhausted.
308- #[allow(unused)]
309- pub const ERR_NO_SPACE: zx_status_t = -54;
181+ ////////////
182+ // Errors //
183+ ////////////
184+
185+ pub type zx_status_t = i32;
186+
187+ pub const ZX_OK: zx_status_t = 0;
188+ pub const ZX_ERR_NOT_SUPPORTED: zx_status_t = -2;
189+ pub const ZX_ERR_INVALID_ARGS: zx_status_t = -10;
190+ pub const ZX_ERR_BAD_HANDLE: zx_status_t = -11;
191+ pub const ZX_ERR_WRONG_TYPE: zx_status_t = -12;
192+ pub const ZX_ERR_BAD_STATE: zx_status_t = -20;
193+ pub const ZX_ERR_TIMED_OUT: zx_status_t = -21;
194+
195+ pub fn zx_cvt<T>(t: T) -> io::Result<T>
196+ where
197+ T: TryInto<zx_status_t> + Copy,
198+ {
199+ if let Ok(status) = TryInto::try_into(t) {
200+ if status < 0 { Err(io::Error::from_raw_os_error(status)) } else { Ok(t) }
201+ } else {
202+ Err(io::Error::last_os_error())
203+ }
204+ }
0 commit comments