@@ -592,6 +592,7 @@ int multirom_default_status(struct multirom_status *s)
592592    s -> enable_kmsg_logging  =  0 ;
593593    s -> rotation  =  MULTIROM_DEFAULT_ROTATION ;
594594    s -> anim_duration_coef  =  1.f ;
595+     s -> auto_boot_name  =  NULL ;
595596
596597    s -> fstab  =  fstab_auto_load ();
597598    if (!s -> fstab )
@@ -705,6 +706,7 @@ int multirom_load_status(struct multirom_status *s)
705706    char  line [1024 ];
706707    char  current_rom [256 ] =  { 0  };
707708    char  auto_boot_rom [256 ] =  { 0  };
709+     int  auto_boot_len ;
708710
709711    char  name [64 ];
710712    char  * pch ;
@@ -754,24 +756,61 @@ int multirom_load_status(struct multirom_status *s)
754756
755757    fclose (f );
756758
757-     // find USB drive if we're booting from it 
758-     if (s -> curr_rom_part ) // && s->is_second_boot) 
759+     // Find USB drive if we're booting from it 
760+     auto_boot_len  =  strlen (s -> auto_boot_name );
761+     if  (s -> curr_rom_part  ||  auto_boot_len  >  0 )
759762    {
763+         struct  multirom_rom  * r  =  NULL ;
760764        struct  usb_partition  * p  =  NULL ;
761765        int  tries  =  0 ;
762-         while (!p  &&  tries  <  10 )
766+         int  i ;
767+ 
768+         // Search curr_rom_part 
769+         while  (s -> curr_rom_part  &&  !p  &&  tries  <  10 )
763770        {
764771            multirom_update_partitions (s );
765772            p  =  multirom_get_partition (s , s -> curr_rom_part );
766773
767-             if (p )
774+             if   (p )
768775            {
776+                 INFO ("current part '%s' found\n" , s -> curr_rom_part );
769777                multirom_scan_partition_for_roms (s , p );
770778                break ;
771779            }
772780
773781            ++ tries ;
774-             ERROR ("part %s not found, waiting 1s (%d)\n" , s -> curr_rom_part , tries );
782+             ERROR ("part '%s' not found, waiting 1s (%d)\n" , s -> curr_rom_part , tries );
783+             sleep (1 );
784+         }
785+ 
786+         // Search auto_boot_rom 
787+         tries  =  0 ;
788+         while  (auto_boot_len  >  0  &&  !r  &&  tries  <  10 )
789+         {
790+             multirom_update_partitions (s );
791+             for  (i  =  0 ; s -> roms  &&  s -> roms [i ];)
792+             {
793+                 if  (s -> roms [i ]-> partition )
794+                 {
795+                     list_rm_at (& s -> roms , i , & multirom_free_rom );
796+                     i  =  0 ;
797+                 }
798+                 else  ++ i ;
799+             }
800+             for  (i  =  0 ; s -> partitions  &&  s -> partitions [i ]; ++ i )
801+             {
802+                 multirom_scan_partition_for_roms (s , s -> partitions [i ]);
803+             }
804+ 
805+             r  =  multirom_get_rom (s , s -> auto_boot_name , NULL );
806+             if  (r )
807+             {
808+                 INFO ("autoboot rom '%s' found\n" , s -> auto_boot_name );
809+                 break ;
810+             }
811+ 
812+             ++ tries ;
813+             ERROR ("rom '%s' not found, waiting 1s (%d)\n" , s -> auto_boot_name , tries );
775814            sleep (1 );
776815        }
777816    }
@@ -781,6 +820,9 @@ int multirom_load_status(struct multirom_status *s)
781820    {
782821        ERROR ("Failed to select current rom (%s, part %s), using Internal!\n" , current_rom , s -> curr_rom_part );
783822        s -> current_rom  =  multirom_get_internal (s );
823+         if  (s -> curr_rom_part ) {
824+             free (s -> curr_rom_part );
825+         }
784826        s -> curr_rom_part  =  NULL ;
785827        if (!s -> current_rom )
786828        {
@@ -832,7 +874,7 @@ int multirom_save_status(struct multirom_status *s)
832874        return  -1 ;
833875    }
834876
835-     multirom_fixup_rom_name (s -> auto_boot_rom , auto_boot_name , "" );
877+     multirom_fixup_rom_name (s -> auto_boot_rom , auto_boot_name , s -> auto_boot_name );
836878    multirom_fixup_rom_name (s -> current_rom , current_name , INTERNAL_ROM_NAME );
837879
838880    fprintf (f , "current_rom=%s\n" , current_name );
@@ -891,10 +933,12 @@ void multirom_dump_status(struct multirom_status *s)
891933    INFO ("  hide_internal=%d\n" , s -> hide_internal );
892934    INFO ("  int_display_name=%s\n" , s -> int_display_name  ? s -> int_display_name  : "NULL" );
893935    INFO ("  auto_boot_seconds=%d\n" , s -> auto_boot_seconds );
894-     INFO ("  auto_boot_rom=%s\n" , s -> auto_boot_rom  ? s -> auto_boot_rom -> name  : "NULL" );
936+     INFO ("  auto_boot_rom=%s\n" , s -> auto_boot_rom  ? s -> auto_boot_rom -> name  : s -> auto_boot_name );
895937    INFO ("  auto_boot_type=%d\n" , s -> auto_boot_type );
896938    INFO ("  curr_rom_part=%s\n" , s -> curr_rom_part  ? s -> curr_rom_part  : "NULL" );
897939    INFO ("\n" );
940+     INFO ("  auto_boot_name=%s\n" , s -> auto_boot_name );
941+     INFO ("\n" );
898942
899943    int  i ;
900944    for (i  =  0 ; s -> roms  &&  s -> roms [i ]; ++ i )
@@ -913,6 +957,7 @@ void multirom_free_status(struct multirom_status *s)
913957{
914958    list_clear (& s -> partitions , & multirom_destroy_partition );
915959    list_clear (& s -> roms , & multirom_free_rom );
960+     free (s -> auto_boot_name );
916961    free (s -> curr_rom_part );
917962    free (s -> int_display_name );
918963    if  (s -> fstab ) fstab_destroy (s -> fstab );
@@ -930,7 +975,7 @@ void multirom_find_usb_roms(struct multirom_status *s)
930975{
931976    char  auto_boot_name [MAX_ROM_NAME_LEN + 1 ];
932977    char  current_name [MAX_ROM_NAME_LEN + 1 ];
933-     multirom_fixup_rom_name (s -> auto_boot_rom , auto_boot_name , "" );
978+     multirom_fixup_rom_name (s -> auto_boot_rom , auto_boot_name , s -> auto_boot_name );
934979    multirom_fixup_rom_name (s -> current_rom , current_name , INTERNAL_ROM_NAME );
935980
936981    // remove USB roms 
0 commit comments