//! This module corresponds to `mach/message.h`. use kern_return::kern_return_t; use port::{mach_port_name_t, mach_port_t}; use vm_types::{integer_t, natural_t}; pub type mach_msg_timeout_t = natural_t; pub type mach_msg_bits_t = ::libc::c_uint; pub type mach_msg_id_t = integer_t; pub type mach_msg_size_t = natural_t; pub type mach_msg_copy_options_t = ::libc::c_uint; pub type mach_msg_descriptor_type_t = ::libc::c_uint; pub type mach_msg_type_name_t = ::libc::c_uint; pub type mach_msg_trailer_type_t = ::libc::c_uint; pub type mach_msg_trailer_size_t = ::libc::c_uint; pub type mach_msg_option_t = integer_t; pub type mach_msg_type_number_t = natural_t; pub type mach_msg_type_size_t = natural_t; pub type mach_msg_return_t = kern_return_t; pub const MACH_MSG_TIMEOUT_NONE: mach_msg_timeout_t = 0; pub const MACH_MSGH_BITS_ZERO: mach_msg_bits_t = 0x0000_0000; pub const MACH_MSGH_BITS_REMOTE_MASK: mach_msg_bits_t = 0x0000_001f; pub const MACH_MSGH_BITS_LOCAL_MASK: mach_msg_bits_t = 0x0000_1f00; pub const MACH_MSGH_BITS_VOUCHER_MASK: mach_msg_bits_t = 0x001f_0000; pub const MACH_MSGH_BITS_PORTS_MASK: mach_msg_bits_t = MACH_MSGH_BITS_REMOTE_MASK | MACH_MSGH_BITS_LOCAL_MASK | MACH_MSGH_BITS_VOUCHER_MASK; pub const MACH_MSGH_BITS_COMPLEX: mach_msg_bits_t = 0x8000_0000; pub const MACH_MSGH_BITS_USER: mach_msg_bits_t = 0x801f_1f1f; #[allow(non_snake_case)] pub fn MACH_MSGH_BITS(remote: mach_msg_bits_t, local: mach_msg_bits_t) -> mach_msg_bits_t { remote | (local << 8) } pub const MACH_MSG_TYPE_MOVE_RECEIVE: mach_msg_type_name_t = 16; pub const MACH_MSG_TYPE_MOVE_SEND: mach_msg_type_name_t = 17; pub const MACH_MSG_TYPE_MOVE_SEND_ONCE: mach_msg_type_name_t = 18; pub const MACH_MSG_TYPE_COPY_SEND: mach_msg_type_name_t = 19; pub const MACH_MSG_TYPE_MAKE_SEND: mach_msg_type_name_t = 20; pub const MACH_MSG_TYPE_MAKE_SEND_ONCE: mach_msg_type_name_t = 21; pub const MACH_MSG_TYPE_COPY_RECEIVE: mach_msg_type_name_t = 22; pub const MACH_MSG_TYPE_DISPOSE_RECEIVE: mach_msg_type_name_t = 24; pub const MACH_MSG_TYPE_DISPOSE_SEND: mach_msg_type_name_t = 25; pub const MACH_MSG_TYPE_DISPOSE_SEND_ONCE: mach_msg_type_name_t = 26; pub const MACH_MSG_PHYSICAL_COPY: mach_msg_copy_options_t = 0; pub const MACH_MSG_VIRTUAL_COPY: mach_msg_copy_options_t = 1; pub const MACH_MSG_ALLOCATE: mach_msg_copy_options_t = 2; pub const MACH_MSG_PORT_DESCRIPTOR: mach_msg_descriptor_type_t = 0; pub const MACH_MSG_OOL_DESCRIPTOR: mach_msg_descriptor_type_t = 1; pub const MACH_MSG_OOL_PORTS_DESCRIPTOR: mach_msg_descriptor_type_t = 2; pub const MACH_MSG_OOL_VOLATILE_DESCRIPTOR: mach_msg_descriptor_type_t = 3; pub const MACH_MSG_OPTION_NONE: mach_msg_option_t = 0x0000_0000; pub const MACH_SEND_MSG: mach_msg_option_t = 0x0000_0001; pub const MACH_RCV_MSG: mach_msg_option_t = 0x0000_0002; pub const MACH_RCV_LARGE: mach_msg_option_t = 0x0000_0004; pub const MACH_RCV_LARGE_IDENTITY: mach_msg_option_t = 0x0000_0008; pub const MACH_SEND_TIMEOUT: mach_msg_option_t = 0x0000_0010; pub const MACH_SEND_INTERRUPT: mach_msg_option_t = 0x0000_0040; pub const MACH_SEND_NOTIFY: mach_msg_option_t = 0x0000_0080; pub const MACH_SEND_ALWAYS: mach_msg_option_t = 0x0001_0000; pub const MACH_SEND_TRAILER: mach_msg_option_t = 0x0002_0000; pub const MACH_SEND_NOIMPORTANCE: mach_msg_option_t = 0x0004_0000; pub const MACH_SEND_NODENAP: mach_msg_option_t = MACH_SEND_NOIMPORTANCE; pub const MACH_SEND_IMPORTANCE: mach_msg_option_t = 0x0008_0000; pub const MACH_RCV_TIMEOUT: mach_msg_option_t = 0x0000_0100; pub const MACH_RCV_NOTIFY: mach_msg_option_t = 0x0000_0000; pub const MACH_RCV_INTERRUPT: mach_msg_option_t = 0x0000_0400; pub const MACH_RCV_VOUCHER: mach_msg_option_t = 0x0000_0800; pub const MACH_RCV_OVERWRITE: mach_msg_option_t = 0x0000_0000; pub const MACH_MSG_SUCCESS: mach_msg_return_t = 0x0000_0000; pub const MACH_MSG_MASK: mach_msg_return_t = 0x0000_3e00; pub const MACH_MSG_IPC_SPACE: mach_msg_return_t = 0x0000_2000; pub const MACH_MSG_VM_SPACE: mach_msg_return_t = 0x0000_1000; pub const MACH_MSG_IPC_KERNEL: mach_msg_return_t = 0x0000_0800; pub const MACH_MSG_VM_KERNEL: mach_msg_return_t = 0x0000_0400; pub const MACH_SEND_IN_PROGRESS: mach_msg_return_t = 0x1000_0001; pub const MACH_SEND_INVALID_DATA: mach_msg_return_t = 0x1000_0002; pub const MACH_SEND_INVALID_DEST: mach_msg_return_t = 0x1000_0003; pub const MACH_SEND_TIMED_OUT: mach_msg_return_t = 0x1000_0004; pub const MACH_SEND_INVALID_VOUCHER: mach_msg_return_t = 0x1000_0005; pub const MACH_SEND_INTERRUPTED: mach_msg_return_t = 0x1000_0007; pub const MACH_SEND_MSG_TOO_SMALL: mach_msg_return_t = 0x1000_0008; pub const MACH_SEND_INVALID_REPLY: mach_msg_return_t = 0x1000_0009; pub const MACH_SEND_INVALID_RIGHT: mach_msg_return_t = 0x1000_000a; pub const MACH_SEND_INVALID_NOTIFY: mach_msg_return_t = 0x1000_000b; pub const MACH_SEND_INVALID_MEMORY: mach_msg_return_t = 0x1000_000c; pub const MACH_SEND_NO_BUFFER: mach_msg_return_t = 0x1000_000d; pub const MACH_SEND_TOO_LARGE: mach_msg_return_t = 0x1000_000e; pub const MACH_SEND_INVALID_TYPE: mach_msg_return_t = 0x1000_000f; pub const MACH_SEND_INVALID_HEADER: mach_msg_return_t = 0x1000_0010; pub const MACH_SEND_INVALID_TRAILER: mach_msg_return_t = 0x1000_0011; pub const MACH_SEND_INVALID_RT_OOL_SIZE: mach_msg_return_t = 0x1000_0015; pub const MACH_RCV_IN_PROGRESS: mach_msg_return_t = 0x1000_4001; pub const MACH_RCV_INVALID_NAME: mach_msg_return_t = 0x1000_4002; pub const MACH_RCV_TIMED_OUT: mach_msg_return_t = 0x1000_4003; pub const MACH_RCV_TOO_LARGE: mach_msg_return_t = 0x1000_4004; pub const MACH_RCV_INTERRUPTED: mach_msg_return_t = 0x1000_4005; pub const MACH_RCV_PORT_CHANGED: mach_msg_return_t = 0x1000_4006; pub const MACH_RCV_INVALID_NOTIFY: mach_msg_return_t = 0x1000_4007; pub const MACH_RCV_INVALID_DATA: mach_msg_return_t = 0x1000_4008; pub const MACH_RCV_PORT_DIED: mach_msg_return_t = 0x1000_4009; pub const MACH_RCV_IN_SET: mach_msg_return_t = 0x1000_400a; pub const MACH_RCV_HEADER_ERROR: mach_msg_return_t = 0x1000_400b; pub const MACH_RCV_BODY_ERROR: mach_msg_return_t = 0x1000_400c; pub const MACH_RCV_INVALID_TYPE: mach_msg_return_t = 0x1000_400d; pub const MACH_RCV_SCATTER_SMALL: mach_msg_return_t = 0x1000_400e; pub const MACH_RCV_INVALID_TRAILER: mach_msg_return_t = 0x1000_400f; pub const MACH_RCV_IN_PROGRESS_TIMED: mach_msg_return_t = 0x1000_4011; #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_header_t { pub msgh_bits: mach_msg_bits_t, pub msgh_size: mach_msg_size_t, pub msgh_remote_port: mach_port_t, pub msgh_local_port: mach_port_t, pub msgh_voucher_port: mach_port_name_t, pub msgh_id: mach_msg_id_t, } #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_body_t { pub msgh_descriptor_count: mach_msg_size_t, } #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_base_t { pub header: mach_msg_header_t, pub body: mach_msg_body_t, } pub const MACH_MSG_TRAILER_FORMAT_0: mach_msg_trailer_type_t = 0; #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_trailer_t { pub msgh_trailer_type: mach_msg_trailer_type_t, pub msgh_trailer_size: mach_msg_trailer_size_t, } #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_port_descriptor_t { pub name: mach_port_t, pub pad1: mach_msg_size_t, pub pad2: u16, pub disposition: u8, // mach_msg_type_name_t bitfield pub type_: u8, // mach_msg_descriptor_type_t bitfield } impl mach_msg_port_descriptor_t { pub fn new(name: mach_port_t, disposition: mach_msg_type_name_t) -> Self { Self { name, pad1: 0, pad2: 0, disposition: disposition as u8, type_: MACH_MSG_PORT_DESCRIPTOR as u8, } } } #[repr(C)] #[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_ool_descriptor_t { pub address: *mut ::libc::c_void, #[cfg(not(target_pointer_width = "64"))] pub size: mach_msg_size_t, pub deallocate: u8, // boolean_t bitfield pub copy: u8, // mach_msg_copy_options_t bitfield pub pad1: u8, pub type_: u8, // mach_msg_descriptor_type_t bitfield #[cfg(target_pointer_width = "64")] pub size: mach_msg_size_t, } impl mach_msg_ool_descriptor_t { pub fn new( address: *mut ::libc::c_void, deallocate: bool, copy: mach_msg_copy_options_t, size: u32, ) -> Self { Self { address, deallocate: if deallocate { 1 } else { 0 }, copy: copy as u8, pad1: 0, type_: MACH_MSG_OOL_DESCRIPTOR as u8, size, } } } #[repr(C)] #[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)] pub struct mach_msg_ool_ports_descriptor_t { pub address: *mut ::libc::c_void, #[cfg(not(target_pointer_width = "64"))] pub count: mach_msg_size_t, pub deallocate: u8, // boolean_t bitfield pub copy: u8, // mach_msg_copy_options_t bitfield pub disposition: u8, // mach_msg_type_name_t bitfield pub type_: u8, // mach_msg_descriptor_type_t bitfield #[cfg(target_pointer_width = "64")] pub count: mach_msg_size_t, } extern "C" { pub fn mach_msg( msg: *mut mach_msg_header_t, option: mach_msg_option_t, send_size: mach_msg_size_t, recv_size: mach_msg_size_t, recv_name: mach_port_name_t, timeout: mach_msg_timeout_t, notify: mach_port_name_t, ) -> mach_msg_return_t; // from mach/mach.h pub fn mach_msg_send(msg: *mut mach_msg_header_t) -> mach_msg_return_t; pub fn mach_msg_destroy(msg: *mut mach_msg_header_t); }