diff options
author | Jorge E. Moreira <jemoreira@google.com> | 2020-03-08 01:26:27 +0000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-11 20:52:10 +0000 |
commit | cba39f2fefc7dd1f38ffdae8451e530f16c06038 (patch) | |
tree | 58b52bf26ab9ef801ed71449f0fc967d72efbae3 /devices/src/serial.rs | |
parent | d9082cff491433caa9f73dc412156b73b820ce88 (diff) | |
download | crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.tar crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.tar.gz crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.tar.bz2 crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.tar.lz crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.tar.xz crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.tar.zst crosvm-cba39f2fefc7dd1f38ffdae8451e530f16c06038.zip |
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>
Diffstat (limited to 'devices/src/serial.rs')
-rw-r--r-- | devices/src/serial.rs | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/devices/src/serial.rs b/devices/src/serial.rs index 98f39dc..6629d7e 100644 --- a/devices/src/serial.rs +++ b/devices/src/serial.rs @@ -149,37 +149,35 @@ impl SerialParameters { ) -> std::result::Result<Serial, Error> { let evt_fd = evt_fd.try_clone().map_err(Error::CloneEventFd)?; 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_ { SerialType::Stdout => { keep_fds.push(stdout().as_raw_fd()); - 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()) - } - } - Ok(Serial::new_in_out( - evt_fd, - Box::new(StdinWrapper), - Box::new(stdout()), - )) - } else { - Ok(Serial::new_out(evt_fd, Box::new(stdout()))) - } + Ok(Serial::new(evt_fd, input, Some(Box::new(stdout())))) } - SerialType::Sink => Ok(Serial::new_sink(evt_fd)), + SerialType::Sink => Ok(Serial::new(evt_fd, input, None)), SerialType::Syslog => { syslog::push_fds(keep_fds); - Ok(Serial::new_out( + Ok(Serial::new( evt_fd, - Box::new(syslog::Syslogger::new( + input, + Some(Box::new(syslog::Syslogger::new( syslog::Priority::Info, syslog::Facility::Daemon, - )), + ))), )) } SerialType::File => match &self.path { @@ -187,7 +185,7 @@ impl SerialParameters { Some(path) => { let file = File::create(path.as_path()).map_err(Error::FileError)?; 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)), |