Skip to content

Commit 0feed15

Browse files
committed
device/tty: Fix IGNCR and INLCR handling
1 parent a970490 commit 0feed15

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

kernel/src/device/input/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ fn key_byte(code: u16, state: &KeyboardState) -> Option<u8> {
501501
input::KEY_KPASTERISK => Some(b'*'),
502502
input::KEY_KPMINUS => Some(b'-'),
503503
input::KEY_KPPLUS => Some(b'+'),
504-
input::KEY_KPENTER | input::KEY_ENTER => Some(b'\n'),
504+
input::KEY_KPENTER | input::KEY_ENTER => Some(b'\r'),
505505
input::KEY_BACKSPACE => Some(0x7f),
506506
input::KEY_TAB => Some(b'\t'),
507507
input::KEY_ESC => Some(0x1b),
@@ -534,7 +534,7 @@ fn ctrl_key_byte(code: u16) -> Option<u8> {
534534
input::KEY_MINUS => Some(0x1f),
535535
input::KEY_2 => Some(0x00),
536536
input::KEY_8 => Some(0x7f),
537-
input::KEY_KPENTER | input::KEY_ENTER => Some(b'\n'),
537+
input::KEY_KPENTER | input::KEY_ENTER => Some(b'\r'),
538538
input::KEY_BACKSPACE => Some(0x7f),
539539
input::KEY_TAB => Some(b'\t'),
540540
input::KEY_ESC => Some(0x1b),

kernel/src/device/tty/mod.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ impl LineDiscipline {
7777
self.termios.c_iflag & ICRNL != 0
7878
}
7979

80+
fn is_igncr(&self) -> bool {
81+
self.termios.c_iflag & IGNCR != 0
82+
}
83+
84+
fn is_inlcr(&self) -> bool {
85+
self.termios.c_iflag & INLCR != 0
86+
}
87+
8088
fn cc(&self, idx: u32) -> u8 {
8189
self.termios.c_cc[idx as usize]
8290
}
@@ -98,8 +106,17 @@ impl LineDiscipline {
98106

99107
pub fn input_char(&mut self, mut byte: u8, tty: &Tty) -> Vec<u8> {
100108
let mut output = Vec::new();
101-
if self.is_icrnl() && byte == b'\r' {
102-
byte = b'\n';
109+
110+
// CR/NL input translation.
111+
if byte == b'\r' {
112+
if self.is_igncr() {
113+
return output;
114+
}
115+
if self.is_icrnl() {
116+
byte = b'\n';
117+
}
118+
} else if byte == b'\n' && self.is_inlcr() {
119+
byte = b'\r';
103120
}
104121

105122
// Signal generation.

0 commit comments

Comments
 (0)