From c9857098ac0a3173d5d03baa3c32d9a8e29faec8 Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Thu, 3 Mar 2022 22:08:28 -0500 Subject: 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. 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 --- firmware/include/dircache_redirect.h | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'firmware/include/dircache_redirect.h') diff --git a/firmware/include/dircache_redirect.h b/firmware/include/dircache_redirect.h index 171954a135..dfab6fd5a3 100644 --- a/firmware/include/dircache_redirect.h +++ b/firmware/include/dircache_redirect.h @@ -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 -- cgit v1.2.3