process_shared/lib/mach/error.rb

53 lines
1.1 KiB
Ruby

require 'ffi'
require 'mach/functions'
module Mach
class Error < StandardError
class INVALID_ADDRESS < Error; end
class PROTECTION_FAILURE < Error; end
class NO_SPACE < Error; end
class INVALID_ARGUMENT < Error; end
class INVALID_NAME < Error; end
class FAILURE < Error; end
include Functions
def self.new(msg, errno)
klass = case errno
when 1; then INVALID_ADDRESS
when 2; then PROTECTION_FAILURE
when 3; then NO_SPACE
when 4; then INVALID_ARGUMENT
when 5; then FAILURE
when 15; then INVALID_NAME
else FAILURE
end
e = klass.allocate
e.send(:initialize, msg, errno)
e
end
attr_reader :errno
def initialize(msg, errno)
super(msg)
@errno = errno
end
def to_s
"#{super}: #{error_string(errno)}"
end
protected
# NOTE: api does not say this string must be freed; assuming it
# does not
def error_string(errno)
ptr = mach_error_string(errno)
ptr.null? ? nil : ptr.read_string()
end
end
end