summaryrefslogtreecommitdiff
path: root/firmware
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
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')
-rw-r--r--firmware/common/rbpaths.c68
-rw-r--r--firmware/export/rbpaths.h23
-rw-r--r--firmware/general.c3
3 files changed, 48 insertions, 46 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
diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h
index 8f554c25f4..f351c5e6c9 100644
--- a/firmware/export/rbpaths.h
+++ b/firmware/export/rbpaths.h
@@ -46,6 +46,12 @@
46 46
47#if !defined(APPLICATION) || defined(SAMSUNG_YPR0) 47#if !defined(APPLICATION) || defined(SAMSUNG_YPR0)
48 48
49#ifdef SAMSUNG_YPR0
50#define HOME_DIR "/mnt/media0"
51#else
52#define HOME_DIR "/." /* dot to avoid "//XX", /./X is valid */
53#endif
54
49/* make sure both are the same for native builds */ 55/* make sure both are the same for native builds */
50#undef ROCKBOX_LIBRARY_PATH 56#undef ROCKBOX_LIBRARY_PATH
51#define ROCKBOX_LIBRARY_PATH ROCKBOX_DIR 57#define ROCKBOX_LIBRARY_PATH ROCKBOX_DIR
@@ -53,12 +59,15 @@
53#define PLUGIN_DIR ROCKBOX_DIR "/rocks" 59#define PLUGIN_DIR ROCKBOX_DIR "/rocks"
54#define CODECS_DIR ROCKBOX_DIR "/codecs" 60#define CODECS_DIR ROCKBOX_DIR "/codecs"
55 61
56#define REC_BASE_DIR "/" 62#define REC_BASE_DIR HOME_DIR
57#define PLAYLIST_CATALOG_DEFAULT_DIR "/Playlists" 63#define PLAYLIST_CATALOG_DEFAULT_DIR HOME_DIR "/Playlists"
58 64
59#define paths_init() 65#define paths_init()
60 66
61#else /* application */ 67#else /* APPLICATION */
68
69#define HOME_DIR "<HOME>" /* replaced at runtime */
70#define HOME_DIR_LEN (sizeof(HOME_DIR)-1)
62 71
63#define PLUGIN_DIR ROCKBOX_LIBRARY_PATH "/rockbox/rocks" 72#define PLUGIN_DIR ROCKBOX_LIBRARY_PATH "/rockbox/rocks"
64#if (CONFIG_PLATFORM & PLATFORM_ANDROID) 73#if (CONFIG_PLATFORM & PLATFORM_ANDROID)
@@ -67,12 +76,12 @@
67#define CODECS_DIR ROCKBOX_LIBRARY_PATH "/rockbox/codecs" 76#define CODECS_DIR ROCKBOX_LIBRARY_PATH "/rockbox/codecs"
68#endif 77#endif
69 78
70#define REC_BASE_DIR ROCKBOX_DIR "/" 79#define REC_BASE_DIR HOME_DIR
71#define PLAYLIST_CATALOG_DEFAULT_DIR ROCKBOX_DIR "/Playlists" 80#define PLAYLIST_CATALOG_DEFAULT_DIR HOME_DIR "Playlists"
72 81
73extern void paths_init(void); 82extern void paths_init(void);
74 83
75#endif /* APPLICATION */ 84#endif /* !APPLICATION || SAMSUNG_YPR0 */
76 85
77#define LANG_DIR ROCKBOX_DIR "/langs" 86#define LANG_DIR ROCKBOX_DIR "/langs"
78 87
@@ -82,7 +91,7 @@ extern void paths_init(void);
82#define VIEWERS_DIR PLUGIN_DIR "/viewers" 91#define VIEWERS_DIR PLUGIN_DIR "/viewers"
83 92
84#if defined(APPLICATION) && !defined(SAMSUNG_YPR0) 93#if defined(APPLICATION) && !defined(SAMSUNG_YPR0)
85#define PLUGIN_DATA_DIR "/.rockbox/rocks.data" 94#define PLUGIN_DATA_DIR ROCKBOX_DIR "/rocks.data"
86#define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR 95#define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR
87#define PLUGIN_APPS_DATA_DIR PLUGIN_DATA_DIR 96#define PLUGIN_APPS_DATA_DIR PLUGIN_DATA_DIR
88#define PLUGIN_DEMOS_DATA_DIR PLUGIN_DATA_DIR 97#define PLUGIN_DEMOS_DATA_DIR PLUGIN_DATA_DIR
diff --git a/firmware/general.c b/firmware/general.c
index 3daf2f0a78..8e6d5af9a0 100644
--- a/firmware/general.c
+++ b/firmware/general.c
@@ -24,6 +24,7 @@
24#include "general.h" 24#include "general.h"
25#include "file.h" 25#include "file.h"
26#include "dir.h" 26#include "dir.h"
27#include "rbpaths.h"
27#include "limits.h" 28#include "limits.h"
28#include "stdlib.h" 29#include "stdlib.h"
29#include "string-extra.h" 30#include "string-extra.h"
@@ -126,7 +127,7 @@ char *create_numbered_filename(char *buffer, const char *path,
126 /* automatic numbering */ 127 /* automatic numbering */
127 max_num = 0; 128 max_num = 0;
128 129
129 dir = opendir(pathlen ? buffer : "/"); 130 dir = opendir(pathlen ? buffer : HOME_DIR);
130 if (!dir) 131 if (!dir)
131 return NULL; 132 return NULL;
132 133