Subject: [ruby-ffi] Unable to detect failure with reentrant function on Linux |
From: Daniel Berger |
Date: 6/12/10 9:38 PM |
To: ruby-ffi |
Hi,
Ruby 1.8.6
FFI 0.6.3
I cannot seem to detect a failure with getprotobynumber_r on Linux
when I intentionally pass it a bogus value. Instead, it returns the
last value of /etc/protocols.
What am I doing wrong?
require 'ffi'
module Net
class Proto
extend FFI::Library
unless RUBY_PLATFORM == 'java' && JRUBY_VERSION.to_f < 1.5
ffi_lib(FFI::Library::LIBC)
end
class ProtocolStruct < FFI::Struct
layout(
:p_name, :string,
:p_aliases, :pointer,
:p_proto, :int
)
end
attach_function 'setprotoent', [:int], :void
attach_function 'endprotoent', [], :void
attach_function 'getprotobynumber_r',
[:int, :pointer, :string, :long, :pointer], :int
def self.getprotobynumber(protocol)
raise TypeError unless protocol.is_a?(Integer)
pptr = FFI::MemoryPointer.new(ProtocolStruct.size)
qptr = FFI::MemoryPointer.new(ProtocolStruct.size)
buf = 1.chr * 1024
begin
setprotoent(0)
int = getprotobynumber_r(protocol, pptr, buf, buf.size, qptr)
ensure
endprotoent()
end
int > 0 || qptr.null? ? nil : ProtocolStruct.new(pptr)[:p_name]
end
end
end
p Net::Proto.getprotobynumber(999999999) # should be nil
Regards,
Dan