diff options
author | William Wilgus <wilgus.william@gmail.com> | 2022-03-03 07:37:03 -0500 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2022-03-03 18:58:07 -0500 |
commit | 9daacabd658508d2607a64b288c9bce7a635fb15 (patch) | |
tree | ce96538ea82a4176f00f8eb9531711db7dea5750 /firmware/common/pathfuncs.c | |
parent | f88ea12bacf381ad4f39ba2328c806e772c0dda8 (diff) | |
download | rockbox-9daacabd658508d2607a64b288c9bce7a635fb15.tar.gz rockbox-9daacabd658508d2607a64b288c9bce7a635fb15.zip |
[RESTORED!] 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: I3b5a14c530ff4b10d97f67636237d96875eb8969
Author: Michael Sevakis
Diffstat (limited to 'firmware/common/pathfuncs.c')
-rw-r--r-- | firmware/common/pathfuncs.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/firmware/common/pathfuncs.c b/firmware/common/pathfuncs.c index 2b4e6a8eb0..5242ec2d32 100644 --- a/firmware/common/pathfuncs.c +++ b/firmware/common/pathfuncs.c | |||
@@ -114,7 +114,7 @@ static const unsigned char storage_dec_indexes[STORAGE_NUM_TYPES+1] = | |||
114 | */ | 114 | */ |
115 | int path_strip_volume(const char *name, const char **nameptr, bool greedy) | 115 | int path_strip_volume(const char *name, const char **nameptr, bool greedy) |
116 | { | 116 | { |
117 | int volume = 0; | 117 | int volume = ROOT_VOLUME; |
118 | const char *t = name; | 118 | const char *t = name; |
119 | int c, v = 0; | 119 | int c, v = 0; |
120 | 120 | ||
@@ -123,9 +123,15 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy) | |||
123 | * digits within the brackets is parsed as the volume number and of | 123 | * digits within the brackets is parsed as the volume number and of |
124 | * those, only the last ones VOL_MUM_MAX allows. | 124 | * those, only the last ones VOL_MUM_MAX allows. |
125 | */ | 125 | */ |
126 | c = *(t = GOBBLE_PATH_SEPCH(t)); /* skip all leading slashes */ | 126 | t = GOBBLE_PATH_SEPCH(t); /* skip all leading slashes */ |
127 | if (t == name) | ||
128 | { | ||
129 | volume = -1; /* relative path; don't know */ | ||
130 | goto psv_out; | ||
131 | } | ||
132 | c = *t; | ||
127 | if (c != VOL_START_TOK) /* missing start token? no volume */ | 133 | if (c != VOL_START_TOK) /* missing start token? no volume */ |
128 | goto volume0; | 134 | goto psv_out; |
129 | 135 | ||
130 | do | 136 | do |
131 | { | 137 | { |
@@ -136,7 +142,7 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy) | |||
136 | break; | 142 | break; |
137 | case '\0': | 143 | case '\0': |
138 | case PATH_SEPCH: /* no closing bracket; no volume */ | 144 | case PATH_SEPCH: /* no closing bracket; no volume */ |
139 | goto volume0; | 145 | goto psv_out; |
140 | default: /* something else; reset volume */ | 146 | default: /* something else; reset volume */ |
141 | v = 0; | 147 | v = 0; |
142 | } | 148 | } |
@@ -146,7 +152,7 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy) | |||
146 | if (!(c = *++t)) /* no more path and no '/' is ok */ | 152 | if (!(c = *++t)) /* no more path and no '/' is ok */ |
147 | ; | 153 | ; |
148 | else if (c != PATH_SEPCH) /* more path and no separator after end */ | 154 | else if (c != PATH_SEPCH) /* more path and no separator after end */ |
149 | goto volume0; | 155 | goto psv_out; |
150 | else if (greedy) | 156 | else if (greedy) |
151 | t = GOBBLE_PATH_SEPCH(++t); /* strip remaining separators */ | 157 | t = GOBBLE_PATH_SEPCH(++t); /* strip remaining separators */ |
152 | 158 | ||
@@ -155,7 +161,7 @@ int path_strip_volume(const char *name, const char **nameptr, bool greedy) | |||
155 | 161 | ||
156 | volume = v; | 162 | volume = v; |
157 | name = t; | 163 | name = t; |
158 | volume0: | 164 | psv_out: |
159 | if (nameptr) | 165 | if (nameptr) |
160 | *nameptr = name; | 166 | *nameptr = name; |
161 | return volume; | 167 | return volume; |
@@ -166,10 +172,13 @@ volume0: | |||
166 | */ | 172 | */ |
167 | int get_volume_name(int volume, char *buffer) | 173 | int get_volume_name(int volume, char *buffer) |
168 | { | 174 | { |
169 | if (volume < 0) | 175 | if (volume < 0 || volume == ROOT_VOLUME) |
170 | { | 176 | { |
171 | *buffer = '\0'; | 177 | char *t = buffer; |
172 | return 0; | 178 | if (volume == ROOT_VOLUME) |
179 | *t++ = PATH_ROOTCHR; | ||
180 | *t = '\0'; | ||
181 | return t - buffer; | ||
173 | } | 182 | } |
174 | 183 | ||
175 | volume %= VOL_NUM_MAX; /* as path parser would have it */ | 184 | volume %= VOL_NUM_MAX; /* as path parser would have it */ |
@@ -182,8 +191,20 @@ int get_volume_name(int volume, char *buffer) | |||
182 | return snprintf(buffer, VOL_MAX_LEN + 1, "%c%s%d%c", | 191 | return snprintf(buffer, VOL_MAX_LEN + 1, "%c%s%d%c", |
183 | VOL_START_TOK, voldec, volume, VOL_END_TOK); | 192 | VOL_START_TOK, voldec, volume, VOL_END_TOK); |
184 | } | 193 | } |
194 | |||
195 | /* Returns volume name formatted with the root. Assumes buffer size is at | ||
196 | * least {VOL_MAX_LEN}+2 */ | ||
197 | int make_volume_root(int volume, char *buffer) | ||
198 | { | ||
199 | char *t = buffer; | ||
200 | if (volume >= 0 && volume != ROOT_VOLUME) | ||
201 | *t++ = PATH_ROOTCHR; | ||
202 | t += get_volume_name(volume, t); | ||
203 | return t - buffer; | ||
204 | } | ||
185 | #endif /* HAVE_MULTIVOLUME */ | 205 | #endif /* HAVE_MULTIVOLUME */ |
186 | 206 | ||
207 | |||
187 | /* Just like path_strip_volume() but strips a leading drive specifier and | 208 | /* Just like path_strip_volume() but strips a leading drive specifier and |
188 | * returns the drive number (A=0, B=1, etc.). -1 means no drive was found. | 209 | * returns the drive number (A=0, B=1, etc.). -1 means no drive was found. |
189 | * If 'greedy' is 'true', all separators after the volume are consumed. | 210 | * If 'greedy' is 'true', all separators after the volume are consumed. |