Update to latest line_discipline to handle EOF correctly
This commit is contained in:
parent
2fad35bcd7
commit
fabf69b353
21
src/main.rs
21
src/main.rs
@ -42,17 +42,22 @@ impl Pty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn read_slave(&self, len: usize) -> Vec<u8> {
|
fn read_slave(&self, len: usize) -> Vec<u8> {
|
||||||
while !self.input_buffer.lock().contains(&b'\n') {
|
while self.input_buffer.lock().is_empty() {
|
||||||
ipc::process_messages();
|
ipc::process_messages();
|
||||||
let mut input_buffer = self.input_buffer.lock();
|
let mut input_buffer = self.input_buffer.lock();
|
||||||
input_buffer.extend_from_slice(&self.line_discipline.lock().get_program_input());
|
let input = self.line_discipline.lock().get_program_input();
|
||||||
|
let Some(input) = input else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
if input.is_empty() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
input_buffer.extend_from_slice(&input);
|
||||||
}
|
}
|
||||||
let mut input_buffer = self.input_buffer.lock();
|
let mut input_buffer = self.input_buffer.lock();
|
||||||
input_buffer.extend_from_slice(&self.line_discipline.lock().get_program_input());
|
input_buffer.extend_from_slice(&self.line_discipline.lock().get_program_input().unwrap_or_default());
|
||||||
let Some(line_end) = input_buffer.iter().position(|&x| x == b'\n') else {
|
let buf_len = input_buffer.len();
|
||||||
return Vec::new();
|
let rem_buf = input_buffer.split_off(usize::min(len, buf_len));
|
||||||
};
|
|
||||||
let rem_buf = input_buffer.split_off(usize::min(len, line_end + 1));
|
|
||||||
std::mem::replace(&mut *input_buffer, rem_buf)
|
std::mem::replace(&mut *input_buffer, rem_buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +68,7 @@ impl Pty {
|
|||||||
fn curr_slave_poll(&self) -> PollEvents {
|
fn curr_slave_poll(&self) -> PollEvents {
|
||||||
self.input_buffer
|
self.input_buffer
|
||||||
.lock()
|
.lock()
|
||||||
.extend_from_slice(&self.line_discipline.lock().get_program_input());
|
.extend_from_slice(&self.line_discipline.lock().get_program_input().unwrap_or_default());
|
||||||
let mut events = PollEvents::POLLOUT;
|
let mut events = PollEvents::POLLOUT;
|
||||||
if self.input_buffer.lock().contains(&b'\n') {
|
if self.input_buffer.lock().contains(&b'\n') {
|
||||||
events |= PollEvents::POLLIN;
|
events |= PollEvents::POLLIN;
|
||||||
|
Loading…
Reference in New Issue
Block a user