class Rex::Ui::Text::Input::Readline

This class implements standard input using readline against standard input. It supports tab completion.

Attributes

output[RW]

The output handle to use when displaying the prompt.

prompt[RW]

The prompt that is to be displayed.

Public Class Methods

new(tab_complete_proc = nil) click to toggle source

Initializes the readline-aware Input instance for text.

# File lib/rex/ui/text/input/readline.rb, line 20
def initialize(tab_complete_proc = nil)
  if(not Object.const_defined?('Readline'))
    begin
      require 'readline'
    rescue ::LoadError
      require 'readline_compatible'
    end
  end

  self.extend(::Readline)

  if (tab_complete_proc)
    ::Readline.basic_word_break_characters = "\x00"
    ::Readline.completion_proc = tab_complete_proc
    @rl_saved_proc = tab_complete_proc
  end
end

Public Instance Methods

fd() click to toggle source

Returns the output pipe handle

# File lib/rex/ui/text/input/readline.rb, line 101
def fd
  $stdin
end
gets() click to toggle source

Read a line from stdin

# File lib/rex/ui/text/input/readline.rb, line 67
def gets()
  begin
    self.fd.gets()
  rescue ::Errno::EINTR
    retry
  end
end
intrinsic_shell?() click to toggle source

Indicates that this input medium as a shell builtin, no need to extend.

# File lib/rex/ui/text/input/readline.rb, line 109
def intrinsic_shell?
  true
end
pgets() click to toggle source

Stick readline into a low-priority thread so that the scheduler doesn’t slow down other background threads. This is important when there are many active background jobs, such as when the user is running Karmetasploit

# File lib/rex/ui/text/input/readline.rb, line 80
def pgets()

  line = nil
  orig = Thread.current.priority

  begin
    Thread.current.priority = -20

    output.prompting
    line = ::Readline.readline(prompt, true)
    ::Readline::HISTORY.pop if (line and line.empty?)
  ensure
    Thread.current.priority = orig || 0
  end

  line
end
reset_tab_completion(tab_complete_proc = nil) click to toggle source

Reattach the original completion proc

# File lib/rex/ui/text/input/readline.rb, line 41
def reset_tab_completion(tab_complete_proc = nil)
  ::Readline.basic_word_break_characters = "\x00"
  ::Readline.completion_proc = tab_complete_proc || @rl_saved_proc
end
supports_readline() click to toggle source

Whether or not the input medium supports readline.

# File lib/rex/ui/text/input/readline.rb, line 49
def supports_readline
  true
end
sysread(len = 1) click to toggle source

Calls sysread on the standard input handle.

# File lib/rex/ui/text/input/readline.rb, line 56
def sysread(len = 1)
  begin
    self.fd.sysread(len)
  rescue ::Errno::EINTR
    retry
  end
end