forked from CTCaer/hekate
Improvements to ini/payload handling
- Allow no hekate_ipl.ini and create it at 1st hekate boot - Show Payloads/More configs options when no boot entry in main .ini - Fix black screen on empty ini/payload folders - Fix some stack corruption with freeing ini lists (wip)
This commit is contained in:
parent
fdd94ffd2b
commit
780736591e
@ -54,31 +54,52 @@ int create_config_entry()
|
|||||||
|
|
||||||
char lbuf[16];
|
char lbuf[16];
|
||||||
FIL fp;
|
FIL fp;
|
||||||
|
bool mainIniFound = false;
|
||||||
|
|
||||||
LIST_INIT(ini_sections);
|
LIST_INIT(ini_sections);
|
||||||
|
|
||||||
if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
|
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)
|
u8 res = f_open(&fp, "bootloader/hekate_ipl.ini", FA_READ);
|
||||||
return 0;
|
if (res == FR_NO_FILE || res == FR_NO_PATH)
|
||||||
// Add config entry.
|
{
|
||||||
f_puts("[config]\nautoboot=", &fp);
|
f_mkdir("bootloader");
|
||||||
itoa(h_cfg.autoboot, lbuf, 10);
|
f_mkdir("bootloader/ini");
|
||||||
f_puts(lbuf, &fp);
|
f_mkdir("bootloader/payloads");
|
||||||
f_puts("\nautoboot_list=", &fp);
|
f_mkdir("bootloader/sys");
|
||||||
itoa(h_cfg.autoboot_list, lbuf, 10);
|
}
|
||||||
f_puts(lbuf, &fp);
|
else
|
||||||
f_puts("\nbootwait=", &fp);
|
{
|
||||||
itoa(h_cfg.bootwait, lbuf, 10);
|
if (!res)
|
||||||
f_puts(lbuf, &fp);
|
f_close(&fp);
|
||||||
f_puts("\ncustomlogo=", &fp);
|
return 1;
|
||||||
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 (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.
|
// Re-construct existing entries.
|
||||||
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
|
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
|
||||||
{
|
{
|
||||||
@ -115,14 +136,13 @@ int create_config_entry()
|
|||||||
break;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -185,11 +205,6 @@ void _config_autoboot_list()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i < 3)
|
|
||||||
{
|
|
||||||
EPRINTF("No launch configurations found.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ments[i], 0, sizeof(ment_t));
|
memset(&ments[i], 0, sizeof(ment_t));
|
||||||
menu_t menu = {ments, "Select a list entry to auto boot", 0, 0};
|
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)
|
if (i < 6 && !h_cfg.autoboot_list)
|
||||||
{
|
{
|
||||||
EPRINTF("No launch configurations found.");
|
ments[i].type = MENT_CAPTION;
|
||||||
goto out;
|
ments[i].caption = "No main configurations found...";
|
||||||
|
ments[i].color = 0xFFFFDD00;
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[i], 0, sizeof(ment_t));
|
memset(&ments[i], 0, sizeof(ment_t));
|
||||||
|
@ -254,15 +254,7 @@ char *ini_check_payload_section(ini_sec_t *cfg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
{
|
return path;
|
||||||
if (strlen(path) > 1)
|
|
||||||
return path;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free(path);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ gfx_con_t gfx_con;
|
|||||||
sdmmc_t sd_sdmmc;
|
sdmmc_t sd_sdmmc;
|
||||||
sdmmc_storage_t sd_storage;
|
sdmmc_storage_t sd_storage;
|
||||||
FATFS sd_fs;
|
FATFS sd_fs;
|
||||||
bool sd_mounted;
|
static bool sd_mounted;
|
||||||
|
|
||||||
#ifdef MENU_LOGO_ENABLE
|
#ifdef MENU_LOGO_ENABLE
|
||||||
u8 *Kc_MENU_LOGO;
|
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))
|
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
|
else
|
||||||
{
|
{
|
||||||
@ -2124,23 +2124,26 @@ void launch_firmware()
|
|||||||
if ((i - 4) > max_entries)
|
if ((i - 4) > max_entries)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i > 5)
|
if (i < 6)
|
||||||
{
|
{
|
||||||
memset(&ments[i], 0, sizeof(ment_t));
|
ments[i].type = MENT_CAPTION;
|
||||||
menu_t menu = {
|
ments[i].caption = "No main configurations found...";
|
||||||
ments, "Launch configurations", 0, 0
|
ments[i].color = 0xFFFFDD00;
|
||||||
};
|
i++;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
memset(&ments[i], 0, sizeof(ment_t));
|
||||||
EPRINTF("No launch configurations found.");
|
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);
|
free(ments);
|
||||||
ini_free(&ini_sections);
|
ini_free(&ini_sections);
|
||||||
}
|
}
|
||||||
@ -2193,6 +2196,7 @@ void auto_launch_firmware()
|
|||||||
|
|
||||||
u8 *BOOTLOGO = NULL;
|
u8 *BOOTLOGO = NULL;
|
||||||
char *payload_path = NULL;
|
char *payload_path = NULL;
|
||||||
|
FIL fp;
|
||||||
|
|
||||||
struct _bmp_data
|
struct _bmp_data
|
||||||
{
|
{
|
||||||
@ -2217,6 +2221,11 @@ void auto_launch_firmware()
|
|||||||
|
|
||||||
if (sd_mount())
|
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))
|
if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
|
||||||
{
|
{
|
||||||
u32 configEntry = 0;
|
u32 configEntry = 0;
|
||||||
|
@ -51,6 +51,13 @@ char *dirlist(char *directory)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
f_closedir(&dir);
|
f_closedir(&dir);
|
||||||
|
|
||||||
|
if (!k)
|
||||||
|
{
|
||||||
|
free(temp);
|
||||||
|
free(dir_entries);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user