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