1 // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 #![allow(non_camel_case_types)]
18 use libc::{c_int, c_void};
20 pub type mx_handle_t = i32;
21 pub type mx_vaddr_t = usize;
22 pub type mx_rights_t = u32;
23 pub type mx_status_t = i32;
25 pub type mx_size_t = usize;
27 pub const MX_HANDLE_INVALID: mx_handle_t = 0;
29 pub type mx_time_t = u64;
30 pub const MX_TIME_INFINITE : mx_time_t = u64::MAX;
32 pub type mx_signals_t = u32;
34 pub const MX_OBJECT_SIGNAL_3 : mx_signals_t = 1 << 3;
36 pub const MX_TASK_TERMINATED : mx_signals_t = MX_OBJECT_SIGNAL_3;
38 pub const MX_RIGHT_SAME_RIGHTS : mx_rights_t = 1 << 31;
40 pub type mx_object_info_topic_t = u32;
42 pub const MX_INFO_PROCESS : mx_object_info_topic_t = 3;
44 pub fn mx_cvt<T>(t: T) -> io::Result<T> where T: TryInto<mx_status_t>+Copy {
45 if let Ok(status) = TryInto::try_into(t) {
47 Err(io::Error::from_raw_os_error(status))
52 Err(io::Error::last_os_error())
56 // Safe wrapper around mx_handle_t
62 pub fn new(raw: mx_handle_t) -> Handle {
68 pub fn raw(&self) -> mx_handle_t {
73 impl Drop for Handle {
75 unsafe { mx_cvt(mx_handle_close(self.raw)).expect("Failed to close mx_handle_t"); }
79 // Common MX_INFO header
82 pub struct mx_info_header_t {
83 pub topic: u32, // identifies the info struct
84 pub avail_topic_size: u16, // “native” size of the struct
85 pub topic_size: u16, // size of the returned struct (<=topic_size)
86 pub avail_count: u32, // number of records the kernel has
87 pub count: u32, // number of records returned (limited by buffer size)
92 pub struct mx_record_process_t {
93 pub return_code: c_int,
96 // Returned for topic MX_INFO_PROCESS
99 pub struct mx_info_process_t {
100 pub hdr: mx_info_header_t,
101 pub rec: mx_record_process_t,
105 static __magenta_job_default: mx_handle_t;
107 pub fn mx_task_kill(handle: mx_handle_t) -> mx_status_t;
109 pub fn mx_handle_close(handle: mx_handle_t) -> mx_status_t;
111 pub fn mx_handle_duplicate(handle: mx_handle_t, rights: mx_rights_t,
112 out: *const mx_handle_t) -> mx_handle_t;
114 pub fn mx_object_wait_one(handle: mx_handle_t, signals: mx_signals_t, timeout: mx_time_t,
115 pending: *mut mx_signals_t) -> mx_status_t;
117 pub fn mx_object_get_info(handle: mx_handle_t, topic: u32, buffer: *mut c_void,
118 buffer_size: mx_size_t, actual_size: *mut mx_size_t,
119 avail: *mut mx_size_t) -> mx_status_t;
122 pub fn mx_job_default() -> mx_handle_t {
123 unsafe { return __magenta_job_default; }
126 // From `enum special_handles` in system/ulib/launchpad/launchpad.c
127 // HND_LOADER_SVC = 0
129 pub const HND_SPECIAL_COUNT: usize = 2;
132 pub struct launchpad_t {
140 handles: *mut mx_handle_t,
141 handles_info: *mut u32,
147 vdso_base: mx_vaddr_t,
151 special_handles: [mx_handle_t; HND_SPECIAL_COUNT],
152 loader_message: bool,
156 pub fn launchpad_create(job: mx_handle_t, name: *const c_char,
157 lp: *mut *mut launchpad_t) -> mx_status_t;
159 pub fn launchpad_start(lp: *mut launchpad_t) -> mx_status_t;
161 pub fn launchpad_destroy(lp: *mut launchpad_t);
163 pub fn launchpad_arguments(lp: *mut launchpad_t, argc: c_int,
164 argv: *const *const c_char) -> mx_status_t;
166 pub fn launchpad_environ(lp: *mut launchpad_t, envp: *const *const c_char) -> mx_status_t;
168 pub fn launchpad_clone_mxio_root(lp: *mut launchpad_t) -> mx_status_t;
170 pub fn launchpad_clone_mxio_cwd(lp: *mut launchpad_t) -> mx_status_t;
172 pub fn launchpad_clone_fd(lp: *mut launchpad_t, fd: c_int, target_fd: c_int) -> mx_status_t;
174 pub fn launchpad_transfer_fd(lp: *mut launchpad_t, fd: c_int, target_fd: c_int) -> mx_status_t;
176 pub fn launchpad_elf_load(lp: *mut launchpad_t, vmo: mx_handle_t) -> mx_status_t;
178 pub fn launchpad_add_vdso_vmo(lp: *mut launchpad_t) -> mx_status_t;
180 pub fn launchpad_load_vdso(lp: *mut launchpad_t, vmo: mx_handle_t) -> mx_status_t;
182 pub fn launchpad_vmo_from_file(filename: *const c_char) -> mx_handle_t;
187 #[allow(unused)] pub const ERR_INTERNAL: mx_status_t = -1;
189 // ERR_NOT_SUPPORTED: The operation is not implemented, supported,
191 #[allow(unused)] pub const ERR_NOT_SUPPORTED: mx_status_t = -2;
193 // ERR_NO_RESOURCES: The system was not able to allocate some resource
194 // needed for the operation.
195 #[allow(unused)] pub const ERR_NO_RESOURCES: mx_status_t = -5;
197 // ERR_NO_MEMORY: The system was not able to allocate memory needed
198 // for the operation.
199 #[allow(unused)] pub const ERR_NO_MEMORY: mx_status_t = -4;
201 // ERR_CALL_FAILED: The second phase of mx_channel_call(; did not complete
203 #[allow(unused)] pub const ERR_CALL_FAILED: mx_status_t = -53;
205 // ======= Parameter errors =======
206 // ERR_INVALID_ARGS: an argument is invalid, ex. null pointer
207 #[allow(unused)] pub const ERR_INVALID_ARGS: mx_status_t = -10;
209 // ERR_WRONG_TYPE: The subject of the operation is the wrong type to
210 // perform the operation.
211 // Example: Attempting a message_read on a thread handle.
212 #[allow(unused)] pub const ERR_WRONG_TYPE: mx_status_t = -54;
214 // ERR_BAD_SYSCALL: The specified syscall number is invalid.
215 #[allow(unused)] pub const ERR_BAD_SYSCALL: mx_status_t = -11;
217 // ERR_BAD_HANDLE: A specified handle value does not refer to a handle.
218 #[allow(unused)] pub const ERR_BAD_HANDLE: mx_status_t = -12;
220 // ERR_OUT_OF_RANGE: An argument is outside the valid range for this
222 #[allow(unused)] pub const ERR_OUT_OF_RANGE: mx_status_t = -13;
224 // ERR_BUFFER_TOO_SMALL: A caller provided buffer is too small for
226 #[allow(unused)] pub const ERR_BUFFER_TOO_SMALL: mx_status_t = -14;
228 // ======= Precondition or state errors =======
229 // ERR_BAD_STATE: operation failed because the current state of the
230 // object does not allow it, or a precondition of the operation is
232 #[allow(unused)] pub const ERR_BAD_STATE: mx_status_t = -20;
234 // ERR_NOT_FOUND: The requested entity is not found.
235 #[allow(unused)] pub const ERR_NOT_FOUND: mx_status_t = -3;
237 // ERR_ALREADY_EXISTS: An object with the specified identifier
239 // Example: Attempting to create a file when a file already exists
241 #[allow(unused)] pub const ERR_ALREADY_EXISTS: mx_status_t = -15;
243 // ERR_ALREADY_BOUND: The operation failed because the named entity
244 // is already owned or controlled by another entity. The operation
245 // could succeed later if the current owner releases the entity.
246 #[allow(unused)] pub const ERR_ALREADY_BOUND: mx_status_t = -16;
248 // ERR_TIMED_OUT: The time limit for the operation elapsed before
249 // the operation completed.
250 #[allow(unused)] pub const ERR_TIMED_OUT: mx_status_t = -23;
252 // ERR_HANDLE_CLOSED: a handle being waited on was closed
253 #[allow(unused)] pub const ERR_HANDLE_CLOSED: mx_status_t = -24;
255 // ERR_REMOTE_CLOSED: The operation failed because the remote end
256 // of the subject of the operation was closed.
257 #[allow(unused)] pub const ERR_REMOTE_CLOSED: mx_status_t = -25;
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)] pub const ERR_UNAVAILABLE: mx_status_t = -26;
266 // ERR_SHOULD_WAIT: The operation cannot be performed currently but
267 // potentially could succeed if the caller waits for a prerequisite
268 // to be satisfied, for example waiting for a handle to be readable
270 // Example: Attempting to read from a message pipe that has no
271 // messages waiting but has an open remote will return ERR_SHOULD_WAIT.
272 // Attempting to read from a message pipe that has no messages waiting
273 // and has a closed remote end will return ERR_REMOTE_CLOSED.
274 #[allow(unused)] pub const ERR_SHOULD_WAIT: mx_status_t = -27;
276 // ======= Permission check errors =======
277 // ERR_ACCESS_DENIED: The caller did not have permission to perform
278 // the specified operation.
279 #[allow(unused)] pub const ERR_ACCESS_DENIED: mx_status_t = -30;
281 // ======= Input-output errors =======
282 // ERR_IO: Otherwise unspecified error occurred during I/O.
283 #[allow(unused)] pub const ERR_IO: mx_status_t = -40;
285 // ERR_REFUSED: The entity the I/O operation is being performed on
286 // rejected the operation.
287 // Example: an I2C device NAK'ing a transaction or a disk controller
288 // rejecting an invalid command.
289 #[allow(unused)] pub const ERR_IO_REFUSED: mx_status_t = -41;
291 // ERR_IO_DATA_INTEGRITY: The data in the operation failed an integrity
292 // check and is possibly corrupted.
293 // Example: CRC or Parity error.
294 #[allow(unused)] pub const ERR_IO_DATA_INTEGRITY: mx_status_t = -42;
296 // ERR_IO_DATA_LOSS: The data in the operation is currently unavailable
297 // and may be permanently lost.
298 // Example: A disk block is irrecoverably damaged.
299 #[allow(unused)] pub const ERR_IO_DATA_LOSS: mx_status_t = -43;
301 // Filesystem specific errors
302 #[allow(unused)] pub const ERR_BAD_PATH: mx_status_t = -50;
303 #[allow(unused)] pub const ERR_NOT_DIR: mx_status_t = -51;
304 #[allow(unused)] pub const ERR_NOT_FILE: mx_status_t = -52;