def direct_channel( local_port, remote_host, remote_port,
handler, *data )
writer = @buffers.writer
writer.write_string remote_host
writer.write_long remote_port.to_i
writer.write_string "127.0.0.1"
writer.write_long local_port.to_i
@direct_channel_count += 1
@open_direct_channel_count += 1
if @log.debug?
@log.debug "opening direct channel for " +
"#{local_port}:#{remote_host}:#{remote_port}"
end
c = @connection.open_channel( 'direct-tcpip', writer ) do |channel|
if @log.debug?
@log.debug "direct channel confirmed for " +
"#{local_port}:#{remote_host}:#{remote_port}"
end
if handler.respond_to?( :on_receive )
channel.on_data( &handler.method(:on_receive) )
end
if handler.respond_to?( :on_eof )
channel.on_eof( &handler.method(:on_eof) )
end
channel.on_close do |ch|
@open_direct_channel_count -= 1
handler.on_close( ch ) if handler.respond_to?( :on_close )
end
if handler.respond_to?( :confirm )
handler.confirm( channel, local_port, remote_host,
remote_port, *data )
end
if handler.respond_to?( :process )
Thread.new { handler.process( channel ) }
end
end
c.on_confirm_failed do |channel, code,desc,lang|
raise Net::SSH::Exception, "could not open direct channel for " +
"#{local_port}:#{remote_host}:#{remote_port} (#{code}, #{desc})"
end
nil
end