1
0
Fork 0
forked from len0rd/rockbox

Allow mounting of any directory as the root directory.

Provide definitions for the macros:
* RB_ROOT_VOL_HIDDEN(v) to exclude certain items from the root.
* RB_ROOT_CONTENTS to return a string with the name of the
directory to mount in the root.

Defaults are in export/rbpaths.h

It's a bit much for those that don't need the full functionality.
Some conditional define can cut it back a lot to cut out things only
needed if alternate root mounts are required. I'm just not bothering
yet. The basic concept would be applied to all targets to keep file
code from forking too much.

Change-Id: I90b5c0a1c949283d3102c16734b0b6ac73901a30
This commit is contained in:
William Wilgus 2017-02-03 17:13:58 -05:00
parent 31fc46ded6
commit 5ef28cccf9
18 changed files with 592 additions and 205 deletions

View file

@ -105,7 +105,7 @@ static const unsigned char storage_dec_indexes[STORAGE_NUM_TYPES+1] =
*/
int path_strip_volume(const char *name, const char **nameptr, bool greedy)
{
int volume = 0;
int volume = ROOT_VOLUME;
const char *t = name;
int c, v = 0;
@ -114,9 +114,16 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy)
* digits within the brackets is parsed as the volume number and of
* those, only the last ones VOL_MUM_MAX allows.
*/
c = *(t = GOBBLE_PATH_SEPCH(t)); /* skip all leading slashes */
t = GOBBLE_PATH_SEPCH(t); /* skip all leading slashes */
if (t == name)
{
volume = -1; /* relative path; don't know */
goto psv_out;
}
c = *t;
if (c != VOL_START_TOK) /* missing start token? no volume */
goto volume0;
goto psv_out;
do
{
@ -127,7 +134,7 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy)
break;
case '\0':
case PATH_SEPCH: /* no closing bracket; no volume */
goto volume0;
goto psv_out;
default: /* something else; reset volume */
v = 0;
}
@ -137,7 +144,7 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy)
if (!(c = *++t)) /* no more path and no '/' is ok */
;
else if (c != PATH_SEPCH) /* more path and no separator after end */
goto volume0;
goto psv_out;
else if (greedy)
t = GOBBLE_PATH_SEPCH(++t); /* strip remaining separators */
@ -146,7 +153,7 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy)
volume = v;
name = t;
volume0:
psv_out:
if (nameptr)
*nameptr = name;
return volume;
@ -157,10 +164,14 @@ volume0:
*/
int get_volume_name(int volume, char *buffer)
{
if (volume < 0)
if (volume < 0 || volume == ROOT_VOLUME)
{
*buffer = '\0';
return 0;
char *t = buffer;
if (volume == ROOT_VOLUME)
*t++ = PATH_ROOTCHR;
*t = '\0';
return t - buffer;
}
volume %= VOL_NUM_MAX; /* as path parser would have it */
@ -173,6 +184,20 @@ int get_volume_name(int volume, char *buffer)
return snprintf(buffer, VOL_MAX_LEN + 1, "%c%s%d%c",
VOL_START_TOK, voldec, volume, VOL_END_TOK);
}
/* Returns volume name formatted with the root. Assumes buffer size is at
* least {VOL_MAX_LEN}+2 */
int make_volume_root(int volume, char *buffer)
{
char *t = buffer;
if (volume >= 0 && volume != ROOT_VOLUME)
*t++ = PATH_ROOTCHR;
t += get_volume_name(volume, t);
return t - buffer;
}
#endif /* HAVE_MULTIVOLUME */
/* Just like path_strip_volume() but strips a leading drive specifier and