@@ -10,6 +10,8 @@ use std::path::{Path, PathBuf};
10
10
use std:: process:: Command ;
11
11
12
12
use anyhow:: { bail, Context , Result } ;
13
+ use cap_std:: fs:: Dir ;
14
+ use cap_std_ext:: cap_std;
13
15
use fn_error_context:: context;
14
16
use openat_ext:: OpenatDirExt ;
15
17
use os_release:: OsRelease ;
@@ -139,7 +141,8 @@ impl Efi {
139
141
log:: debug!( "Not booted via EFI, skipping firmware update" ) ;
140
142
return Ok ( ( ) ) ;
141
143
}
142
- let product_name = get_product_name ( ) ?;
144
+ let sysroot = Dir :: open_ambient_dir ( & Path :: new ( "/" ) , cap_std:: ambient_authority ( ) ) ?;
145
+ let product_name = get_product_name ( & sysroot) ?;
143
146
log:: debug!( "Get product name: {product_name}" ) ;
144
147
assert ! ( product_name. len( ) > 0 ) ;
145
148
// clear all the boot entries that match the target name
@@ -149,10 +152,10 @@ impl Efi {
149
152
}
150
153
151
154
#[ context( "Get product name" ) ]
152
- fn get_product_name ( ) -> Result < String > {
153
- let file_path = Path :: new ( "/ etc/system-release") ;
154
- if file_path . exists ( ) {
155
- let content = std :: fs :: read_to_string ( file_path ) ?;
155
+ fn get_product_name ( sysroot : & Dir ) -> Result < String > {
156
+ let release_path = " etc/system-release";
157
+ if sysroot . exists ( release_path ) {
158
+ let content = sysroot . read_to_string ( release_path ) ?;
156
159
let re = regex:: Regex :: new ( r" *release.*" ) . unwrap ( ) ;
157
160
return Ok ( re. replace_all ( & content, "" ) . to_string ( ) ) ;
158
161
}
@@ -597,6 +600,8 @@ fn find_file_recursive<P: AsRef<Path>>(dir: P, target_file: &str) -> Result<Vec<
597
600
598
601
#[ cfg( test) ]
599
602
mod tests {
603
+ use cap_std_ext:: dirext:: CapStdExtDirExt ;
604
+
600
605
use super :: * ;
601
606
602
607
#[ test]
@@ -670,10 +675,38 @@ Boot0003* test";
670
675
) ;
671
676
Ok ( ( ) )
672
677
}
678
+ #[ cfg( test) ]
679
+ fn fixture ( ) -> Result < cap_std_ext:: cap_tempfile:: TempDir > {
680
+ let tempdir = cap_std_ext:: cap_tempfile:: tempdir ( cap_std:: ambient_authority ( ) ) ?;
681
+ tempdir. create_dir ( "etc" ) ?;
682
+ Ok ( tempdir)
683
+ }
673
684
#[ test]
674
685
fn test_get_product_name ( ) -> Result < ( ) > {
675
- let name = get_product_name ( ) ?;
676
- assert ! ( name. len( ) > 0 ) ;
686
+ let tmpd = fixture ( ) ?;
687
+ {
688
+ tmpd. atomic_write ( "etc/system-release" , "Fedora release 40 (Forty)" ) ?;
689
+ let name = get_product_name ( & tmpd) ?;
690
+ assert_eq ! ( "Fedora" , name) ;
691
+ }
692
+ {
693
+ tmpd. atomic_write ( "etc/system-release" , "CentOS Stream release 9" ) ?;
694
+ let name = get_product_name ( & tmpd) ?;
695
+ assert_eq ! ( "CentOS Stream" , name) ;
696
+ }
697
+ {
698
+ tmpd. atomic_write (
699
+ "etc/system-release" ,
700
+ "Red Hat Enterprise Linux CoreOS release 4" ,
701
+ ) ?;
702
+ let name = get_product_name ( & tmpd) ?;
703
+ assert_eq ! ( "Red Hat Enterprise Linux CoreOS" , name) ;
704
+ }
705
+ {
706
+ tmpd. remove_file ( "etc/system-release" ) ?;
707
+ let name = get_product_name ( & tmpd) ?;
708
+ assert ! ( name. len( ) > 0 ) ;
709
+ }
677
710
Ok ( ( ) )
678
711
}
679
712
}
0 commit comments