diff options
Diffstat (limited to 'util/flashrom_tester/src/main.rs')
-rw-r--r-- | util/flashrom_tester/src/main.rs | 80 |
1 files changed, 55 insertions, 25 deletions
diff --git a/util/flashrom_tester/src/main.rs b/util/flashrom_tester/src/main.rs index e589ee1e6..b8a2581ac 100644 --- a/util/flashrom_tester/src/main.rs +++ b/util/flashrom_tester/src/main.rs @@ -39,9 +39,8 @@ extern crate log; mod logger; use clap::{App, Arg}; -use flashrom::FlashChip; +use flashrom::{FlashChip, Flashrom, FlashromCmd, FlashromLib}; use flashrom_tester::{tester, tests}; -use std::path::PathBuf; use std::sync::atomic::AtomicBool; pub mod built_info { @@ -65,11 +64,25 @@ fn main() { built_info::BUILT_TIME_UTC, built_info::RUSTC_VERSION, )) - .arg(Arg::with_name("flashrom_binary").required(true)) + .arg( + Arg::with_name("libflashrom") + .long("libflashrom") + .takes_value(false) + .help("Test the flashrom library instead of a binary"), + ) + .arg( + Arg::with_name("flashrom_binary") + .long("flashrom_binary") + .short("b") + .takes_value(true) + .required_unless("libflashrom") + .conflicts_with("libflashrom") + .help("Path to flashrom binary to test"), + ) .arg( Arg::with_name("ccd_target_type") .required(true) - .possible_values(&["host", "ec", "servo"]), + .possible_values(&["host"]), ) .arg( Arg::with_name("print-layout") @@ -78,13 +91,6 @@ fn main() { .help("Print the layout file's contents before running tests"), ) .arg( - Arg::with_name("log-file") - .short("o") - .long("log-file") - .takes_value(true) - .help("Write logs to a file rather than stdout"), - ) - .arg( Arg::with_name("log_debug") .short("d") .long("debug") @@ -107,15 +113,13 @@ fn main() { ) .get_matches(); - logger::init( - matches.value_of_os("log-file").map(PathBuf::from), - matches.is_present("log_debug"), - ); + logger::init(matches.is_present("log_debug")); debug!("Args parsed and logging initialized OK"); - let flashrom_path = matches - .value_of("flashrom_binary") - .expect("flashrom_binary should be required"); + debug!("Collecting crossystem info"); + let crossystem = + flashrom_tester::utils::collect_crosssystem(&[]).expect("could not run crossystem"); + let ccd_type = FlashChip::from( matches .value_of("ccd_target_type") @@ -123,6 +127,25 @@ fn main() { ) .expect("ccd_target_type should admit only known types"); + let cmd: Box<dyn Flashrom> = if matches.is_present("libflashrom") { + Box::new(FlashromLib::new( + ccd_type, + if matches.is_present("log_debug") { + flashrom::FLASHROM_MSG_DEBUG + } else { + flashrom::FLASHROM_MSG_WARN + }, + )) + } else { + Box::new(FlashromCmd { + path: matches + .value_of("flashrom_binary") + .expect("flashrom_binary is required") + .to_string(), + fc: ccd_type, + }) + }; + let print_layout = matches.is_present("print-layout"); let output_format = matches .value_of("output-format") @@ -132,12 +155,13 @@ fn main() { let test_names = matches.values_of("test_name"); if let Err(e) = tests::generic( - flashrom_path, + cmd.as_ref(), ccd_type, print_layout, output_format, test_names, Some(handle_sigint()), + crossystem, ) { eprintln!("Failed to run tests: {:?}", e); std::process::exit(1); @@ -152,12 +176,11 @@ fn main() { /// Once a signal is trapped, the default behavior is restored (terminating /// the process) for future signals. fn handle_sigint() -> &'static AtomicBool { - use nix::libc::c_int; - use nix::sys::signal::{self, SigHandler, Signal}; + use libc::c_int; use std::sync::atomic::Ordering; unsafe { - let _ = signal::signal(Signal::SIGINT, SigHandler::Handler(sigint_handler)); + let _ = libc::signal(libc::SIGINT, sigint_handler as libc::sighandler_t); } static TERMINATE_FLAG: AtomicBool = AtomicBool::new(false); @@ -169,10 +192,17 @@ rendering your machine unbootable. Testing will end on completion of the current test, or press ^C again to exit immediately (possibly bricking your machine). "; - // Use raw write() because signal-safety is a very hard problem - let _ = nix::unistd::write(STDERR_FILENO, MESSAGE); + // Use raw write() because signal-safety is a very hard problem. Safe because this doesn't + // modify any memory. + let _ = unsafe { + libc::write( + STDERR_FILENO, + MESSAGE.as_ptr() as *const libc::c_void, + MESSAGE.len() as libc::size_t, + ) + }; unsafe { - let _ = signal::signal(Signal::SIGINT, SigHandler::SigDfl); + let _ = libc::signal(libc::SIGINT, libc::SIG_DFL); } TERMINATE_FLAG.store(true, Ordering::Release); } |