@@ -92,10 +92,15 @@ impl Command {
92
92
93
93
pub fn output ( & mut self ) -> io:: Result < ( ExitStatus , Vec < u8 > , Vec < u8 > ) > {
94
94
let mut cmd = uefi_command_internal:: Command :: load_image ( & self . prog ) ?;
95
+
95
96
cmd. stdout_init ( ) ?;
97
+ cmd. stderr_init ( ) ?;
98
+
96
99
let stat = cmd. start_image ( ) ?;
97
100
let stdout = cmd. stdout ( ) ?;
98
- Ok ( ( ExitStatus ( stat) , stdout, Vec :: new ( ) ) )
101
+ let stderr = cmd. stderr ( ) ?;
102
+
103
+ Ok ( ( ExitStatus ( stat) , stdout, stderr) )
99
104
}
100
105
}
101
106
@@ -263,6 +268,7 @@ mod uefi_command_internal {
263
268
pub struct Command {
264
269
handle : NonNull < crate :: ffi:: c_void > ,
265
270
stdout : Option < helpers:: Protocol < PipeProtocol > > ,
271
+ stderr : Option < helpers:: Protocol < PipeProtocol > > ,
266
272
st : Box < r_efi:: efi:: SystemTable > ,
267
273
}
268
274
@@ -271,7 +277,7 @@ mod uefi_command_internal {
271
277
handle : NonNull < crate :: ffi:: c_void > ,
272
278
st : Box < r_efi:: efi:: SystemTable > ,
273
279
) -> Self {
274
- Self { handle, stdout : None , st }
280
+ Self { handle, stdout : None , stderr : None , st }
275
281
}
276
282
277
283
pub fn load_image ( p : & OsStr ) -> io:: Result < Self > {
@@ -349,6 +355,19 @@ mod uefi_command_internal {
349
355
Ok ( ( ) )
350
356
}
351
357
358
+ pub fn stderr_init ( & mut self ) -> io:: Result < ( ) > {
359
+ let mut protocol =
360
+ helpers:: Protocol :: create ( PipeProtocol :: new ( ) , simple_text_output:: PROTOCOL_GUID ) ?;
361
+
362
+ self . st . standard_error_handle = protocol. handle ( ) . as_ptr ( ) ;
363
+ self . st . std_err =
364
+ protocol. as_mut ( ) as * mut PipeProtocol as * mut simple_text_output:: Protocol ;
365
+
366
+ self . stderr = Some ( protocol) ;
367
+
368
+ Ok ( ( ) )
369
+ }
370
+
352
371
pub fn stdout ( & self ) -> io:: Result < Vec < u8 > > {
353
372
if let Some ( stdout) = & self . stdout {
354
373
stdout
@@ -361,6 +380,19 @@ mod uefi_command_internal {
361
380
Err ( const_io_error ! ( io:: ErrorKind :: NotFound , "stdout not found" ) )
362
381
}
363
382
}
383
+
384
+ pub fn stderr ( & self ) -> io:: Result < Vec < u8 > > {
385
+ if let Some ( stderr) = & self . stderr {
386
+ stderr
387
+ . as_ref ( )
388
+ . utf8 ( )
389
+ . into_string ( )
390
+ . map_err ( |_| const_io_error ! ( io:: ErrorKind :: Other , "utf8 conversion failed" ) )
391
+ . map ( Into :: into)
392
+ } else {
393
+ Err ( const_io_error ! ( io:: ErrorKind :: NotFound , "stdout not found" ) )
394
+ }
395
+ }
364
396
}
365
397
366
398
impl Drop for Command {
0 commit comments