Multiboot Firmware Root Redirect - WIP

Loads external drive into root namespace
Root Redirects can now be put into different folders
For instance placing '/_test' into SD1/rockbox_main.<playername>
will redirect to /<1>/_test/.rockbox
Debug menu>Bootdata now has root directory listed in addition to RAW Bootdata

Redirect root work from Michael Sevakis g#1556, RESTORED -> g#4256

Change-Id: Ia97cf50ff5f5b440877f9c005da6f12c53af931e
This commit is contained in:
William Wilgus 2022-03-03 22:08:28 -05:00
parent c7bbd5b090
commit c9857098ac
3 changed files with 49 additions and 16 deletions

View file

@ -24,6 +24,13 @@
#include "pathfuncs.h"
#include "dir.h"
#include "dircache.h"
#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
#include "rb-loader.h"
#include "bootdata.h"
#include "crc32.h"
#endif
#ifndef RB_ROOT_VOL_HIDDEN
#define RB_ROOT_VOL_HIDDEN(v) (0 == 0)
#endif
@ -137,11 +144,45 @@ static inline void volume_onmount_internal(IF_MV_NONVOID(int volume))
#else
const char *path = PATH_ROOTSTR;
#endif
#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
static char rtpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR;
static bool redirected = false;
int boot_volume = 0;
unsigned int crc = 0;
crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
if (crc == boot_data.crc)
{
root_mount_path(path, 0); /*root could be different folder don't hide*/
boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
//root_mount_path(path, volume == boot_volume ? NSITEM_HIDDEN : 0);
if (!redirected && volume == boot_volume)
{
if (get_redirect_dir(rtpath, sizeof(rtpath), volume, "", "") < 0)
{ /* Error occurred, card removed? Set root to default */
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
}
else
redirected = true;
}
if (redirected && volume == boot_volume)
root_mount_path(rtpath, NSITEM_CONTENTS);
} /*CRC OK*/
else
{
root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
}
#else /*ndef HAVE_MULTIBOOT */
root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
#ifdef HAVE_MULTIVOLUME
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
#endif
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
#endif /* HAVE_MULTIBOOT */
#ifdef HAVE_DIRCACHE
dircache_mount();
#endif