diff --git a/bootloader/config/config.c b/bootloader/config/config.c index 1ac16be..32d9358 100644 --- a/bootloader/config/config.c +++ b/bootloader/config/config.c @@ -54,31 +54,52 @@ int create_config_entry() char lbuf[16]; FIL fp; + bool mainIniFound = false; LIST_INIT(ini_sections); if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false)) + mainIniFound = true; + else { - if (f_open(&fp, "bootloader/hekate_ipl.ini", FA_WRITE | FA_CREATE_ALWAYS) != FR_OK) - return 0; - // Add config entry. - f_puts("[config]\nautoboot=", &fp); - itoa(h_cfg.autoboot, lbuf, 10); - f_puts(lbuf, &fp); - f_puts("\nautoboot_list=", &fp); - itoa(h_cfg.autoboot_list, lbuf, 10); - f_puts(lbuf, &fp); - f_puts("\nbootwait=", &fp); - itoa(h_cfg.bootwait, lbuf, 10); - f_puts(lbuf, &fp); - f_puts("\ncustomlogo=", &fp); - itoa(h_cfg.customlogo, lbuf, 10); - f_puts(lbuf, &fp); - f_puts("\nverification=", &fp); - itoa(h_cfg.verification, lbuf, 10); - f_puts(lbuf, &fp); - f_puts("\n", &fp); + u8 res = f_open(&fp, "bootloader/hekate_ipl.ini", FA_READ); + if (res == FR_NO_FILE || res == FR_NO_PATH) + { + f_mkdir("bootloader"); + f_mkdir("bootloader/ini"); + f_mkdir("bootloader/payloads"); + f_mkdir("bootloader/sys"); + } + else + { + if (!res) + f_close(&fp); + return 1; + } + } + if (f_open(&fp, "bootloader/hekate_ipl.ini", FA_WRITE | FA_CREATE_ALWAYS) != FR_OK) + return 1; + // Add config entry. + f_puts("[config]\nautoboot=", &fp); + itoa(h_cfg.autoboot, lbuf, 10); + f_puts(lbuf, &fp); + f_puts("\nautoboot_list=", &fp); + itoa(h_cfg.autoboot_list, lbuf, 10); + f_puts(lbuf, &fp); + f_puts("\nbootwait=", &fp); + itoa(h_cfg.bootwait, lbuf, 10); + f_puts(lbuf, &fp); + f_puts("\ncustomlogo=", &fp); + itoa(h_cfg.customlogo, lbuf, 10); + f_puts(lbuf, &fp); + f_puts("\nverification=", &fp); + itoa(h_cfg.verification, lbuf, 10); + f_puts(lbuf, &fp); + f_puts("\n", &fp); + + if (mainIniFound) + { // Re-construct existing entries. LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link) { @@ -115,14 +136,13 @@ int create_config_entry() break; } } - - f_close(&fp); - sd_unmount(); } - else - return 1; - ini_free(&ini_sections); + f_close(&fp); + sd_unmount(); + + if (mainIniFound) + ini_free(&ini_sections); return 0; } @@ -185,11 +205,6 @@ void _config_autoboot_list() break; } } - if (i < 3) - { - EPRINTF("No launch configurations found."); - goto out; - } memset(&ments[i], 0, sizeof(ment_t)); menu_t menu = {ments, "Select a list entry to auto boot", 0, 0}; @@ -309,8 +324,10 @@ void config_autoboot() } if (i < 6 && !h_cfg.autoboot_list) { - EPRINTF("No launch configurations found."); - goto out; + ments[i].type = MENT_CAPTION; + ments[i].caption = "No main configurations found..."; + ments[i].color = 0xFFFFDD00; + i++; } memset(&ments[i], 0, sizeof(ment_t)); diff --git a/bootloader/config/ini.c b/bootloader/config/ini.c index b569f26..37b38d3 100644 --- a/bootloader/config/ini.c +++ b/bootloader/config/ini.c @@ -254,15 +254,7 @@ char *ini_check_payload_section(ini_sec_t *cfg) } if (path) - { - if (strlen(path) > 1) - return path; - else - { - free(path); - return NULL; - } - } + return path; else return NULL; } diff --git a/bootloader/main.c b/bootloader/main.c index 10f623b..b4183f3 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -80,7 +80,7 @@ gfx_con_t gfx_con; sdmmc_t sd_sdmmc; sdmmc_storage_t sd_storage; FATFS sd_fs; -bool sd_mounted; +static bool sd_mounted; #ifdef MENU_LOGO_ENABLE u8 *Kc_MENU_LOGO; @@ -95,7 +95,7 @@ bool sd_mount() if (!sdmmc_storage_init_sd(&sd_storage, &sd_sdmmc, SDMMC_1, SDMMC_BUS_WIDTH_4, 11)) { - EPRINTF("Failed to init SD card.\nMake sure that it is inserted."); + EPRINTF("Failed to init SD card.\nMake sure that it is inserted.\nOr that SD reader is properly seated!"); } else { @@ -2124,23 +2124,26 @@ void launch_firmware() if ((i - 4) > max_entries) break; } - if (i > 5) + if (i < 6) { - memset(&ments[i], 0, sizeof(ment_t)); - menu_t menu = { - ments, "Launch configurations", 0, 0 - }; - cfg_sec = ini_clone_section((ini_sec_t *)tui_do_menu(&gfx_con, &menu)); - if (!cfg_sec) - { - free(ments); - ini_free(&ini_sections); - sd_unmount(); - return; - } + ments[i].type = MENT_CAPTION; + ments[i].caption = "No main configurations found..."; + ments[i].color = 0xFFFFDD00; + i++; } - else - EPRINTF("No launch configurations found."); + memset(&ments[i], 0, sizeof(ment_t)); + menu_t menu = { + ments, "Launch configurations", 0, 0 + }; + cfg_sec = ini_clone_section((ini_sec_t *)tui_do_menu(&gfx_con, &menu)); + if (!cfg_sec) + { + free(ments); + ini_free(&ini_sections); + sd_unmount(); + return; + } + free(ments); ini_free(&ini_sections); } @@ -2193,6 +2196,7 @@ void auto_launch_firmware() u8 *BOOTLOGO = NULL; char *payload_path = NULL; + FIL fp; struct _bmp_data { @@ -2217,6 +2221,11 @@ void auto_launch_firmware() if (sd_mount()) { + if (f_open(&fp, "bootloader/hekate_ipl.ini", FA_READ)) + create_config_entry(); + else + f_close(&fp); + if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false)) { u32 configEntry = 0; diff --git a/bootloader/utils/dirlist.c b/bootloader/utils/dirlist.c index 0dac3d2..e5ada92 100644 --- a/bootloader/utils/dirlist.c +++ b/bootloader/utils/dirlist.c @@ -51,6 +51,13 @@ char *dirlist(char *directory) continue; } f_closedir(&dir); + + if (!k) + { + free(temp); + free(dir_entries); + return NULL; + } } else {