summaryrefslogtreecommitdiffstats
path: root/firmware/include
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/include')
-rw-r--r--firmware/include/dircache_redirect.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/firmware/include/dircache_redirect.h b/firmware/include/dircache_redirect.h
index 9a8de2fecd..e8cf8dc8f5 100644
--- a/firmware/include/dircache_redirect.h
+++ b/firmware/include/dircache_redirect.h
@@ -25,6 +25,12 @@
#include "dir.h"
#include "dircache.h"
+#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
+#include "rb-loader.h"
+#include "bootdata.h"
+#include "crc32.h"
+#endif
+
/***
** Internal redirects that depend upon whether or not dircache is made
**
@@ -132,11 +138,47 @@ 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
+
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