uefi: process: Add support for args · model-checking/verify-rust-std@ef6b173 (original) (raw)

`@@ -23,6 +23,7 @@ use super::helpers;

`

23

23

``

24

24

`pub struct Command {

`

25

25

`prog: OsString,

`

``

26

`+

args: OsString,

`

26

27

`stdout: Option,

`

27

28

`stderr: Option,

`

28

29

`}

`

`@@ -45,11 +46,17 @@ pub enum Stdio {

`

45

46

``

46

47

`impl Command {

`

47

48

`pub fn new(program: &OsStr) -> Command {

`

48

``

`-

Command { prog: program.to_os_string(), stdout: None, stderr: None }

`

``

49

`+

Command {

`

``

50

`+

prog: program.to_os_string(),

`

``

51

`+

args: program.to_os_string(),

`

``

52

`+

stdout: None,

`

``

53

`+

stderr: None,

`

``

54

`+

}

`

49

55

`}

`

50

56

``

51

``

`-

pub fn arg(&mut self, _arg: &OsStr) {

`

52

``

`-

panic!("unsupported")

`

``

57

`+

pub fn arg(&mut self, arg: &OsStr) {

`

``

58

`+

self.args.push(" ");

`

``

59

`+

self.args.push(arg);

`

53

60

`}

`

54

61

``

55

62

`pub fn env_mut(&mut self) -> &mut CommandEnv {

`

`@@ -137,11 +144,17 @@ impl Command {

`

137

144

`.map(Some),

`

138

145

`}?;

`

139

146

``

140

``

`-

if let Some(stdout) = stdout {

`

141

``

`-

cmd.stdout_init(stdout)?;

`

142

``

`-

}

`

143

``

`-

if let Some(stderr) = stderr {

`

144

``

`-

cmd.stderr_init(stderr)?;

`

``

147

`+

match stdout {

`

``

148

`+

Some(stdout) => cmd.stdout_init(stdout),

`

``

149

`+

None => cmd.stdout_inherit(),

`

``

150

`+

};

`

``

151

`+

match stderr {

`

``

152

`+

Some(stderr) => cmd.stderr_init(stderr),

`

``

153

`+

None => cmd.stderr_inherit(),

`

``

154

`+

};

`

``

155

+

``

156

`+

if !self.args.is_empty() {

`

``

157

`+

cmd.set_args(&self.args);

`

145

158

`}

`

146

159

``

147

160

`let stat = cmd.start_image()?;

`

`@@ -308,8 +321,8 @@ mod uefi_command_internal {

`

308

321

`use crate::ffi::{OsStr, OsString};

`

309

322

`use crate::io::{self, const_io_error};

`

310

323

`use crate::mem::MaybeUninit;

`

311

``

`-

use crate::os::uefi::env::{boot_services, image_handle};

`

312

``

`-

use crate::os::uefi::ffi::OsStringExt;

`

``

324

`+

use crate::os::uefi::env::{boot_services, image_handle, system_table};

`

``

325

`+

use crate::os::uefi::ffi::{OsStrExt, OsStringExt};

`

313

326

`use crate::ptr::NonNull;

`

314

327

`use crate::slice;

`

315

328

`use crate::sys_common::wstr::WStrUnits;

`

`@@ -319,14 +332,15 @@ mod uefi_command_internal {

`

319

332

`stdout: Option<helpers::Protocol>,

`

320

333

`stderr: Option<helpers::Protocol>,

`

321

334

`st: Box<r_efi::efi::SystemTable>,

`

``

335

`+

args: Option<Vec>,

`

322

336

`}

`

323

337

``

324

338

`impl Command {

`

325

339

`const fn new(

`

326

340

`handle: NonNullcrate::ffi::c_void,

`

327

341

`st: Box<r_efi::efi::SystemTable>,

`

328

342

`) -> Self {

`

329

``

`-

Self { handle, stdout: None, stderr: None, st }

`

