diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 199 |
1 files changed, 199 insertions, 0 deletions
@@ -301,3 +301,202 @@ pub enum ExtendedData { /// Discard all extended data as it arrives. Ignore = raw::LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE as isize, } + +/// The modes described in <https://tools.ietf.org/html/rfc4250#section-4.5.2> +#[allow(non_camel_case_types)] +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum PtyModeOpcode { + /// Indicates end of options. + TTY_OP_END = 0, + /// Interrupt character; 255 if none. Similarly for the other characters. Not all of these characters are supported on all systems. + VINTR = 1, + /// The quit character (sends SIGQUIT signal on POSIX systems). + VQUIT = 2, + /// Erase the character to left of the cursor. + VERASE = 3, + /// Kill the current input line. + VKILL = 4, + /// End-of-file character (sends EOF from the terminal). + VEOF = 5, + /// End-of-line character in addition to carriage return and/or linefeed. + VEOL = 6, + /// Additional end-of-line character. + VEOL2 = 7, + /// Continues paused output (normally control-Q). + VSTART = 8, + /// Pauses output (normally control-S). + VSTOP = 9, + /// Suspends the current program. + VSUSP = 10, + /// Another suspend character. + VDSUSP = 11, + /// Reprints the current input line. + VREPRINT = 12, + /// Erases a word left of cursor. + VWERASE = 13, + /// Enter the next character typed literally, even if it is a special character + VLNEXT = 14, + /// Character to flush output. + VFLUSH = 15, + /// Switch to a different shell layer. + VSWTCH = 16, + /// Prints system status line (load, command, pid, etc). + VSTATUS = 17, + /// Toggles the flushing of terminal output. + VDISCARD = 18, + /// The ignore parity flag. The parameter SHOULD be 0 if this flag is FALSE, and 1 if it is TRUE. + IGNPAR = 30, + /// Mark parity and framing errors. + PARMRK = 31, + /// Enable checking of parity errors. + INPCK = 32, + /// Strip 8th bit off characters. + ISTRIP = 33, + /// Map NL into CR on input. + INLCR = 34, + /// Ignore CR on input. + IGNCR = 35, + /// Map CR to NL on input. + ICRNL = 36, + /// Translate uppercase characters to lowercase. + IUCLC = 37, + /// Enable output flow control. + IXON = 38, + /// Any char will restart after stop. + IXANY = 39, + /// Enable input flow control. + IXOFF = 49, + /// Ring bell on input queue full. + IMAXBEL = 41, + /// Enable signals INTR, QUIT, [D]SUSP. + ISIG = 50, + /// Canonicalize input lines. + ICANON = 51, + + /// Enable input and output of uppercase characters by preceding their lowercase equivalents with "\". + XCASE = 52, + /// Enable echoing. + ECHO = 53, + /// Visually erase chars. + ECHOE = 54, + /// Kill character discards current line. + ECHOK = 55, + /// Echo NL even if ECHO is off. + ECHONL = 56, + /// Don't flush after interrupt. + NOFLSH = 57, + /// Stop background jobs from output. + TOSTOP = 58, + /// Enable extensions. + IEXTEN = 59, + /// Echo control characters as ^(Char). + ECHOCTL = 60, + /// Visual erase for line kill. + ECHOKE = 61, + /// Retype pending input. + PENDIN = 62, + /// Enable output processing. + OPOST = 70, + /// Convert lowercase to uppercase. + OLCUC = 71, + /// Map NL to CR-NL. + ONLCR = 72, + /// Translate carriage return to newline (output). + OCRNL = 73, + /// Translate newline to carriage return-newline (output). + ONOCR = 74, + /// Newline performs a carriage return (output). + ONLRET = 75, + /// 7 bit mode. + CS7 = 90, + /// 8 bit mode. + CS8 = 91, + /// Parity enable. + PARENB = 92, + /// Odd parity, else even. + PARODD = 93, + + /// Specifies the input baud rate in bits per second. + TTY_OP_ISPEED = 128, + /// Specifies the output baud rate in bits per second. + TTY_OP_OSPEED = 129, +} + +/// An opcode for setting a Pty terminal mode +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum ExtensiblePtyModeOpcode { + /// Use one of the modes specified by RFC 4250 + Mode(PtyModeOpcode), + /// Use a mode not reflected by RFC 4250 + Extended(u8), +} + +impl From<PtyModeOpcode> for ExtensiblePtyModeOpcode { + fn from(op: PtyModeOpcode) -> ExtensiblePtyModeOpcode { + ExtensiblePtyModeOpcode::Mode(op) + } +} + +impl From<u8> for ExtensiblePtyModeOpcode { + fn from(op: u8) -> ExtensiblePtyModeOpcode { + ExtensiblePtyModeOpcode::Extended(op) + } +} + +impl ExtensiblePtyModeOpcode { + fn as_opcode(&self) -> u8 { + match self { + ExtensiblePtyModeOpcode::Mode(m) => *m as u8, + ExtensiblePtyModeOpcode::Extended(op) => *op, + } + } +} + +/// Encodes modes for Pty allocation requests. +/// The modes documented in <https://tools.ietf.org/html/rfc4250#section-4.5> +/// are supported. +pub struct PtyModes { + data: Vec<u8>, +} + +impl PtyModes { + /// Construct a PtyModes instance so that you can specify values for + /// various modes + pub fn new() -> Self { + Self { data: vec![] } + } + + /// Set a mode to an arbitrary u32 value + pub fn set_u32<O: Into<ExtensiblePtyModeOpcode>>(&mut self, option: O, value: u32) { + let data = [ + option.into().as_opcode(), + ((value >> 24) & 0xff) as u8, + ((value >> 16) & 0xff) as u8, + ((value >> 8) & 0xff) as u8, + (value & 0xff) as u8, + ]; + self.data.extend_from_slice(&data); + } + + /// Set a mode to a boolean value + pub fn set_boolean<O: Into<ExtensiblePtyModeOpcode>>(&mut self, option: O, value: bool) { + self.set_u32(option, if value { 1 } else { 0 }) + } + + /// Set a mode to a character value. + /// If the character is None it is set to 255 to indicate that it + /// is disabled. + /// While this interface and the protocol accept unicode characters + /// of up to 32 bits in width, these options likely only work for + /// characters in the 7-bit ascii range. + pub fn set_character<O: Into<ExtensiblePtyModeOpcode>>(&mut self, option: O, c: Option<char>) { + self.set_u32(option, c.map(|c| c as u32).unwrap_or(255)) + } + + /// Finish accumulating modes and return the encoded + /// byte stream suitable for use in the ssh2 protocol + pub fn finish(mut self) -> Vec<u8> { + self.data.push(PtyModeOpcode::TTY_OP_END as u8); + self.data + } +} |