2012-02-09 03:30:18 +00:00
|
|
|
require 'ffi'
|
|
|
|
|
|
|
|
require 'mach/types'
|
2012-01-15 14:08:17 +00:00
|
|
|
|
2012-01-15 14:02:53 +00:00
|
|
|
module Mach
|
2012-02-09 03:30:18 +00:00
|
|
|
extend Mach::Types
|
|
|
|
|
|
|
|
class MsgHeader < FFI::Struct
|
|
|
|
layout(:bits, :mach_msg_bits_t,
|
|
|
|
:size, :mach_msg_size_t,
|
|
|
|
:remote_port, :mach_port_t,
|
|
|
|
:local_port, :mach_port_t,
|
|
|
|
:reserved, :mach_msg_size_t,
|
|
|
|
:id, :mach_msg_id_t)
|
|
|
|
end
|
|
|
|
|
|
|
|
class MsgBody < FFI::Struct
|
|
|
|
layout(:descriptor_count, :mach_msg_size_t)
|
|
|
|
end
|
|
|
|
|
|
|
|
class MsgBase < FFI::Struct
|
|
|
|
layout(:header, MsgHeader,
|
|
|
|
:body, MsgBody)
|
|
|
|
end
|
|
|
|
|
|
|
|
class MsgTrailer < FFI::Struct
|
|
|
|
layout(:type, :mach_msg_trailer_type_t,
|
|
|
|
:size, :mach_msg_trailer_size_t)
|
|
|
|
end
|
|
|
|
|
|
|
|
class MsgPortDescriptor < FFI::Struct
|
|
|
|
layout(:name, :mach_port_t,
|
|
|
|
:pad1, :mach_msg_size_t, # FIXME: leave oout on __LP64__
|
|
|
|
:pad2, :uint16, # :uint
|
|
|
|
:disposition, :uint8, # :mach_msg_type_name_t
|
|
|
|
:type, :uint8) # :mach_msg_descriptor_type_t
|
|
|
|
end
|
|
|
|
|
|
|
|
SyncPolicy = enum( :fifo, 0x0,
|
|
|
|
:fixed_priority, 0x1,
|
|
|
|
:reversed, 0x2,
|
|
|
|
:order_mask, 0x3,
|
|
|
|
:lifo, 0x0 | 0x2, # um...
|
|
|
|
:max, 0x7 )
|
|
|
|
|
|
|
|
PortRight = enum( :send, 0,
|
|
|
|
:receive,
|
|
|
|
:send_once,
|
|
|
|
:port_set,
|
|
|
|
:dead_name,
|
|
|
|
:labelh,
|
|
|
|
:number )
|
|
|
|
|
|
|
|
# port type macro
|
|
|
|
def self.pt(*syms)
|
|
|
|
acc = 0
|
|
|
|
syms.each do |sym|
|
|
|
|
acc |= (1 << (PortRight[sym] + 16))
|
|
|
|
end
|
|
|
|
acc
|
|
|
|
end
|
|
|
|
|
|
|
|
PORT_NULL = 0
|
|
|
|
MSG_TIMEOUT_NONE = 0
|
|
|
|
|
|
|
|
PortType =
|
|
|
|
enum(:none, 0,
|
|
|
|
:send, pt(:send),
|
|
|
|
:receive, pt(:receive),
|
|
|
|
:send_once, pt(:send_once),
|
|
|
|
:port_set, pt(:port_set),
|
|
|
|
:dead_name, pt(:dead_name),
|
|
|
|
:labelh, pt(:labelh),
|
|
|
|
|
|
|
|
:send_receive, pt(:send, :receive),
|
|
|
|
:send_rights, pt(:send, :send_once),
|
|
|
|
:port_rights, pt(:send, :send_once, :receive),
|
|
|
|
:port_or_dead, pt(:send, :send_once, :receive, :dead_name),
|
|
|
|
:all_rights, pt(:send, :send_once, :receive, :dead_name, :port_set))
|
|
|
|
|
|
|
|
MsgType =
|
|
|
|
enum( :move_receive, 16, # must hold receive rights
|
|
|
|
:move_send, # must hold send rights
|
|
|
|
:move_send_once, # must hold sendonce rights
|
|
|
|
:copy_send, # must hold send rights
|
|
|
|
:make_send, # must hold receive rights
|
|
|
|
:make_send_once, # must hold receive rights
|
|
|
|
:copy_receive ) # must hold receive rights
|
|
|
|
|
|
|
|
SpecialPort =
|
|
|
|
enum( :kernel, 1,
|
|
|
|
:host,
|
|
|
|
:name,
|
|
|
|
:bootstrap )
|
|
|
|
|
|
|
|
KERN_SUCCESS = 0
|
|
|
|
|
|
|
|
|
2012-01-30 04:57:13 +00:00
|
|
|
# @return [Port] the original bootstrap port; different from that
|
|
|
|
# affected by {get,set}_special_port
|
|
|
|
def self.bootstrap_port
|
|
|
|
@bootstrap_port ||= Mach::Port.new(:port => Mach::Functions::bootstrap_port)
|
|
|
|
end
|
2012-01-15 14:02:53 +00:00
|
|
|
end
|
2012-02-09 03:30:18 +00:00
|
|
|
|
|
|
|
require 'mach/port'
|
|
|
|
require 'mach/semaphore'
|
|
|
|
require 'mach/task'
|
|
|
|
require 'mach/functions'
|