diff options
| author | Thomas Martitz <kugel@rockbox.org> | 2014-02-11 15:27:23 +0100 |
|---|---|---|
| committer | Thomas Martitz <kugel@rockbox.org> | 2014-02-23 20:23:52 +0100 |
| commit | 0f928f87850153a38c7e6cfafd283ce4f52a0666 (patch) | |
| tree | 55bbb19b5a17cd6e30a29bb3c2446a6e4c02738a /firmware/common | |
| parent | cbc57af0f3192093177d90861df72c4074566cf8 (diff) | |
| download | rockbox-0f928f87850153a38c7e6cfafd283ce4f52a0666.zip rockbox-0f928f87850153a38c7e6cfafd283ce4f52a0666.tar.gz rockbox-0f928f87850153a38c7e6cfafd283ce4f52a0666.tar.bz2 rockbox-0f928f87850153a38c7e6cfafd283ce4f52a0666.tar.xz | |
RaaA: Move directory related stuff from filesystem-unix.c into rbpaths.c.
Part of this change is to align sdlapp builds to other application targets
in that the sim_* wrappers are not used anymore (except for sim_read/write).
Path mangling is now done in rbpaths.c as well.
Change-Id: I9726da73b50a83d9e1a1840288de16ec01ea029d
Diffstat (limited to 'firmware/common')
| -rw-r--r-- | firmware/common/filefuncs.c | 2 | ||||
| -rw-r--r-- | firmware/common/rbpaths.c | 173 |
2 files changed, 122 insertions, 53 deletions
diff --git a/firmware/common/filefuncs.c b/firmware/common/filefuncs.c index 6c02757..16f8d88 100644 --- a/firmware/common/filefuncs.c +++ b/firmware/common/filefuncs.c @@ -93,7 +93,7 @@ bool dir_exists(const char *path) } -#if (CONFIG_PLATFORM & (PLATFORM_NATIVE|PLATFORM_SDL|PLATFORM_MAEMO|PLATFORM_PANDORA)) +#if (CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SIMULATOR) struct dirinfo dir_get_info(DIR* parent, struct dirent *entry) { (void)parent; diff --git a/firmware/common/rbpaths.c b/firmware/common/rbpaths.c index a188cf6..8efb6dd 100644 --- a/firmware/common/rbpaths.c +++ b/firmware/common/rbpaths.c @@ -23,6 +23,9 @@ #include <stdio.h> /* snprintf */ #include <stdlib.h> #include <stdarg.h> +#include <sys/stat.h> +#include <time.h> +#include <unistd.h> #include "config.h" #include "rbpaths.h" #include "file.h" /* MAX_PATH */ @@ -31,39 +34,34 @@ #include "string-extra.h" #include "filefuncs.h" +/* In this file we need the actual OS library functions, not the shadowed + * wrapper used within Rockbox' application code (except SDL adds + * another layer) */ #undef open #undef creat #undef remove #undef rename #undef opendir +#undef closedir +#undef readdir #undef mkdir #undef rmdir +#undef dirent +#undef DIR - -#if (CONFIG_PLATFORM & PLATFORM_ANDROID) || defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) && !defined(__PCTOOL__) -#include "dir-target.h" -#define opendir _opendir -#define mkdir _mkdir #if (CONFIG_PLATFORM & PLATFORM_ANDROID) static const char rbhome[] = "/sdcard"; #endif -#elif (CONFIG_PLATFORM & (PLATFORM_SDL|PLATFORM_MAEMO|PLATFORM_PANDORA)) && !defined(__PCTOOL__) -#define open sim_open -#define remove sim_remove -#define rename sim_rename -#define opendir sim_opendir -#define mkdir sim_mkdir -#define rmdir sim_rmdir -extern int sim_open(const char* name, int o, ...); -extern int sim_remove(const char* name); -extern int sim_rename(const char* old, const char* new); -extern DIR* sim_opendir(const char* name); -extern int sim_mkdir(const char* name); -extern int sim_rmdir(const char* name); +#if (CONFIG_PLATFORM & (PLATFORM_SDL|PLATFORM_MAEMO|PLATFORM_PANDORA)) && !defined(__PCTOOL__) const char *rbhome; #endif #if !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1)) && !defined(__PCTOOL__) +/* Special dirs are user-accessible (and user-writable) dirs which take priority + * over the ones where Rockbox is installed to. Classic example would be + * $HOME/.config/rockbox.org vs /usr/share/rockbox */ +#define HAVE_SPECIAL_DIRS +#endif /* flags for get_user_file_path() */ /* whether you need write access to that file/dir, especially true @@ -72,12 +70,13 @@ const char *rbhome; /* file or directory? */ #define IS_FILE (1<<1) +#ifdef HAVE_SPECIAL_DIRS void paths_init(void) { /* make sure $HOME/.config/rockbox.org exists, it's needed for config.cfg */ #if (CONFIG_PLATFORM & PLATFORM_ANDROID) - mkdir("/sdcard/rockbox"); - mkdir("/sdcard/rockbox/rocks.data"); + mkdir("/sdcard/rockbox", 0777); + mkdir("/sdcard/rockbox/rocks.data", 0777); #else char config_dir[MAX_PATH]; @@ -94,13 +93,14 @@ void paths_init(void) rbhome = home; snprintf(config_dir, sizeof(config_dir), "%s/.config", home); - mkdir(config_dir); + mkdir(config_dir, 0777); snprintf(config_dir, sizeof(config_dir), "%s/.config/rockbox.org", home); - mkdir(config_dir); + mkdir(config_dir, 0777); /* Plugin data directory */ snprintf(config_dir, sizeof(config_dir), "%s/.config/rockbox.org/rocks.data", home); - mkdir(config_dir); + mkdir(config_dir, 0777); #endif + } static bool try_path(const char* filename, unsigned flags) @@ -173,6 +173,21 @@ static const char* handle_special_dirs(const char* dir, unsigned flags, return dir; } +#else /* !HAVE_SPECIAL_DIRS */ + +#ifndef paths_init +void paths_init(void) { } +#endif + +static const char* handle_special_dirs(const char* dir, unsigned flags, + char *buf, const size_t bufsize) +{ + (void) flags; (void) buf; (void) bufsize; + return dir; +} + +#endif + int app_open(const char *name, int o, ...) { char realpath[MAX_PATH]; @@ -215,48 +230,102 @@ int app_rename(const char *old, const char *new) return rename(final_old, final_new); } -DIR *app_opendir(const char *name) +/* need to wrap around DIR* because we need to save the parent's + * directory path in order to determine dirinfo, required to implement + * get_dir_info() */ +struct __dir { + DIR *dir; + char path[]; +}; + +struct dirinfo dir_get_info(DIR* _parent, struct dirent *dir) +{ + struct __dir *parent = (struct __dir*)_parent; + struct stat s; + struct tm *tm = NULL; + struct dirinfo ret; + char path[MAX_PATH]; + + snprintf(path, sizeof(path), "%s/%s", parent->path, dir->d_name); + memset(&ret, 0, sizeof(ret)); + + if (!stat(path, &s)) + { + if (S_ISDIR(s.st_mode)) + { + ret.attribute = ATTR_DIRECTORY; + } + ret.size = s.st_size; + tm = localtime(&(s.st_mtime)); + } + + if (!lstat(path, &s) && S_ISLNK(s.st_mode)) + { + ret.attribute |= ATTR_LINK; + } + + if (tm) + { + ret.wrtdate = ((tm->tm_year - 80) << 9) | + ((tm->tm_mon + 1) << 5) | + tm->tm_mday; + ret.wrttime = (tm->tm_hour << 11) | + (tm->tm_min << 5) | + (tm->tm_sec >> 1); + } + + return ret; +} + +DIR* app_opendir(const char *_name) { char realpath[MAX_PATH]; - const char *fname = handle_special_dirs(name, 0, realpath, sizeof(realpath)); - return opendir(fname); + const char *name = handle_special_dirs(_name, 0, realpath, sizeof(realpath)); + char *buf = malloc(sizeof(struct __dir) + strlen(name)+1); + if (!buf) + return NULL; + + struct __dir *this = (struct __dir*)buf; + /* definitely fits due to strlen() */ + strcpy(this->path, name); + + this->dir = opendir(name); + + if (!this->dir) + { + free(buf); + return NULL; + } + return (DIR*)this; +} + +int app_closedir(DIR *dir) +{ + struct __dir *this = (struct __dir*)dir; + int ret = closedir(this->dir); + free(this); + return ret; +} + + +struct dirent* app_readdir(DIR* dir) +{ + struct __dir *d = (struct __dir*)dir; + return readdir(d->dir); } + int app_mkdir(const char* name) { char realpath[MAX_PATH]; const char *fname = handle_special_dirs(name, NEED_WRITE, realpath, sizeof(realpath)); - return mkdir(fname); + return mkdir(fname, 0777); } + int app_rmdir(const char* name) { char realpath[MAX_PATH]; const char *fname = handle_special_dirs(name, NEED_WRITE, realpath, sizeof(realpath)); return rmdir(fname); } - -#else - -int app_open(const char *name, int o, ...) -{ - if (o & O_CREAT) - { - int ret; - va_list ap; - va_start(ap, o); - ret = open(name, o, va_arg(ap, mode_t)); - va_end(ap); - return ret; - } - return open(name, o); -} - -int app_creat(const char* name, mode_t mode) { return creat(name, mode); } -int app_remove(const char *name) { return remove(name); } -int app_rename(const char *old, const char *new) { return rename(old,new); } -DIR *app_opendir(const char *name) { return (DIR*)opendir(name); } /* cast to remove warning in checkwps */ -int app_mkdir(const char* name) { return mkdir(name); } -int app_rmdir(const char* name) { return rmdir(name); } - -#endif |