summary refs log tree commit diff
path: root/devices/src/serial.rs
diff options
context:
space:
mode:
authorJorge E. Moreira <jemoreira@google.com>2020-03-08 01:26:27 +0000
committerCommit Bot <commit-bot@chromium.org>2020-03-11 20:52:10 +0000
commitcba39f2fefc7dd1f38ffdae8451e530f16c06038 (patch)
tree58b52bf26ab9ef801ed71449f0fc967d72efbae3 /devices/src/serial.rs
parentd9082cff491433caa9f73dc412156b73b820ce88 (diff)
downloadcrosvm-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.rs44
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)),