mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-25 05:03:05 +00:00
Allow all serial port types to read from stdin
Bug=b/148677254 Change-Id: I1fa38bc95ca303c7a2c38dbe4b938a6042c910c6 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2093800 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Zach Reizner <zachr@chromium.org> Auto-Submit: Jorge Moreira Broche <jemoreira@google.com>
This commit is contained in:
parent
d9082cff49
commit
cba39f2fef
1 changed files with 21 additions and 23 deletions
|
@ -149,37 +149,35 @@ impl SerialParameters {
|
||||||
) -> std::result::Result<Serial, Error> {
|
) -> std::result::Result<Serial, Error> {
|
||||||
let evt_fd = evt_fd.try_clone().map_err(Error::CloneEventFd)?;
|
let evt_fd = evt_fd.try_clone().map_err(Error::CloneEventFd)?;
|
||||||
keep_fds.push(evt_fd.as_raw_fd());
|
keep_fds.push(evt_fd.as_raw_fd());
|
||||||
|
let input: Option<Box<dyn io::Read + Send>> = if self.stdin {
|
||||||
|
keep_fds.push(stdin().as_raw_fd());
|
||||||
|
// This wrapper is used in place of the libstd native version because we don't want
|
||||||
|
// buffering for stdin.
|
||||||
|
struct StdinWrapper;
|
||||||
|
impl io::Read for StdinWrapper {
|
||||||
|
fn read(&mut self, out: &mut [u8]) -> io::Result<usize> {
|
||||||
|
read_raw_stdin(out).map_err(|e| e.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(Box::new(StdinWrapper))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
match self.type_ {
|
match self.type_ {
|
||||||
SerialType::Stdout => {
|
SerialType::Stdout => {
|
||||||
keep_fds.push(stdout().as_raw_fd());
|
keep_fds.push(stdout().as_raw_fd());
|
||||||
if self.stdin {
|
Ok(Serial::new(evt_fd, input, Some(Box::new(stdout()))))
|
||||||
keep_fds.push(stdin().as_raw_fd());
|
|
||||||
// This wrapper is used in place of the libstd native version because we don't
|
|
||||||
// want buffering for stdin.
|
|
||||||
struct StdinWrapper;
|
|
||||||
impl io::Read for StdinWrapper {
|
|
||||||
fn read(&mut self, out: &mut [u8]) -> io::Result<usize> {
|
|
||||||
read_raw_stdin(out).map_err(|e| e.into())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(Serial::new_in_out(
|
|
||||||
evt_fd,
|
|
||||||
Box::new(StdinWrapper),
|
|
||||||
Box::new(stdout()),
|
|
||||||
))
|
|
||||||
} else {
|
|
||||||
Ok(Serial::new_out(evt_fd, Box::new(stdout())))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SerialType::Sink => Ok(Serial::new_sink(evt_fd)),
|
SerialType::Sink => Ok(Serial::new(evt_fd, input, None)),
|
||||||
SerialType::Syslog => {
|
SerialType::Syslog => {
|
||||||
syslog::push_fds(keep_fds);
|
syslog::push_fds(keep_fds);
|
||||||
Ok(Serial::new_out(
|
Ok(Serial::new(
|
||||||
evt_fd,
|
evt_fd,
|
||||||
Box::new(syslog::Syslogger::new(
|
input,
|
||||||
|
Some(Box::new(syslog::Syslogger::new(
|
||||||
syslog::Priority::Info,
|
syslog::Priority::Info,
|
||||||
syslog::Facility::Daemon,
|
syslog::Facility::Daemon,
|
||||||
)),
|
))),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
SerialType::File => match &self.path {
|
SerialType::File => match &self.path {
|
||||||
|
@ -187,7 +185,7 @@ impl SerialParameters {
|
||||||
Some(path) => {
|
Some(path) => {
|
||||||
let file = File::create(path.as_path()).map_err(Error::FileError)?;
|
let file = File::create(path.as_path()).map_err(Error::FileError)?;
|
||||||
keep_fds.push(file.as_raw_fd());
|
keep_fds.push(file.as_raw_fd());
|
||||||
Ok(Serial::new_out(evt_fd, Box::new(file)))
|
Ok(Serial::new(evt_fd, input, Some(Box::new(file))))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SerialType::UnixSocket => Err(Error::Unimplemented(SerialType::UnixSocket)),
|
SerialType::UnixSocket => Err(Error::Unimplemented(SerialType::UnixSocket)),
|
||||||
|
|
Loading…
Reference in a new issue