Method: Aggkit::ChildProcess::Windows::Lib.handle_for

Defined in:
lib/aggkit/childprocess/windows/lib.rb

.handle_for(fd_or_io) ⇒ Object



305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# File 'lib/aggkit/childprocess/windows/lib.rb', line 305

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?(Integer)
    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