summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2022-03-05 09:33:45 -0500
committerWilliam Wilgus <wilgus.william@gmail.com>2022-03-06 16:42:26 -0500
commitbc3fa5393762549a16f9de3e238a986607015fe3 (patch)
treed577f828c6fbd5011be7d477a492818837e75e78
parentee87bfb933cdb595718bd8ddadf6552c3fa8895d (diff)
downloadrockbox-bc3fa5393762549a16f9de3e238a986607015fe3.tar.gz
rockbox-bc3fa5393762549a16f9de3e238a986607015fe3.zip
Sansa Multiboot Root Redirect Enhance + bug fix
filename buffer was too small to retrieve redirect path if redirected to sd root remove <SD1> as it is redundant Change-Id: I1326601f1ba4a18d6bc173798759eb762b55528c
-rw-r--r--apps/debug_menu.c11
-rw-r--r--firmware/include/dircache_redirect.h54
2 files changed, 33 insertions, 32 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 1b341a96e4..6b76aac162 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -2526,20 +2526,21 @@ static bool dbg_skin_engine(void)
2526#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) 2526#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR)
2527static bool dbg_boot_data(void) 2527static bool dbg_boot_data(void)
2528{ 2528{
2529 unsigned int crc = 0; 2529 unsigned int crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
2530 struct simplelist_info info; 2530 struct simplelist_info info;
2531 info.scroll_all = true; 2531 info.scroll_all = true;
2532 simplelist_info_init(&info, "Boot data", 1, NULL); 2532 simplelist_info_init(&info, "Boot data", 1, NULL);
2533 simplelist_set_line_count(0); 2533 simplelist_set_line_count(0);
2534 crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); 2534
2535#if defined(HAVE_MULTIBOOT) 2535#if defined(HAVE_MULTIBOOT)
2536 char rootpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR; 2536 char rootpath[MAX_PATH / 2] = RB_ROOT_CONTENTS_DIR;
2537 int boot_volume = 0; 2537 int boot_volume = 0;
2538 if(crc == boot_data.crc) 2538 if(crc == boot_data.crc)
2539 { 2539 {
2540 boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ 2540 boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
2541 get_redirect_dir(rootpath, sizeof(rootpath), boot_volume, "", ""); 2541 int rtlen = get_redirect_dir(rootpath, sizeof(rootpath), boot_volume, "", "");
2542 rootpath[path_strip_trailing_separators(rootpath,NULL)] = '\0'; 2542 while (rtlen > 0 && rootpath[--rtlen] == PATH_SEPCH) /* remove extra separators */
2543 rootpath[rtlen] = '\0';
2543 } 2544 }
2544 simplelist_addline("Boot Volume: <%lu>", boot_volume); 2545 simplelist_addline("Boot Volume: <%lu>", boot_volume);
2545 simplelist_addline("Root:"); 2546 simplelist_addline("Root:");
diff --git a/firmware/include/dircache_redirect.h b/firmware/include/dircache_redirect.h
index a781d6ee76..c8905455f9 100644
--- a/firmware/include/dircache_redirect.h
+++ b/firmware/include/dircache_redirect.h
@@ -138,49 +138,49 @@ static inline void fileop_onsync_internal(struct filestr_base *stream)
138 138
139static inline void volume_onmount_internal(IF_MV_NONVOID(int volume)) 139static inline void volume_onmount_internal(IF_MV_NONVOID(int volume))
140{ 140{
141#ifdef HAVE_MULTIVOLUME 141#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR) && !defined(BOOTLOADER)
142 char path[VOL_MAX_LEN+2]; 142 char path[VOL_MAX_LEN+2];
143 char rtpath[MAX_PATH / 2];
143 make_volume_root(volume, path); 144 make_volume_root(volume, path);
144#else
145 const char *path = PATH_ROOTSTR;
146#endif
147 145
148#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR) && !defined(BOOTLOADER) 146 unsigned int crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
149 static char rtpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR; 147 if (crc > 0 && crc == boot_data.crc)
150 static bool redirected = false;
151 int boot_volume = 0;
152 unsigned int crc = 0;
153 crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
154 if (crc == boot_data.crc)
155 { 148 {
156 root_mount_path(path, 0); /*root could be different folder don't hide*/ 149 /* we need to mount the drive before we can access it */
157 boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ 150 root_mount_path(path, 0); /* root could be different folder don't hide */
158 //root_mount_path(path, volume == boot_volume ? NSITEM_HIDDEN : 0); 151
159 if (!redirected && volume == boot_volume) 152 if (volume == boot_data.boot_volume) /* boot volume contained in uint8_t payload */
160 { 153 {
161 if (get_redirect_dir(rtpath, sizeof(rtpath), volume, "", "") < 0) 154 int rtlen = get_redirect_dir(rtpath, sizeof(rtpath), volume, "", "");
162 { /* Error occurred, card removed? Set root to default */ 155 while (rtlen > 0 && rtpath[--rtlen] == PATH_SEPCH)
163 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); 156 rtpath[rtlen] = '\0'; /* remove extra separators */
164 } 157
165 else 158 if (rtlen <= 0 || rtpath[rtlen] == VOL_END_TOK)
166 redirected = true; 159 root_unmount_volume(volume); /* unmount so root can be hidden*/
167 } 160
168 if (redirected && volume == boot_volume) 161 if (rtlen <= 0) /* Error occurred, card removed? Set root to default */
162 goto standard_redirect;
169 root_mount_path(rtpath, NSITEM_CONTENTS); 163 root_mount_path(rtpath, NSITEM_CONTENTS);
164 }
165
170 } /*CRC OK*/ 166 } /*CRC OK*/
171 else 167 else
172 { 168 {
169standard_redirect:
173 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0); 170 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
174 if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false)) 171 if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
175 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); 172 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
176 } 173 }
177#else /*ndef HAVE_MULTIBOOT */ 174#elif defined(HAVE_MULTIVOLUME)
178 175 char path[VOL_MAX_LEN+2];
176 make_volume_root(volume, path);
179 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0); 177 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
180#ifdef HAVE_MULTIVOLUME
181 if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false)) 178 if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
182#endif
183 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); 179 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
180#else
181 const char *path = PATH_ROOTSTR;
182 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
183 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
184#endif /* HAVE_MULTIBOOT */ 184#endif /* HAVE_MULTIBOOT */
185 185
186#ifdef HAVE_DIRCACHE 186#ifdef HAVE_DIRCACHE