#![expect(non_camel_case_types)] use libc::size_t; use crate::ffi::{c_char, c_int, c_void}; use crate::io; ////////// // Time // ////////// pub type zx_time_t = i64; pub const ZX_TIME_INFINITE: zx_time_t = i64::MAX; unsafe extern "C" { pub safe fn zx_clock_get_monotonic() -> zx_time_t; } ///////////// // Handles // ///////////// pub type zx_handle_t = u32; pub const ZX_HANDLE_INVALID: zx_handle_t = 0; unsafe extern "C" { pub fn zx_handle_close(handle: zx_handle_t) -> zx_status_t; } /// A safe wrapper around `zx_handle_t`. pub struct Handle { raw: zx_handle_t, } impl Handle { pub fn new(raw: zx_handle_t) -> Handle { Handle { raw } } pub fn raw(&self) -> zx_handle_t { self.raw } } impl Drop for Handle { fn drop(&mut self) { unsafe { zx_cvt(zx_handle_close(self.raw)).expect("Failed to close zx_handle_t"); } } } /////////// // Futex // /////////// pub type zx_futex_t = crate::sync::atomic::Atomic; unsafe extern "C" { pub fn zx_object_wait_one( handle: zx_handle_t, signals: zx_signals_t, timeout: zx_time_t, pending: *mut zx_signals_t, ) -> zx_status_t; pub fn zx_futex_wait( value_ptr: *const zx_futex_t, current_value: zx_futex_t, new_futex_owner: zx_handle_t, deadline: zx_time_t, ) -> zx_status_t; pub fn zx_futex_wake(value_ptr: *const zx_futex_t, wake_count: u32) -> zx_status_t; pub fn zx_futex_wake_single_owner(value_ptr: *const zx_futex_t) -> zx_status_t; pub safe fn zx_thread_self() -> zx_handle_t; } //////////////// // Properties // //////////////// pub const ZX_PROP_NAME: u32 = 3; unsafe extern "C" { pub fn zx_object_set_property( handle: zx_handle_t, property: u32, value: *const libc::c_void, value_size: libc::size_t, ) -> zx_status_t; } ///////////// // Signals // ///////////// pub type zx_signals_t = u32; pub const ZX_OBJECT_SIGNAL_3: zx_signals_t = 1 << 3; pub const ZX_TASK_TERMINATED: zx_signals_t = ZX_OBJECT_SIGNAL_3; ///////////////// // Object info // ///////////////// // The upper four bits gives the minor version. pub type zx_object_info_topic_t = u32; pub const ZX_INFO_PROCESS: zx_object_info_topic_t = 3 | (1 << 28); pub type zx_info_process_flags_t = u32; // Returned for topic ZX_INFO_PROCESS #[derive(Default)] #[repr(C)] pub struct zx_info_process_t { pub return_code: i64, pub start_time: zx_time_t, pub flags: zx_info_process_flags_t, pub reserved1: u32, } unsafe extern "C" { pub fn zx_object_get_info( handle: zx_handle_t, topic: u32, buffer: *mut c_void, buffer_size: size_t, actual_size: *mut size_t, avail: *mut size_t, ) -> zx_status_t; } /////////////// // Processes // /////////////// #[derive(Default)] #[repr(C)] pub struct fdio_spawn_action_t { pub action: u32, pub reserved0: u32, pub local_fd: i32, pub target_fd: i32, pub reserved1: u64, } unsafe extern "C" { pub fn fdio_spawn_etc( job: zx_handle_t, flags: u32, path: *const c_char, argv: *const *const c_char, envp: *const *const c_char, action_count: size_t, actions: *const fdio_spawn_action_t, process: *mut zx_handle_t, err_msg: *mut c_char, ) -> zx_status_t; pub fn fdio_fd_clone(fd: c_int, out_handle: *mut zx_handle_t) -> zx_status_t; pub fn fdio_fd_create(handle: zx_handle_t, fd: *mut c_int) -> zx_status_t; pub fn zx_task_kill(handle: zx_handle_t) -> zx_status_t; } // fdio_spawn_etc flags pub const FDIO_SPAWN_CLONE_JOB: u32 = 0x0001; pub const FDIO_SPAWN_CLONE_LDSVC: u32 = 0x0002; pub const FDIO_SPAWN_CLONE_NAMESPACE: u32 = 0x0004; pub const FDIO_SPAWN_CLONE_ENVIRON: u32 = 0x0010; pub const FDIO_SPAWN_CLONE_UTC_CLOCK: u32 = 0x0020; // fdio_spawn_etc actions pub const FDIO_SPAWN_ACTION_TRANSFER_FD: u32 = 0x0002; //////////// // Errors // //////////// pub type zx_status_t = i32; pub const ZX_OK: zx_status_t = 0; pub const ZX_ERR_NOT_SUPPORTED: zx_status_t = -2; pub const ZX_ERR_INVALID_ARGS: zx_status_t = -10; pub const ZX_ERR_BAD_HANDLE: zx_status_t = -11; pub const ZX_ERR_WRONG_TYPE: zx_status_t = -12; pub const ZX_ERR_BAD_STATE: zx_status_t = -20; pub const ZX_ERR_TIMED_OUT: zx_status_t = -21; pub fn zx_cvt(t: T) -> io::Result where T: TryInto + Copy, { if let Ok(status) = TryInto::try_into(t) { if status < 0 { Err(io::Error::from_raw_os_error(status)) } else { Ok(t) } } else { Err(io::Error::last_os_error()) } }