summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2010-12-23 19:02:18 +0000
committerThomas Martitz <kugel@rockbox.org>2010-12-23 19:02:18 +0000
commit87c8be4a08b4864f0df588c80bc90586f5e512a0 (patch)
treec2265c82437eae7533569f1c6b6e254a321a06f4 /firmware
parente1b1183f401974700a67db76f39e2bba9a5984e1 (diff)
downloadrockbox-87c8be4a08b4864f0df588c80bc90586f5e512a0.tar.gz
rockbox-87c8be4a08b4864f0df588c80bc90586f5e512a0.zip
RaaA: Improve tagcache search to make the database built.
First, it add the ability to tagcache to walk through multiple search roots. Second, it adds symlinks targets to the search roots if they're are not inside any of the current search roots, otherwise the symlink is ignored (unless it's a file). The default search root is still /, so no search root will be actually added. But the tagcache now isn't trapped by recursive symlinks anymore and successfully builds, and it's prepared for a future music directory setting. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28884 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/include/dir.h1
-rw-r--r--firmware/target/hosted/android/fs-android.c35
2 files changed, 24 insertions, 12 deletions
diff --git a/firmware/include/dir.h b/firmware/include/dir.h
index 3a582c3865..4f1993143c 100644
--- a/firmware/include/dir.h
+++ b/firmware/include/dir.h
@@ -48,6 +48,7 @@
48#define ATTR_DIRECTORY 0x10 48#define ATTR_DIRECTORY 0x10
49#define ATTR_ARCHIVE 0x20 49#define ATTR_ARCHIVE 0x20
50#define ATTR_VOLUME 0x40 /* this is a volume, not a real directory */ 50#define ATTR_VOLUME 0x40 /* this is a volume, not a real directory */
51#define ATTR_LINK 0x80
51 52
52#ifdef HAVE_DIRCACHE 53#ifdef HAVE_DIRCACHE
53# include "dircache.h" 54# include "dircache.h"
diff --git a/firmware/target/hosted/android/fs-android.c b/firmware/target/hosted/android/fs-android.c
index 1967198d3d..c6d22a477e 100644
--- a/firmware/target/hosted/android/fs-android.c
+++ b/firmware/target/hosted/android/fs-android.c
@@ -105,26 +105,37 @@ struct dirinfo dir_get_info(struct DIR* _parent, struct dirent *dir)
105{ 105{
106 struct __dir *parent = (struct __dir*)_parent; 106 struct __dir *parent = (struct __dir*)_parent;
107 struct stat s; 107 struct stat s;
108 struct tm *tm; 108 struct tm *tm = NULL;
109 struct dirinfo ret; 109 struct dirinfo ret;
110 char path[MAX_PATH]; 110 char path[MAX_PATH];
111 111
112 snprintf(path, sizeof(path), "%s/%s", parent->path, dir->d_name); 112 snprintf(path, sizeof(path), "%s/%s", parent->path, dir->d_name);
113 stat(path, &s);
114 memset(&ret, 0, sizeof(ret)); 113 memset(&ret, 0, sizeof(ret));
115 114
116 if (S_ISDIR(s.st_mode)) 115 if (!stat(path, &s))
117 { 116 {
118 ret.attribute = ATTR_DIRECTORY; 117 if (S_ISDIR(s.st_mode))
118 {
119 ret.attribute = ATTR_DIRECTORY;
120 }
121 ret.size = s.st_size;
122 tm = localtime(&(s.st_mtime));
123 }
124
125 if (!lstat(path, &s) && S_ISLNK(s.st_mode))
126 {
127 ret.attribute |= ATTR_LINK;
128 }
129
130 if (tm)
131 {
132 ret.wrtdate = ((tm->tm_year - 80) << 9) |
133 ((tm->tm_mon + 1) << 5) |
134 tm->tm_mday;
135 ret.wrttime = (tm->tm_hour << 11) |
136 (tm->tm_min << 5) |
137 (tm->tm_sec >> 1);
119 } 138 }
120 139
121 ret.size = s.st_size;
122 tm = localtime(&(s.st_mtime));
123 ret.wrtdate = ((tm->tm_year - 80) << 9) |
124 ((tm->tm_mon + 1) << 5) |
125 tm->tm_mday;
126 ret.wrttime = (tm->tm_hour << 11) |
127 (tm->tm_min << 5) |
128 (tm->tm_sec >> 1);
129 return ret; 140 return ret;
130} 141}