xref: /aosp_15_r20/external/crosvm/base/src/sys/windows/console.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Error;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Read;
7*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Result;
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker use winapi::shared::minwindef::LPVOID;
10*bb4ee6a4SAndroid Build Coastguard Worker use winapi::shared::ntdef::NULL;
11*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::fileapi::ReadFile;
12*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::minwinbase::LPOVERLAPPED;
13*bb4ee6a4SAndroid Build Coastguard Worker 
14*bb4ee6a4SAndroid Build Coastguard Worker use crate::AsRawDescriptor;
15*bb4ee6a4SAndroid Build Coastguard Worker use crate::ReadNotifier;
16*bb4ee6a4SAndroid Build Coastguard Worker 
17*bb4ee6a4SAndroid Build Coastguard Worker pub struct Console(std::io::Stdin);
18*bb4ee6a4SAndroid Build Coastguard Worker 
19*bb4ee6a4SAndroid Build Coastguard Worker impl Console {
new() -> Self20*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new() -> Self {
21*bb4ee6a4SAndroid Build Coastguard Worker         Self(std::io::stdin())
22*bb4ee6a4SAndroid Build Coastguard Worker     }
23*bb4ee6a4SAndroid Build Coastguard Worker }
24*bb4ee6a4SAndroid Build Coastguard Worker 
25*bb4ee6a4SAndroid Build Coastguard Worker impl Read for Console {
read(&mut self, out: &mut [u8]) -> Result<usize>26*bb4ee6a4SAndroid Build Coastguard Worker     fn read(&mut self, out: &mut [u8]) -> Result<usize> {
27*bb4ee6a4SAndroid Build Coastguard Worker         let mut num_of_bytes_read: u32 = 0;
28*bb4ee6a4SAndroid Build Coastguard Worker         // SAFETY:
29*bb4ee6a4SAndroid Build Coastguard Worker         // Safe because `out` is guarenteed to be a valid mutable array
30*bb4ee6a4SAndroid Build Coastguard Worker         // and `num_of_bytes_read` is a valid u32.
31*bb4ee6a4SAndroid Build Coastguard Worker         let res = unsafe {
32*bb4ee6a4SAndroid Build Coastguard Worker             ReadFile(
33*bb4ee6a4SAndroid Build Coastguard Worker                 self.0.as_raw_descriptor(),
34*bb4ee6a4SAndroid Build Coastguard Worker                 out.as_mut_ptr() as LPVOID,
35*bb4ee6a4SAndroid Build Coastguard Worker                 out.len() as u32,
36*bb4ee6a4SAndroid Build Coastguard Worker                 &mut num_of_bytes_read,
37*bb4ee6a4SAndroid Build Coastguard Worker                 NULL as LPOVERLAPPED,
38*bb4ee6a4SAndroid Build Coastguard Worker             )
39*bb4ee6a4SAndroid Build Coastguard Worker         };
40*bb4ee6a4SAndroid Build Coastguard Worker         let error = Error::last_os_error();
41*bb4ee6a4SAndroid Build Coastguard Worker         if res == 0 {
42*bb4ee6a4SAndroid Build Coastguard Worker             Err(error)
43*bb4ee6a4SAndroid Build Coastguard Worker         } else {
44*bb4ee6a4SAndroid Build Coastguard Worker             Ok(num_of_bytes_read as usize)
45*bb4ee6a4SAndroid Build Coastguard Worker         }
46*bb4ee6a4SAndroid Build Coastguard Worker     }
47*bb4ee6a4SAndroid Build Coastguard Worker }
48*bb4ee6a4SAndroid Build Coastguard Worker 
49*bb4ee6a4SAndroid Build Coastguard Worker impl ReadNotifier for Console {
get_read_notifier(&self) -> &dyn AsRawDescriptor50*bb4ee6a4SAndroid Build Coastguard Worker     fn get_read_notifier(&self) -> &dyn AsRawDescriptor {
51*bb4ee6a4SAndroid Build Coastguard Worker         &self.0
52*bb4ee6a4SAndroid Build Coastguard Worker     }
53*bb4ee6a4SAndroid Build Coastguard Worker }
54*bb4ee6a4SAndroid Build Coastguard Worker 
55*bb4ee6a4SAndroid Build Coastguard Worker impl Default for Console {
default() -> Self56*bb4ee6a4SAndroid Build Coastguard Worker     fn default() -> Self {
57*bb4ee6a4SAndroid Build Coastguard Worker         Self::new()
58*bb4ee6a4SAndroid Build Coastguard Worker     }
59*bb4ee6a4SAndroid Build Coastguard Worker }
60