summaryrefslogtreecommitdiff
path: root/firmware/common
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2011-12-25 20:11:18 +0000
committerThomas Martitz <kugel@rockbox.org>2011-12-25 20:11:18 +0000
commit20b662a946861b5acee8970948a22f7a2d1aedf3 (patch)
tree392d9568a3baaa23be0e109799485255ddcd067f /firmware/common
parent16784598ac550dab147ea8ee15634a2f15739fff (diff)
downloadrockbox-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')
-rw-r--r--firmware/common/rbpaths.c68
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
48static 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
164static 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
162int app_open(const char *name, int o, ...) 180int 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)
187int app_remove(const char *name) 203int 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)
199int app_rename(const char *old, const char *new) 211int 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)
218DIR *app_opendir(const char *name) 222DIR *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
229int app_mkdir(const char* name) 229int 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
240int app_rmdir(const char* name) 236int 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