99//! image in its entirety. This tool brings together all publicly known details.
1010
1111use std:: fs;
12- use std:: io:: Write ;
12+ use std:: io:: { self , Write } ;
1313
1414use clap:: { Parser , Subcommand } ;
15- use log:: { debug, error, info} ;
15+ use log:: { debug, error, info, warn } ;
1616
1717mod clean;
1818mod show;
@@ -111,7 +111,7 @@ struct Cli {
111111 verbose : bool ,
112112}
113113
114- fn main ( ) {
114+ fn main ( ) -> Result < ( ) , io :: Error > {
115115 println ! ( "Intel Firmware Tool 🔧" ) ;
116116 // Default to log level "info". Otherwise, you get no "regular" logs.
117117 let env = env_logger:: Env :: default ( ) . default_filter_or ( "info" ) ;
@@ -170,16 +170,23 @@ fn main() {
170170 info ! ( "Output will be written to: {out_file}" ) ;
171171 }
172172 info ! ( "Reading {file_name}..." ) ;
173- let mut data = fs:: read ( file_name) . unwrap ( ) ;
173+ let mut data = fs:: read ( file_name) ? ;
174174 let fw = Firmware :: parse ( & data, debug) ;
175175 show:: show ( & fw, verbose) ;
176176 println ! ( ) ;
177177
178- let Some ( me_res) = fw. me else {
179- return ;
178+ let me_res = match fw. me {
179+ Some ( r) => r,
180+ None => {
181+ return Err ( io:: Error :: new (
182+ io:: ErrorKind :: NotFound ,
183+ "no ME firmware recognized" ,
184+ ) ) ;
185+ }
180186 } ;
181- let Ok ( me) = me_res else {
182- return ;
187+ let me = match me_res {
188+ Ok ( r) => r,
189+ Err ( e) => return Err ( io:: Error :: new ( io:: ErrorKind :: InvalidData , e) ) ,
183190 } ;
184191 if check {
185192 let fpt = & me. fpt_area . fpt ;
@@ -202,7 +209,7 @@ fn main() {
202209 Err ( e) => println ! ( " {n}: signature error: {e}" ) ,
203210 }
204211 }
205- return ;
212+ return Ok ( ( ) ) ;
206213 }
207214 let opts = clean:: Options {
208215 keep_modules,
@@ -215,42 +222,45 @@ fn main() {
215222 match clean:: clean ( & fw. ifd , & me, & mut data, opts) {
216223 Ok ( data) => {
217224 if let Some ( f) = output {
218- let mut f = fs:: File :: create ( f) . unwrap ( ) ;
219- f. write_all ( & data) . unwrap ( ) ;
225+ let mut f = fs:: File :: create ( f) ? ;
226+ f. write_all ( & data) ? ;
220227 } else {
221- error ! ( "No output file given" ) ;
228+ warn ! ( "No output file given" ) ;
222229 }
223230 if let Ok ( ifd) = & fw. ifd {
224231 if let Some ( f) = extract_descriptor {
225- let mut f = fs:: File :: create ( f) . unwrap ( ) ;
232+ let mut f = fs:: File :: create ( f) ? ;
226233 let ifd_range = ifd. regions . ifd_range ( ) ;
227- f. write_all ( & data[ ifd_range] ) . unwrap ( ) ;
234+ f. write_all ( & data[ ifd_range] ) ? ;
228235 }
229236 if let Some ( f) = extract_me {
230- let mut f = fs:: File :: create ( f) . unwrap ( ) ;
237+ let mut f = fs:: File :: create ( f) ? ;
231238 let me_range = ifd. regions . me_range ( ) ;
232- f. write_all ( & data[ me_range] ) . unwrap ( ) ;
239+ f. write_all ( & data[ me_range] ) ? ;
233240 }
234241 }
235242 }
236243 Err ( e) => {
237244 error ! ( "Clean operation failed: {e}" ) ;
245+ return Err ( io:: Error :: other ( e) ) ;
238246 }
239247 }
240248 }
241249 MeCommand :: Scan { file_name } => {
242- let data = fs:: read ( file_name) . unwrap ( ) ;
250+ let data = fs:: read ( file_name) ? ;
243251 let fw = Firmware :: scan ( & data, debug) ;
244252 show:: show ( & fw, verbose) ;
245253 }
246254 MeCommand :: Check { file_name } => {
247255 todo ! ( "check {file_name}" )
248256 }
249257 MeCommand :: Show { file_name } => {
250- let data = fs:: read ( file_name) . unwrap ( ) ;
258+ let data = fs:: read ( file_name) ? ;
251259 let fw = Firmware :: parse ( & data, debug) ;
252260 show:: show ( & fw, verbose) ;
253261 }
254262 } ,
255263 }
264+
265+ Ok ( ( ) )
256266}
0 commit comments