mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-25 02:13:24 +00:00
Fix short read in block read
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
36281eb1eb
commit
af58912631
@ -6,6 +6,7 @@ use crate::{
|
|||||||
process::{process_table, signal::signals::kernel::KernelSignal, Pgid},
|
process::{process_table, signal::signals::kernel::KernelSignal, Pgid},
|
||||||
};
|
};
|
||||||
use alloc::format;
|
use alloc::format;
|
||||||
|
use jinux_frame::trap::disable_local;
|
||||||
use ringbuf::{ring_buffer::RbBase, Rb, StaticRb};
|
use ringbuf::{ring_buffer::RbBase, Rb, StaticRb};
|
||||||
|
|
||||||
use super::termio::{KernelTermios, CC_C_CHAR};
|
use super::termio::{KernelTermios, CC_C_CHAR};
|
||||||
@ -272,15 +273,18 @@ impl LineDiscipline {
|
|||||||
read_len
|
read_len
|
||||||
}
|
}
|
||||||
|
|
||||||
// The read() blocks until the lesser of the number of bytes requested or
|
// The read() blocks until the number of bytes requested or
|
||||||
// MIN bytes are available, and returns the lesser of the two values.
|
// at least vmin bytes are available, and returns the real read value.
|
||||||
pub fn block_read(&self, dst: &mut [u8], vmin: u8) -> Result<usize> {
|
pub fn block_read(&self, dst: &mut [u8], vmin: u8) -> Result<usize> {
|
||||||
let min_read_len = (vmin as usize).min(dst.len());
|
let _guard = disable_local();
|
||||||
let buffer_len = self.read_buffer.lock_irq_disabled().len();
|
let buffer_len = self.read_buffer.lock().len();
|
||||||
if buffer_len < min_read_len {
|
if buffer_len >= dst.len() {
|
||||||
|
return Ok(self.poll_read(dst));
|
||||||
|
}
|
||||||
|
if buffer_len < vmin as usize {
|
||||||
return_errno!(Errno::EAGAIN);
|
return_errno!(Errno::EAGAIN);
|
||||||
}
|
}
|
||||||
Ok(self.poll_read(&mut dst[..min_read_len]))
|
Ok(self.poll_read(&mut dst[..buffer_len]))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// write bytes to buffer, if flush to console, then write the content to console
|
/// write bytes to buffer, if flush to console, then write the content to console
|
||||||
|
Reference in New Issue
Block a user