1
Fork 0

uefi: process: Add stderr support

Implement stderr support in similar fashion.

Signed-off-by: Ayush Singh <ayushdevel1325@gmail.com>
This commit is contained in:
Ayush Singh 2024-03-29 17:20:50 +05:30 committed by Ayush Singh
parent 6737a02a50
commit 87d7a07f50
No known key found for this signature in database
GPG key ID: 05CEF5C789E55A74

View file

@ -92,10 +92,15 @@ impl Command {
pub fn output(&mut self) -> io::Result<(ExitStatus, Vec<u8>, Vec<u8>)> { pub fn output(&mut self) -> io::Result<(ExitStatus, Vec<u8>, Vec<u8>)> {
let mut cmd = uefi_command_internal::Command::load_image(&self.prog)?; let mut cmd = uefi_command_internal::Command::load_image(&self.prog)?;
cmd.stdout_init()?; cmd.stdout_init()?;
cmd.stderr_init()?;
let stat = cmd.start_image()?; let stat = cmd.start_image()?;
let stdout = cmd.stdout()?; let stdout = cmd.stdout()?;
Ok((ExitStatus(stat), stdout, Vec::new())) let stderr = cmd.stderr()?;
Ok((ExitStatus(stat), stdout, stderr))
} }
} }
@ -263,6 +268,7 @@ mod uefi_command_internal {
pub struct Command { pub struct Command {
handle: NonNull<crate::ffi::c_void>, handle: NonNull<crate::ffi::c_void>,
stdout: Option<helpers::Protocol<PipeProtocol>>, stdout: Option<helpers::Protocol<PipeProtocol>>,
stderr: Option<helpers::Protocol<PipeProtocol>>,
st: Box<r_efi::efi::SystemTable>, st: Box<r_efi::efi::SystemTable>,
} }
@ -271,7 +277,7 @@ mod uefi_command_internal {
handle: NonNull<crate::ffi::c_void>, handle: NonNull<crate::ffi::c_void>,
st: Box<r_efi::efi::SystemTable>, st: Box<r_efi::efi::SystemTable>,
) -> Self { ) -> Self {
Self { handle, stdout: None, st } Self { handle, stdout: None, stderr: None, st }
} }
pub fn load_image(p: &OsStr) -> io::Result<Self> { pub fn load_image(p: &OsStr) -> io::Result<Self> {
@ -349,6 +355,19 @@ mod uefi_command_internal {
Ok(()) Ok(())
} }
pub fn stderr_init(&mut self) -> io::Result<()> {
let mut protocol =
helpers::Protocol::create(PipeProtocol::new(), simple_text_output::PROTOCOL_GUID)?;
self.st.standard_error_handle = protocol.handle().as_ptr();
self.st.std_err =
protocol.as_mut() as *mut PipeProtocol as *mut simple_text_output::Protocol;
self.stderr = Some(protocol);
Ok(())
}
pub fn stdout(&self) -> io::Result<Vec<u8>> { pub fn stdout(&self) -> io::Result<Vec<u8>> {
if let Some(stdout) = &self.stdout { if let Some(stdout) = &self.stdout {
stdout stdout
@ -361,6 +380,19 @@ mod uefi_command_internal {
Err(const_io_error!(io::ErrorKind::NotFound, "stdout not found")) Err(const_io_error!(io::ErrorKind::NotFound, "stdout not found"))
} }
} }
pub fn stderr(&self) -> io::Result<Vec<u8>> {
if let Some(stderr) = &self.stderr {
stderr
.as_ref()
.utf8()
.into_string()
.map_err(|_| const_io_error!(io::ErrorKind::Other, "utf8 conversion failed"))
.map(Into::into)
} else {
Err(const_io_error!(io::ErrorKind::NotFound, "stdout not found"))
}
}
} }
impl Drop for Command { impl Drop for Command {