def handle_for(fd_or_io)
if fd_or_io.kind_of?(IO) || fd_or_io.respond_to?(:fileno)
if ChildProcess.jruby?
handle = ChildProcess::JRuby.windows_handle_for(fd_or_io)
else
handle = get_osfhandle(fd_or_io.fileno)
end
elsif fd_or_io.kind_of?(Fixnum)
handle = get_osfhandle(fd_or_io)
elsif fd_or_io.respond_to?(:to_io)
io = fd_or_io.to_io
unless io.kind_of?(IO)
raise TypeError, "expected #to_io to return an instance of IO"
end
handle = get_osfhandle(io.fileno)
else
raise TypeError, "invalid type: #{fd_or_io.inspect}"
end
if handle == INVALID_HANDLE_VALUE
raise Error, last_error_message
end
FFI::Pointer.new handle
end