``

343

`+

Self { handle, stdout: None, stderr: None, st, args: None }

`

330

344

`}

`

331

345

``

332

346

`pub fn load_image(p: &OsStr) -> io::Result {

`

`@@ -391,30 +405,34 @@ mod uefi_command_internal {

`

391

405

`Ok(r)

`

392

406

`}

`

393

407

``

394

``

`-

pub fn stdout_init(

`

395

``

`-

&mut self,

`

396

``

`-

mut protocol: helpers::Protocol,

`

397

``

`-

) -> io::Result<()> {

`

``

408

`+

pub fn stdout_init(&mut self, mut protocol: helpers::Protocol) {

`

398

409

`self.st.console_out_handle = protocol.handle().as_ptr();

`

399

410

`self.st.con_out =

`

400

411

` protocol.as_mut() as *mut PipeProtocol as *mut simple_text_output::Protocol;

`

401

412

``

402

413

`self.stdout = Some(protocol);

`

``

414

`+

}

`

403

415

``

404

``

`-

Ok(())

`

``

416

`+

pub fn stdout_inherit(&mut self) {

`

``

417

`+

let st: NonNull<r_efi::efi::SystemTable> = system_table().cast();

`

``

418

+

``

419

`+

self.st.console_out_handle = unsafe { (*st.as_ptr()).console_out_handle };

`

``

420

`+

self.st.con_out = unsafe { (*st.as_ptr()).con_out };

`

405

421

`}

`

406

422

``

407

``

`-

pub fn stderr_init(

`

408

``

`-

&mut self,

`

409

``

`-

mut protocol: helpers::Protocol,

`

410

``

`-

) -> io::Result<()> {

`

``

423

`+

pub fn stderr_init(&mut self, mut protocol: helpers::Protocol) {

`

411

424

`self.st.standard_error_handle = protocol.handle().as_ptr();

`

412

425

`self.st.std_err =

`

413

426

` protocol.as_mut() as *mut PipeProtocol as *mut simple_text_output::Protocol;

`

414

427

``

415

428

`self.stderr = Some(protocol);

`

``

429

`+

}

`

``

430

+

``

431

`+

pub fn stderr_inherit(&mut self) {

`

``

432

`+

let st: NonNull<r_efi::efi::SystemTable> = system_table().cast();

`

416

433

``

417

``

`-

Ok(())

`

``

434

`+

self.st.standard_error_handle = unsafe { (*st.as_ptr()).standard_error_handle };

`

``

435

`+

self.st.std_err = unsafe { (*st.as_ptr()).std_err };

`

418

436

`}

`

419

437

``

420

438

`pub fn stderr(&self) -> io::Result<Vec> {

`

`@@ -430,6 +448,22 @@ mod uefi_command_internal {

`

430

448

`None => Ok(Vec::new()),

`

431

449

`}

`

432

450

`}

`

``

451

+

``

452

`+

pub fn set_args(&mut self, args: &OsStr) {

`

``

453

`+

let loaded_image: NonNull<loaded_image::Protocol> =

`

``

454

`+

helpers::open_protocol(self.handle, loaded_image::PROTOCOL_GUID).unwrap();

`

``

455

+

``

456

`+

let mut args = args.encode_wide().collect::<Vec>();

`

``

457

`+

let args_size = (crate::mem::size_of::() * args.len()) as u32;

`

``

458

+

``

459

`+

unsafe {

`

``

460

`+

(*loaded_image.as_ptr()).load_options =

`

``

461

`+

args.as_mut_ptr() as *mut crate::ffi::c_void;

`

``

462

`+

(*loaded_image.as_ptr()).load_options_size = args_size;

`

``

463

`+

}

`

``

464

+

``

465

`+

self.args = Some(args);

`

``

466

`+

}

`

433

467

`}

`

434

468

``

435

469

`impl Drop for Command {

`