@@ -15,6 +15,7 @@ use crate::{
1515 composefs_consts:: {
1616 ORIGIN_KEY_BOOT , ORIGIN_KEY_BOOT_TYPE , STATE_DIR_RELATIVE , TYPE1_BOOT_DIR_PREFIX ,
1717 TYPE1_ENT_PATH_STAGED , UKI_NAME_PREFIX , USER_CFG_STAGED ,
18+ TYPE1_ENT_PATH , BLS_ENTRY_PREFIX ,
1819 } ,
1920 parsers:: bls_config:: { BLSConfig , BLSConfigType , EFIKey } ,
2021 spec:: BootloaderKind ,
@@ -244,6 +245,15 @@ fn create_staged_bls_entries(boot_dir: &Dir, entries: &Vec<(String, BLSConfig)>)
244245 staged_entries. atomic_write ( filename, new_entry. to_string ( ) . as_bytes ( ) ) ?;
245246 }
246247
248+ let original_entries = boot_dir. open_dir ( TYPE1_ENT_PATH ) ?;
249+ for entry in original_entries. entries_utf8 ( ) ? {
250+ let entry = entry?;
251+ let entry_name = entry. file_name ( ) ?;
252+ if entry. file_type ( ) ?. is_file ( ) && !entry_name. starts_with ( BLS_ENTRY_PREFIX ) {
253+ original_entries. copy ( entry_name. clone ( ) , & staged_entries, entry_name) . context ( "Staging non-managed BLS entry" ) ?;
254+ }
255+ }
256+
247257 fsync ( staged_entries. reopen_as_ownedfd ( ) ?) . context ( "fsync" )
248258}
249259
@@ -396,3 +406,58 @@ pub(crate) async fn prepend_custom_prefix(
396406
397407 Ok ( ( ) )
398408}
409+
410+ #[ cfg( test) ]
411+ mod tests {
412+ use anyhow:: Result ;
413+ use cap_std_ext:: { cap_std, dirext:: CapStdExtDirExt } ;
414+ use crate :: bootc_composefs:: backwards_compat:: bcompat_boot:: * ;
415+ use crate :: parsers:: bls_config:: parse_bls_config;
416+
417+ #[ test]
418+ fn test_create_staged_bls_entries ( ) -> Result < ( ) > {
419+ let tempdir = cap_std_ext:: cap_tempfile:: tempdir ( cap_std:: ambient_authority ( ) ) ?;
420+
421+ let entry1 = r#"
422+ title Fedora 42.20250623.3.1 (CoreOS)
423+ version fedora-42.0
424+ sort-key 1
425+ linux /boot/7e11ac46e3e022053e7226a20104ac656bf72d1a84e3a398b7cce70e9df188b6/vmlinuz-5.14.10
426+ initrd /boot/7e11ac46e3e022053e7226a20104ac656bf72d1a84e3a398b7cce70e9df188b6/initramfs-5.14.10.img
427+ options root=UUID=abc123 rw composefs=7e11ac46e3e022053e7226a20104ac656bf72d1a84e3a398b7cce70e9df188b6
428+ "# ;
429+ let entry2 = r#"
430+ title Fedora 41.20250214.2.0 (CoreOS)
431+ version fedora-42.0
432+ sort-key 2
433+ efi /EFI/Linux/f7415d75017a12a387a39d2281e033a288fc15775108250ef70a01dcadb93346.efi
434+ options root=UUID=abc123 rw composefs=febdf62805de2ae7b6b597f2a9775d9c8a753ba1e5f09298fc8fbe0b0d13bf01
435+ "# ;
436+ let entry3 = r#"
437+ title Test
438+ version 1
439+ sort-key 9
440+ efi /EFI/boot/test.efi
441+ "# ;
442+
443+ tempdir. create_dir_all ( "loader/entries" ) ?;
444+ tempdir. atomic_write ( "loader/entries/bootc_entry1.conf" , entry1) ?;
445+ tempdir. atomic_write ( "loader/entries/bootc_entry2.conf" , entry2) ?;
446+ tempdir. atomic_write ( "loader/entries/entry3.conf" , entry3) ?;
447+
448+ let entries = vec ! [
449+ ( "bootc_entry1.conf" . to_string( ) , parse_bls_config( entry1) . unwrap( ) ) ,
450+ ( "bootc_entry2.conf" . to_string( ) , parse_bls_config( entry2) . unwrap( ) ) ,
451+ ] ;
452+
453+ create_staged_bls_entries ( & tempdir, & entries) . unwrap ( ) ;
454+
455+ assert ! ( tempdir. exists( "loader/entries.staged/bootc_entry1.conf" ) ) ;
456+ assert ! ( tempdir. exists( "loader/entries.staged/bootc_entry2.conf" ) ) ;
457+ assert ! ( tempdir. exists( "loader/entries.staged/entry3.conf" ) ) ;
458+
459+ assert_eq ! ( str :: from_utf8( & tempdir. read( "loader/entries.staged/entry3.conf" ) ?[ ..] ) ?, entry3) ;
460+
461+ Ok ( ( ) )
462+ }
463+ }
0 commit comments