diff options
author | Thomas Martitz <kugel@rockbox.org> | 2010-12-23 19:02:18 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2010-12-23 19:02:18 +0000 |
commit | 87c8be4a08b4864f0df588c80bc90586f5e512a0 (patch) | |
tree | c2265c82437eae7533569f1c6b6e254a321a06f4 /uisimulator/common/io.c | |
parent | e1b1183f401974700a67db76f39e2bba9a5984e1 (diff) | |
download | rockbox-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 'uisimulator/common/io.c')
-rw-r--r-- | uisimulator/common/io.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/uisimulator/common/io.c b/uisimulator/common/io.c index fe7bad438f..56abf4b6ad 100644 --- a/uisimulator/common/io.c +++ b/uisimulator/common/io.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "config.h" | 28 | #include "config.h" |
29 | 29 | ||
30 | #define HAVE_STATVFS (!defined(WIN32)) | 30 | #define HAVE_STATVFS (!defined(WIN32)) |
31 | #define HAVE_LSTAT (!defined(WIN32)) | ||
31 | 32 | ||
32 | #if HAVE_STATVFS | 33 | #if HAVE_STATVFS |
33 | #include <sys/statvfs.h> | 34 | #include <sys/statvfs.h> |
@@ -314,7 +315,7 @@ struct sim_dirent *sim_readdir(MYDIR *dir) | |||
314 | static struct sim_dirent secret; | 315 | static struct sim_dirent secret; |
315 | STAT_T s; | 316 | STAT_T s; |
316 | DIRENT_T *x11 = READDIR(dir->dir); | 317 | DIRENT_T *x11 = READDIR(dir->dir); |
317 | struct tm* tm; | 318 | struct tm tm; |
318 | 319 | ||
319 | if(!x11) | 320 | if(!x11) |
320 | return (struct sim_dirent *)0; | 321 | return (struct sim_dirent *)0; |
@@ -324,20 +325,35 @@ struct sim_dirent *sim_readdir(MYDIR *dir) | |||
324 | /* build file name */ | 325 | /* build file name */ |
325 | snprintf(buffer, sizeof(buffer), "%s/%s", | 326 | snprintf(buffer, sizeof(buffer), "%s/%s", |
326 | get_sim_pathname(dir->name), secret.d_name); | 327 | get_sim_pathname(dir->name), secret.d_name); |
327 | STAT(buffer, &s); /* get info */ | 328 | if (STAT(buffer, &s)) /* get info */ |
329 | return NULL; | ||
328 | 330 | ||
329 | #define ATTR_DIRECTORY 0x10 | 331 | #define ATTR_DIRECTORY 0x10 |
330 | 332 | ||
331 | secret.info.attribute = S_ISDIR(s.st_mode)?ATTR_DIRECTORY:0; | 333 | secret.info.attribute = 0; |
334 | |||
335 | if (S_ISDIR(s.st_mode)) | ||
336 | secret.info.attribute = ATTR_DIRECTORY; | ||
337 | |||
332 | secret.info.size = s.st_size; | 338 | secret.info.size = s.st_size; |
339 | |||
340 | if (localtime_r(&(s.st_mtime), &tm) == NULL) | ||
341 | return NULL; | ||
342 | secret.info.wrtdate = ((tm.tm_year - 80) << 9) | | ||
343 | ((tm.tm_mon + 1) << 5) | | ||
344 | tm.tm_mday; | ||
345 | secret.info.wrttime = (tm.tm_hour << 11) | | ||
346 | (tm.tm_min << 5) | | ||
347 | (tm.tm_sec >> 1); | ||
348 | |||
349 | #ifdef HAVE_LSTAT | ||
350 | #define ATTR_LINK 0x80 | ||
351 | if (!lstat(buffer, &s) && S_ISLNK(s.st_mode)) | ||
352 | { | ||
353 | secret.info.attribute |= ATTR_LINK; | ||
354 | } | ||
355 | #endif | ||
333 | 356 | ||
334 | tm = localtime(&(s.st_mtime)); | ||
335 | secret.info.wrtdate = ((tm->tm_year - 80) << 9) | | ||
336 | ((tm->tm_mon + 1) << 5) | | ||
337 | tm->tm_mday; | ||
338 | secret.info.wrttime = (tm->tm_hour << 11) | | ||
339 | (tm->tm_min << 5) | | ||
340 | (tm->tm_sec >> 1); | ||
341 | return &secret; | 357 | return &secret; |
342 | } | 358 | } |
343 | 359 | ||