diff options
author | Thomas Martitz <kugel@rockbox.org> | 2011-12-25 20:11:18 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2011-12-25 20:11:18 +0000 |
commit | 20b662a946861b5acee8970948a22f7a2d1aedf3 (patch) | |
tree | 392d9568a3baaa23be0e109799485255ddcd067f /firmware/common/rbpaths.c | |
parent | 16784598ac550dab147ea8ee15634a2f15739fff (diff) | |
download | rockbox-20b662a946861b5acee8970948a22f7a2d1aedf3.tar.gz rockbox-20b662a946861b5acee8970948a22f7a2d1aedf3.zip |
rbpaths: Add new special dir HOME_DIR for RaaA.
HOME_DIR is intended for not-so-advanced files which shall be user
visible, and thus not in /.rockbox. Therefore HOME_DIR is translated
to $HOME on RaaA, /sdcard on android, the internal memory on ypr0
and "/" on native targets.
ROCKBOX_DIR ("/.rockbox") already existed as special and is translated
to whatever the real rockbox dir is on the target (e.g. /sdcard/rockbox
on android), but it's not suitable for some files we generate
(e.g. battery-bench.txt).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31430 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/common/rbpaths.c')
-rw-r--r-- | firmware/common/rbpaths.c | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/firmware/common/rbpaths.c b/firmware/common/rbpaths.c index 95bff3341f..aacd949430 100644 --- a/firmware/common/rbpaths.c +++ b/firmware/common/rbpaths.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #define opendir opendir_android | 45 | #define opendir opendir_android |
46 | #define mkdir mkdir_android | 46 | #define mkdir mkdir_android |
47 | #define rmdir rmdir_android | 47 | #define rmdir rmdir_android |
48 | static const char rbhome[] = "/sdcard"; | ||
48 | #elif defined(SAMSUNG_YPR0) | 49 | #elif defined(SAMSUNG_YPR0) |
49 | #include "dir-target.h" | 50 | #include "dir-target.h" |
50 | #define opendir opendir_ypr0 | 51 | #define opendir opendir_ypr0 |
@@ -159,19 +160,34 @@ static const char* _get_user_file_path(const char *path, | |||
159 | return ret; | 160 | return ret; |
160 | } | 161 | } |
161 | 162 | ||
163 | |||
164 | static const char* handle_special_dirs(const char* dir, unsigned flags, | ||
165 | char *buf, const size_t bufsize) | ||
166 | { | ||
167 | if (!strncmp(HOME_DIR, dir, HOME_DIR_LEN)) | ||
168 | { | ||
169 | const char *p = dir + HOME_DIR_LEN; | ||
170 | while (*p == '/') p++; | ||
171 | snprintf(buf, bufsize, "%s/%s", rbhome, p); | ||
172 | return buf; | ||
173 | } | ||
174 | else if (!strncmp(ROCKBOX_DIR, dir, ROCKBOX_DIR_LEN)) | ||
175 | return _get_user_file_path(dir, flags, buf, bufsize); | ||
176 | |||
177 | return dir; | ||
178 | } | ||
179 | |||
162 | int app_open(const char *name, int o, ...) | 180 | int app_open(const char *name, int o, ...) |
163 | { | 181 | { |
164 | char realpath[MAX_PATH]; | 182 | char realpath[MAX_PATH]; |
165 | va_list ap; | 183 | va_list ap; |
166 | int fd; | 184 | int fd; |
185 | int flags = IS_FILE; | ||
186 | if (o & (O_CREAT|O_RDWR|O_TRUNC|O_WRONLY)) | ||
187 | flags |= NEED_WRITE; | ||
167 | 188 | ||
168 | if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN)) | 189 | name = handle_special_dirs(name, flags, realpath, sizeof(realpath)); |
169 | { | 190 | |
170 | int flags = IS_FILE; | ||
171 | if (o & (O_CREAT|O_RDWR|O_TRUNC|O_WRONLY)) | ||
172 | flags |= NEED_WRITE; | ||
173 | name = _get_user_file_path(name, flags, realpath, sizeof(realpath)); | ||
174 | } | ||
175 | va_start(ap, o); | 191 | va_start(ap, o); |
176 | fd = open(name, o, va_arg(ap, unsigned int)); | 192 | fd = open(name, o, va_arg(ap, unsigned int)); |
177 | va_end(ap); | 193 | va_end(ap); |
@@ -187,11 +203,7 @@ int app_creat(const char* name, mode_t mode) | |||
187 | int app_remove(const char *name) | 203 | int app_remove(const char *name) |
188 | { | 204 | { |
189 | char realpath[MAX_PATH]; | 205 | char realpath[MAX_PATH]; |
190 | const char *fname = name; | 206 | const char *fname = handle_special_dirs(name, NEED_WRITE, realpath, sizeof(realpath)); |
191 | if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN)) | ||
192 | { | ||
193 | fname = _get_user_file_path(name, NEED_WRITE, realpath, sizeof(realpath)); | ||
194 | } | ||
195 | 207 | ||
196 | return remove(fname); | 208 | return remove(fname); |
197 | } | 209 | } |
@@ -199,18 +211,10 @@ int app_remove(const char *name) | |||
199 | int app_rename(const char *old, const char *new) | 211 | int app_rename(const char *old, const char *new) |
200 | { | 212 | { |
201 | char realpath_old[MAX_PATH], realpath_new[MAX_PATH]; | 213 | char realpath_old[MAX_PATH], realpath_new[MAX_PATH]; |
214 | const char *final_old, *final_new; | ||
202 | 215 | ||
203 | const char *final_old = old; | 216 | final_old = handle_special_dirs(old, NEED_WRITE, realpath_old, sizeof(realpath_old)); |
204 | if (!strncmp(ROCKBOX_DIR, old, ROCKBOX_DIR_LEN)) | 217 | final_new = handle_special_dirs(new, NEED_WRITE, realpath_new, sizeof(realpath_new)); |
205 | { | ||
206 | final_old = _get_user_file_path(old, NEED_WRITE, realpath_old, sizeof(realpath_old)); | ||
207 | } | ||
208 | |||
209 | const char *final_new = new; | ||
210 | if (!strncmp(ROCKBOX_DIR, new, ROCKBOX_DIR_LEN)) | ||
211 | { | ||
212 | final_new = _get_user_file_path(new, NEED_WRITE, realpath_new, sizeof(realpath_new)); | ||
213 | } | ||
214 | 218 | ||
215 | return rename(final_old, final_new); | 219 | return rename(final_old, final_new); |
216 | } | 220 | } |
@@ -218,33 +222,21 @@ int app_rename(const char *old, const char *new) | |||
218 | DIR *app_opendir(const char *name) | 222 | DIR *app_opendir(const char *name) |
219 | { | 223 | { |
220 | char realpath[MAX_PATH]; | 224 | char realpath[MAX_PATH]; |
221 | const char *fname = name; | 225 | const char *fname = handle_special_dirs(name, 0, realpath, sizeof(realpath)); |
222 | if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN)) | ||
223 | { | ||
224 | fname = _get_user_file_path(name, 0, realpath, sizeof(realpath)); | ||
225 | } | ||
226 | return opendir(fname); | 226 | return opendir(fname); |
227 | } | 227 | } |
228 | 228 | ||
229 | int app_mkdir(const char* name) | 229 | int app_mkdir(const char* name) |
230 | { | 230 | { |
231 | char realpath[MAX_PATH]; | 231 | char realpath[MAX_PATH]; |
232 | const char *fname = name; | 232 | const char *fname = handle_special_dirs(name, NEED_WRITE, realpath, sizeof(realpath)); |
233 | if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN)) | ||
234 | { | ||
235 | fname = _get_user_file_path(name, NEED_WRITE, realpath, sizeof(realpath)); | ||
236 | } | ||
237 | return mkdir(fname); | 233 | return mkdir(fname); |
238 | } | 234 | } |
239 | 235 | ||
240 | int app_rmdir(const char* name) | 236 | int app_rmdir(const char* name) |
241 | { | 237 | { |
242 | char realpath[MAX_PATH]; | 238 | char realpath[MAX_PATH]; |
243 | const char *fname = name; | 239 | const char *fname = handle_special_dirs(name, NEED_WRITE, realpath, sizeof(realpath)); |
244 | if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN)) | ||
245 | { | ||
246 | fname = _get_user_file_path(name, NEED_WRITE, realpath, sizeof(realpath)); | ||
247 | } | ||
248 | return rmdir(fname); | 240 | return rmdir(fname); |
249 | } | 241 | } |
250 | 242 | ||