Makes apps and plugins interract with directories using a posix-like api instead of calling dircache / simulator functions (no additionnal layer added, only a cosmetic change)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13943 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/filetree.c b/apps/filetree.c
index 90b234a..bc4709b 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -38,7 +38,6 @@
 #include "plugin.h"
 #include "rolo.h"
 #include "sprintf.h"
-#include "dircache.h"
 #include "splash.h"
 #include "yesno.h"
 #include "cuesheet.h"
@@ -84,11 +83,11 @@
 static void check_file_thumbnails(struct tree_context* c)
 {
     int i;
-    struct dircache_entry *entry;
+    struct dirent *entry;
     struct entry* dircache = c->dircache;
-    DIRCACHED *dir;
+    DIR *dir;
 
-    dir = opendir_cached(c->currdir);
+    dir = opendir(c->currdir);
     if(!dir)
         return;
     /* mark all files as non talking, except the .talk ones */
@@ -109,7 +108,7 @@
         }
     }
 
-    while((entry = readdir_cached(dir)) != 0) /* walk directory */
+    while((entry = readdir(dir)) != 0) /* walk directory */
     {
         int ext_pos;
 
@@ -135,7 +134,7 @@
             }
         }
     }
-    closedir_cached(dir);
+    closedir(dir);
 }
 
 /* support function for qsort() */
@@ -209,12 +208,12 @@
 {
     int i;
     int name_buffer_used = 0;
-    DIRCACHED *dir;
+    DIR *dir;
 
     if (tempdir)
-        dir = opendir_cached(tempdir);
+        dir = opendir(tempdir);
     else
-        dir = opendir_cached(c->currdir);
+        dir = opendir(c->currdir);
     if(!dir)
         return -1; /* not a directory */
 
@@ -223,7 +222,7 @@
 
     for ( i=0; i < global_settings.max_files_in_dir; i++ ) {
         int len;
-        struct dircache_entry *entry = readdir_cached(dir);
+        struct dirent *entry = readdir(dir);
         struct entry* dptr =
             (struct entry*)(c->dircache + i * sizeof(struct entry));
         if (!entry)
@@ -301,7 +300,7 @@
     }
     c->filesindir = i;
     c->dirlength = i;
-    closedir_cached(dir);
+    closedir(dir);
 
     qsort(c->dircache,i,sizeof(struct entry),compare);
 
diff --git a/apps/playlist.c b/apps/playlist.c
index 7b1b91e..f0ac29d 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -88,7 +88,6 @@
 #include "button.h"
 #include "filetree.h"
 #include "abrepeat.h"
-#include "dircache.h"
 #include "thread.h"
 #include "usb.h"
 #include "filetypes.h"
diff --git a/apps/plugin.c b/apps/plugin.c
index aff24e0..68b430d 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -222,18 +222,11 @@
     create_numbered_filename,
 
     /* dir */
-    PREFIX(opendir),
-    PREFIX(closedir),
-    PREFIX(readdir),
-    PREFIX(mkdir),
-    PREFIX(rmdir),
-
-    /* dir, cached */
-#ifdef HAVE_DIRCACHE
-    opendir_cached,
-    readdir_cached,
-    closedir_cached,
-#endif
+    opendir,
+    closedir,
+    readdir,
+    mkdir,
+    rmdir,
 
     /* kernel/ system */
     PREFIX(sleep),
diff --git a/apps/plugin.h b/apps/plugin.h
index 920d804..ac69881 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -37,9 +37,6 @@
 #include "config.h"
 #include "system.h"
 #include "dir.h"
-#ifndef SIMULATOR
-#include "dircache.h"
-#endif
 #include "kernel.h"
 #include "thread.h"
 #include "button.h"
@@ -115,12 +112,12 @@
 #define PLUGIN_MAGIC 0x526F634B /* RocK */
 
 /* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 62
+#define PLUGIN_API_VERSION 63
 
 /* update this to latest version if a change to the api struct breaks
    backwards compatibility (and please take the opportunity to sort in any
    new function which are "waiting" at the end of the function table) */
-#define PLUGIN_MIN_API_VERSION 62
+#define PLUGIN_MIN_API_VERSION 63
 
 /* plugin return codes */
 enum plugin_status {
@@ -316,17 +313,11 @@
                                       int numberlen IF_CNFN_NUM_(, int *num));
 
     /* dir */
-    DIR* (*PREFIX(opendir))(const char* name);
-    int (*PREFIX(closedir))(DIR* dir);
-    struct dirent* (*PREFIX(readdir))(DIR* dir);
-    int (*PREFIX(mkdir))(const char *name);
-    int (*PREFIX(rmdir))(const char *name);
-    /* dir, cached */
-#ifdef HAVE_DIRCACHE
-    DIRCACHED* (*opendir_cached)(const char* name);
-    struct dircache_entry* (*readdir_cached)(DIRCACHED* dir);
-    int (*closedir_cached)(DIRCACHED* dir);
-#endif
+    DIR* (*opendir)(const char* name);
+    int (*closedir)(DIR* dir);
+    struct dirent* (*readdir)(DIR* dir);
+    int (*mkdir)(const char *name);
+    int (*rmdir)(const char *name);
 
     /* kernel/ system */
     void (*PREFIX(sleep))(int ticks);
diff --git a/apps/plugins/doom/rockdoom.c b/apps/plugins/doom/rockdoom.c
index 90c446b..a9e3481 100644
--- a/apps/plugins/doom/rockdoom.c
+++ b/apps/plugins/doom/rockdoom.c
@@ -329,7 +329,7 @@
    char           *startpt;
    struct menu_item *temp;
 
-   filedir=opendir(directory);
+   filedir=rb->opendir(directory);
 
    if(filedir==NULL)
    {
@@ -345,8 +345,8 @@
       i++;
 
    // Reset the directory
-   closedir(filedir);
-   filedir=opendir(directory);
+   rb->closedir(filedir);
+   filedir=rb->opendir(directory);
 
    i++;
    temp=malloc(i*sizeof(struct opt_items));
@@ -365,7 +365,7 @@
          i++;
       }
    }
-   closedir(filedir);
+   rb->closedir(filedir);
    *names=temp;
    return i;
 }
diff --git a/apps/plugins/doom/rockmacros.h b/apps/plugins/doom/rockmacros.h
index 86de4cb..1541ef4 100644
--- a/apps/plugins/doom/rockmacros.h
+++ b/apps/plugins/doom/rockmacros.h
@@ -40,26 +40,17 @@
 #define read_line(a,b,c)   rb->read_line((a),(b),(c))
 
 #ifdef SIMULATOR
-#undef opendir
-#undef closedir
-#undef mkdir
 #undef open
 #undef lseek
 #undef filesize
-#define opendir(a)         rb->sim_opendir((a))
-#define closedir(a)        rb->sim_closedir((a))
-#define mkdir(a)           rb->sim_mkdir((a))
 #define open(a,b)          rb->sim_open((a),(b))
 #define lseek(a,b,c)       rb->sim_lseek((a),(b),(c))
 #define filesize(a)        rb->sim_filesize((a))
 #else /* !SIMULATOR */
-#define opendir(a)         rb->opendir((a))
-#define closedir(a)        rb->closedir((a))
-#define filesize(a)        rb->filesize((a))
-#define mkdir(a)           rb->mkdir((a))
 #define open(a,b)          my_open((a),(b))
 #define close(a)           my_close((a))
 #define lseek(a,b,c)       rb->lseek((a),(b),(c))
+#define filesize(a)        rb->filesize((a))
 #endif /* !SIMULATOR */
 
 #define strtok(a,b)        my_strtok((a),(b))
diff --git a/apps/plugins/properties.c b/apps/plugins/properties.c
index 3b4f279..86817e2 100644
--- a/apps/plugins/properties.c
+++ b/apps/plugins/properties.c
@@ -59,30 +59,18 @@
 {
     bool found = false;
     char tstr[MAX_PATH];
-#ifdef HAVE_DIRCACHE
-    DIRCACHED* dir;
-    struct dircache_entry* entry;
-#else
     DIR* dir;
     struct dirent* entry;
-#endif
+
     char* ptr = rb->strrchr(selected_file, '/') + 1;
     int dirlen = (ptr - selected_file);
     rb->strncpy(tstr, selected_file, dirlen);
     tstr[dirlen] = 0;
 
-#ifdef HAVE_DIRCACHE
-    dir = rb->opendir_cached(tstr);
-#else
     dir = rb->opendir(tstr);
-#endif
     if (dir)
     {
-#ifdef HAVE_DIRCACHE
-        while(0 != (entry = rb->readdir_cached(dir)))
-#else
         while(0 != (entry = rb->readdir(dir)))
-#endif
         {
             if(!rb->strcmp(entry->d_name, selected_file+dirlen))
             {
@@ -103,11 +91,7 @@
                 break;
             }
         }
-#ifdef HAVE_DIRCACHE
-        rb->closedir_cached(dir);
-#else
         rb->closedir(dir);
-#endif
     }
     return found;
 }
@@ -128,30 +112,17 @@
        and informs the user of the progress */
     bool result;
     int dirlen;
-#ifdef HAVE_DIRCACHE
-    DIRCACHED* dir;
-    struct dircache_entry* entry;
-#else
     DIR* dir;
     struct dirent* entry;
-#endif
 
     result = true;
     dirlen = rb->strlen(dps->dirname);
-#ifdef HAVE_DIRCACHE
-    dir = rb->opendir_cached(dps->dirname);
-#else
     dir = rb->opendir(dps->dirname);
-#endif
     if (!dir)
         return false; /* open error */
 
     /* walk through the directory content */
-#ifdef HAVE_DIRCACHE
-    while(result && (0 != (entry = rb->readdir_cached(dir))))
-#else
     while(result && (0 != (entry = rb->readdir(dir))))
-#endif
     {
         /* append name to current directory */
         rb->snprintf(dps->dirname+dirlen, dps->len-dirlen, "/%s",
@@ -189,12 +160,7 @@
             result = false;
         rb->yield();
     }
-#ifdef HAVE_DIRCACHE
-    rb->closedir_cached(dir);
-#else
     rb->closedir(dir);
-#endif
-
     return result;
 }
 
@@ -256,30 +222,17 @@
 
     /* determine if it's a file or a directory */
     bool found = false;
-#ifdef HAVE_DIRCACHE
-    DIRCACHED* dir;
-    struct dircache_entry* entry;
-#else
     DIR* dir;
     struct dirent* entry;
-#endif
     char* ptr = rb->strrchr((char*)file, '/') + 1;
     int dirlen = (ptr - (char*)file);
     rb->strncpy(str_dirname, (char*)file, dirlen);
     str_dirname[dirlen] = 0;
 
-#ifdef HAVE_DIRCACHE
-    dir = rb->opendir_cached(str_dirname);
-#else
     dir = rb->opendir(str_dirname);
-#endif
     if (dir)
     {
-#ifdef HAVE_DIRCACHE
-        while(0 != (entry = rb->readdir_cached(dir)))
-#else
         while(0 != (entry = rb->readdir(dir)))
-#endif
         {
             if(!rb->strcmp(entry->d_name, file+dirlen))
             {
@@ -288,11 +241,7 @@
                 break;
             }
         }
-#ifdef HAVE_DIRCACHE
-        rb->closedir_cached(dir);
-#else
         rb->closedir(dir);
-#endif
     }
     /* now we know if it's a file or a dir or maybe something failed */
     
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c
index 46a0aa5..93bd98c 100644
--- a/apps/plugins/rockboy/rockboy.c
+++ b/apps/plugins/rockboy/rockboy.c
@@ -71,11 +71,11 @@
    DIR* dir;
    char optionsave[sizeof(savedir)+sizeof(optionname)];
 
-    dir=opendir(savedir);
+    dir=rb->opendir(savedir);
     if(!dir)
-      mkdir(savedir);
+      rb->mkdir(savedir);
     else
-      closedir(dir);
+      rb->closedir(dir);
 
    snprintf(optionsave, sizeof(optionsave), "%s/%s", savedir, optionname);
 
diff --git a/apps/plugins/rockboy/rockmacros.h b/apps/plugins/rockboy/rockmacros.h
index ecf8a1e..5d60d3f 100644
--- a/apps/plugins/rockboy/rockmacros.h
+++ b/apps/plugins/rockboy/rockmacros.h
@@ -71,22 +71,13 @@
 #define isalnum(c) (isdigit(c) || (isalpha(c)))
 
 #ifdef SIMULATOR
-#undef opendir
-#define opendir(a)      rb->sim_opendir((a))
-#undef closedir
-#define closedir(a)     rb->sim_closedir((a))
-#undef mkdir
-#define mkdir(a)        rb->sim_mkdir((a))
 #undef open
 #define open(a,b)       rb->sim_open((a),(b))
-#undef close
-#define close(a)        rb->close((a))
 #undef lseek
 #define lseek(a,b,c)    rb->sim_lseek((a),(b),(c))
+#undef close
+#define close(a)        rb->close((a))
 #else /* !SIMULATOR */
-#define opendir(a)      rb->opendir((a))
-#define closedir(a)     rb->closedir((a))
-#define mkdir(a)        rb->mkdir((a))
 #define open(a,b)       rb->open((a),(b))
 #define lseek(a,b,c)    rb->lseek((a),(b),(c))
 #define close(a)        rb->close((a))
diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c
index d478bf9..a273e4c 100644
--- a/apps/plugins/rockpaint.c
+++ b/apps/plugins/rockpaint.c
@@ -688,7 +688,7 @@
 
     while( 1 )
     {
-        d = rb->PREFIX(opendir)( bbuf );
+        d = rb->opendir( bbuf );
         if( !d )
         {
             /*
@@ -702,7 +702,7 @@
             else if( errno == EACCES || errno == ENOENT )
             {
                 bbuf[0] = '/'; bbuf[1] = '\0';
-                d = rb->PREFIX(opendir)( "/" );
+                d = rb->opendir( "/" );
             }
             else
             {
@@ -714,12 +714,12 @@
         li = -1;
         while( i < fvi )
         {
-            rb->PREFIX(readdir)( d );
+            rb->readdir( d );
             i++;
         }
         while( top_inside+(i-fvi)*(fh+LINE_SPACE) < HEIGHT )
         {
-            de = rb->PREFIX(readdir)( d );
+            de = rb->readdir( d );
             if( !de )
             {
                 li = i-1;
@@ -737,12 +737,12 @@
         lvi = i-1;
         if( li == -1 )
         {
-            if( !rb->PREFIX(readdir)( d ) )
+            if( !rb->readdir( d ) )
             {
                 li = lvi;
             }
         }
-        rb->PREFIX(closedir)( d );
+        rb->closedir( d );
 
         rb->lcd_update();
 
@@ -863,7 +863,7 @@
         {
             b_need_redraw = 0;
 
-            d = rb->PREFIX(opendir)( FONT_DIR "/" );
+            d = rb->opendir( FONT_DIR "/" );
             if( !d )
             {
                 return false;
@@ -873,7 +873,7 @@
             li = -1;
             while( i < fvi )
             {
-                rb->PREFIX(readdir)( d );
+                rb->readdir( d );
                 i++;
             }
             cp = top_inside+LINE_SPACE;
@@ -883,7 +883,7 @@
 
             while( cp < top+HEIGHT )
             {
-                de = rb->PREFIX(readdir)( d );
+                de = rb->readdir( d );
                 if( !de )
                 {
                     li = i-1;
@@ -920,7 +920,7 @@
             lvi = i-1;
             if( li == -1 )
             {
-                if( !(de = rb->PREFIX(readdir)( d ) ) )
+                if( !(de = rb->readdir( d ) ) )
                 {
                     li = lvi;
                 }
@@ -936,7 +936,7 @@
                 }
             }
             rb->font_load( old_font );
-            rb->PREFIX(closedir)( d );
+            rb->closedir( d );
         }
 
         rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 41138dd..f832f1e 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -70,7 +70,7 @@
 #include "crc32.h"
 #include "misc.h"
 #include "settings.h"
-#include "dircache.h"
+#include "dir.h"
 #include "structec.h"
 #ifndef __PCTOOL__
 #include "atoi.h"
@@ -327,7 +327,7 @@
 
 #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
 static long find_entry_ram(const char *filename,
-                           const struct dircache_entry *dc)
+                           const struct dirent *dc)
 {
     static long last_pos = 0;
     int i;
@@ -626,7 +626,7 @@
 # ifdef HAVE_DIRCACHE
         if (tag == tag_filename && idx->flag & FLAG_DIRCACHE)
         {
-            dircache_copy_path((struct dircache_entry *)seek,
+            dircache_copy_path((struct dirent *)seek,
                                buf, size);
             return true;
         }
@@ -1329,7 +1329,7 @@
 # ifdef HAVE_DIRCACHE
         if (tcs->type == tag_filename)
         {
-            dircache_copy_path((struct dircache_entry *)tcs->position,
+            dircache_copy_path((struct dirent *)tcs->position,
                                buf, sizeof buf);
             tcs->result = buf;
             tcs->result_len = strlen(buf) + 1;
@@ -1583,7 +1583,7 @@
     offset += entry.tag_length[tag]
     
 #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
-static void add_tagcache(char *path, const struct dircache_entry *dc)
+static void add_tagcache(char *path, const struct dirent *dc)
 #else
 static void add_tagcache(char *path)
 #endif
@@ -3464,7 +3464,7 @@
             if (tag == tag_filename)
             {
 # ifdef HAVE_DIRCACHE
-                const struct dircache_entry *dc;
+                const struct dirent *dc;
 # endif
                 
                 // FIXME: This is wrong!
@@ -3647,14 +3647,14 @@
 
 static bool check_dir(const char *dirname)
 {
-    DIRCACHED *dir;
+    DIR *dir;
     int len;
     int success = false;
 
-    dir = opendir_cached(dirname);
+    dir = opendir(dirname);
     if (!dir)
     {
-        logf("tagcache: opendir_cached() failed");
+        logf("tagcache: opendir() failed");
         return false;
     }
     
@@ -3665,9 +3665,9 @@
     while (!check_event_queue())
 #endif
     {
-        struct dircache_entry *entry;
+        struct dirent *entry;
 
-        entry = readdir_cached(dir);
+        entry = readdir(dir);
     
         if (entry == NULL)
         {
@@ -3698,7 +3698,7 @@
         curpath[len] = '\0';
     }
     
-    closedir_cached(dir);
+    closedir(dir);
 
     return success;
 }
diff --git a/apps/tree.c b/apps/tree.c
index b54238b..ccdbd69 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -931,20 +931,20 @@
 static bool add_dir(char* dirname, int len, int fd)
 {
     bool abort = false;
-    DIRCACHED* dir;
+    DIR* dir;
 
     /* check for user abort */
     if (action_userabort(TIMEOUT_NOBLOCK))
         return true;
 
-    dir = opendir_cached(dirname);
+    dir = opendir(dirname);
     if(!dir)
         return true;
 
     while (true) {
-        struct dircache_entry *entry;
+        struct dirent *entry;
 
-        entry = readdir_cached(dir);
+        entry = readdir(dir);
         if (!entry)
             break;
         if (entry->attribute & ATTR_DIRECTORY) {
@@ -1021,7 +1021,7 @@
             }
         }
     }
-    closedir_cached(dir);
+    closedir(dir);
 
     return abort;
 }
diff --git a/firmware/SOURCES b/firmware/SOURCES
index d899551..6e7762a 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -28,7 +28,7 @@
 #endif
 common/ctype.c
 #ifndef SIMULATOR
-common/dir.c
+common/dir_uncached.c
 common/file.c
 #endif /* SIMULATOR */
 #ifdef HAVE_DIRCACHE
diff --git a/firmware/common/dir.c b/firmware/common/dir_uncached.c
similarity index 89%
rename from firmware/common/dir.c
rename to firmware/common/dir_uncached.c
index 0f46652..e6b59c3 100644
--- a/firmware/common/dir.c
+++ b/firmware/common/dir_uncached.c
@@ -5,7 +5,7 @@
  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
  *                     \/            \/     \/    \/            \/
- * $Id$
+ * $Id: dir.c 13741 2007-06-30 02:08:27Z jethead71 $
  *
  * Copyright (C) 2002 by Björn Stenberg
  *
@@ -24,11 +24,11 @@
 #include "dir.h"
 #include "debug.h"
 #include "atoi.h"
-#include "dircache.h"
+//#include "dircache.h"
 
 #define MAX_OPEN_DIRS 8
 
-static DIR opendirs[MAX_OPEN_DIRS];
+static DIR_UNCACHED opendirs[MAX_OPEN_DIRS];
 
 #ifdef HAVE_MULTIVOLUME
 
@@ -78,7 +78,7 @@
 // release all dir handles on a given volume "by force", to avoid leaks
 int release_dirs(int volume)
 {
-    DIR* pdir = opendirs;
+    DIR_UNCACHED* pdir = opendirs;
     int dd;
     int closed = 0;
     for ( dd=0; dd<MAX_OPEN_DIRS; dd++, pdir++)
@@ -93,14 +93,14 @@
 }
 #endif /* #ifdef HAVE_HOTSWAP */
 
-DIR* opendir(const char* name)
+DIR_UNCACHED* opendir_uncached(const char* name)
 {
     char namecopy[MAX_PATH];
     char* part;
     char* end;
     struct fat_direntry entry;
     int dd;
-    DIR* pdir = opendirs;
+    DIR_UNCACHED* pdir = opendirs;
 #ifdef HAVE_MULTIVOLUME
     int volume;
 #endif
@@ -170,16 +170,16 @@
     return pdir;
 }
 
-int closedir(DIR* dir)
+int closedir_uncached(DIR_UNCACHED* dir)
 {
     dir->busy=false;
     return 0;
 }
 
-struct dirent* readdir(DIR* dir)
+struct dirent_uncached* readdir_uncached(DIR_UNCACHED* dir)
 {
     struct fat_direntry entry;
-    struct dirent* theent = &(dir->theent);
+    struct dirent_uncached* theent = &(dir->theent);
 
     if (!dir->busy)
         return NULL;
@@ -191,7 +191,7 @@
      && dir->volumecounter < NUM_VOLUMES /* in range */
      && dir->fatdir.file.volume == 0) /* at volume 0 */
     {   /* fake special directories, which don't really exist, but
-           will get redirected upon opendir() */
+           will get redirected upon opendir_uncached() */
         while (++dir->volumecounter < NUM_VOLUMES)
         {
             if (fat_ismounted(dir->volumecounter))
@@ -222,14 +222,14 @@
     return theent;
 }
 
-int mkdir(const char *name)
+int mkdir_uncached(const char *name)
 {
-    DIR *dir;
+    DIR_UNCACHED *dir;
     char namecopy[MAX_PATH];
     char* end;
     char *basename;
     char *parent;
-    struct dirent *entry;
+    struct dirent_uncached *entry;
     struct fat_dir newdir;
     int rc;
 
@@ -253,7 +253,7 @@
         
     DEBUGF("mkdir: parent: %s, name: %s\n", parent, basename);
 
-    dir = opendir(parent);
+    dir = opendir_uncached(parent);
     
     if(!dir) {
         DEBUGF("mkdir: can't open parent dir\n");
@@ -267,11 +267,11 @@
     }
     
     /* Now check if the name already exists */
-    while ((entry = readdir(dir))) {
+    while ((entry = readdir_uncached(dir))) {
         if ( !strcasecmp(basename, entry->d_name) ) {
             DEBUGF("mkdir error: file exists\n");
             errno = EEXIST;
-            closedir(dir);
+            closedir_uncached(dir);
             return - 4;
         }
     }
@@ -279,23 +279,18 @@
     memset(&newdir, sizeof(struct fat_dir), 0);
     
     rc = fat_create_dir(basename, &newdir, &(dir->fatdir));
-#ifdef HAVE_DIRCACHE
-    if (rc >= 0)
-        dircache_mkdir(name);
-#endif
-
-    closedir(dir);
+    closedir_uncached(dir);
     
     return rc;
 }
 
-int rmdir(const char* name)
+int rmdir_uncached(const char* name)
 {
     int rc;
-    DIR* dir;
-    struct dirent* entry;
+    DIR_UNCACHED* dir;
+    struct dirent_uncached* entry;
     
-    dir = opendir(name);
+    dir = opendir_uncached(name);
     if (!dir)
     {
         errno = ENOENT; /* open error */
@@ -303,14 +298,14 @@
     }
 
     /* check if the directory is empty */
-    while ((entry = readdir(dir)))
+    while ((entry = readdir_uncached(dir)))
     {
         if (strcmp(entry->d_name, ".") &&
             strcmp(entry->d_name, ".."))
         {
             DEBUGF("rmdir error: not empty\n");
             errno = ENOTEMPTY;
-            closedir(dir);
+            closedir_uncached(dir);
             return -2;
         }
     }
@@ -321,14 +316,7 @@
         errno = EIO;
         rc = rc * 10 - 3;
     }
-#ifdef HAVE_DIRCACHE
-    else
-    {
-        dircache_rmdir(name);
-    }
-#endif
 
-    closedir(dir);
-    
+    closedir_uncached(dir);
     return rc;
 }
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c
index be356e1..97c5884 100644
--- a/firmware/common/dircache.c
+++ b/firmware/common/dircache.c
@@ -27,7 +27,6 @@
 #include <errno.h>
 #include <string.h>
 #include <stdbool.h>
-#include "dir.h"
 #include "debug.h"
 #include "atoi.h"
 #include "system.h"
@@ -44,7 +43,7 @@
 #define DIRCACHE_STOP  2
 
 #define MAX_OPEN_DIRS 8
-DIRCACHED opendirs[MAX_OPEN_DIRS];
+DIR_CACHED opendirs[MAX_OPEN_DIRS];
 
 static struct dircache_entry *fd_bindings[MAX_OPEN_FILES];
 static struct dircache_entry *dircache_root;
@@ -165,7 +164,7 @@
 static int dircache_scan(struct travel_data *td)
 {
 #ifdef SIMULATOR
-    while ( ( td->entry = readdir(td->dir) ) )
+    while ( ( td->entry = readdir_uncached(td->dir) ) )
 #else
     while ( (fat_getnext(td->dir, &td->entry) >= 0) && (td->entry.name[0]))
 #endif
@@ -221,10 +220,10 @@
             strncpy(&dircache_cur_path[td->pathpos+1], td->entry->d_name, 
                     sizeof(dircache_cur_path) - td->pathpos - 2);
             
-            td->newdir = opendir(dircache_cur_path);
+            td->newdir = opendir_uncached(dircache_cur_path);
             if (td->newdir == NULL)
             {
-                logf("Failed to opendir(): %s", dircache_cur_path);
+                logf("Failed to opendir_uncached(): %s", dircache_cur_path);
                 return -3;
             }
 #else
@@ -269,7 +268,7 @@
  * Recursively scan the hard disk and build the cache.
  */
 #ifdef SIMULATOR
-static int dircache_travel(DIR *dir, struct dircache_entry *ce)
+static int dircache_travel(DIR_UNCACHED *dir, struct dircache_entry *ce)
 #else
 static int dircache_travel(struct fat_dir *dir, struct dircache_entry *ce)
 #endif
@@ -292,7 +291,7 @@
                 ce->d_name = ".";
                 ce->name_len = 2;
 #ifdef SIMULATOR
-                closedir(dir_recursion[depth].dir);
+                closedir_uncached(dir_recursion[depth].dir);
                 ce->attribute = ATTR_DIRECTORY;
 #else
                 ce->attribute = FAT_ATTR_DIRECTORY;
@@ -519,7 +518,7 @@
 static int dircache_do_rebuild(void)
 {
 #ifdef SIMULATOR
-    DIR *pdir;
+    DIR_UNCACHED *pdir;
 #else
     struct fat_dir dir, *pdir;
 #endif
@@ -532,7 +531,7 @@
     dircache_initializing = true;
     
 #ifdef SIMULATOR
-    pdir = opendir("/");
+    pdir = opendir_uncached("/");
     if (pdir == NULL)
     {
         logf("Failed to open rootdir");
@@ -1082,11 +1081,11 @@
     entry->startcluster = startcluster;
 }
 
-DIRCACHED* opendir_cached(const char* name)
+DIR_CACHED* opendir_cached(const char* name)
 {
     struct dircache_entry *cache_entry;
     int dd;
-    DIRCACHED* pdir = opendirs;
+    DIR_CACHED* pdir = opendirs;
 
     if ( name[0] != '/' )
     {
@@ -1108,7 +1107,7 @@
 
     if (!dircache_initialized)
     {
-        pdir->regulardir = opendir(name);
+        pdir->regulardir = opendir_uncached(name);
         if (!pdir->regulardir)
             return NULL;
         
@@ -1130,9 +1129,9 @@
     return pdir;
 }
 
-struct dircache_entry* readdir_cached(DIRCACHED* dir)
+struct dircache_entry* readdir_cached(DIR_CACHED* dir)
 {
-    struct dirent *regentry;
+    struct dirent_uncached *regentry;
     struct dircache_entry *ce;
     
     if (!dir->busy)
@@ -1140,7 +1139,7 @@
 
     if (dir->regulardir != NULL)
     {
-        regentry = readdir(dir->regulardir);
+        regentry = readdir_uncached(dir->regulardir);
         if (regentry == NULL)
             return NULL;
 
@@ -1181,15 +1180,30 @@
     return &dir->secondary_entry;
 }
 
-int closedir_cached(DIRCACHED* dir)
+int closedir_cached(DIR_CACHED* dir)
 {
     if (!dir->busy)
         return -1;
         
     dir->busy=false;
     if (dir->regulardir != NULL)
-        return closedir(dir->regulardir);
+        return closedir_uncached(dir->regulardir);
     
     return 0;
 }
 
+int mkdir_cached(const char *name)
+{
+    int rc=mkdir_uncached(name);
+    if (rc >= 0)
+        dircache_mkdir(name);
+    return(rc);
+}
+
+int rmdir_cached(const char* name)
+{
+    int rc=rmdir_uncached(name);
+    if(rc>=0)
+        dircache_rmdir(name);
+    return(rc);
+}
diff --git a/firmware/common/disk.c b/firmware/common/disk.c
index f491c9b..563bb05 100644
--- a/firmware/common/disk.c
+++ b/firmware/common/disk.c
@@ -22,9 +22,9 @@
 #include "fat.h"
 #ifdef HAVE_HOTSWAP
 #include "hotswap.h"
+#include "dir.h" /* for release_dirs() */
+#include "file.h" /* for release_files() */
 #endif
-#include "file.h" /* for release_dirs() */
-#include "dir.h" /* for release_files() */
 #include "disk.h"
 
 /* Partition table entry layout:
diff --git a/firmware/common/file.c b/firmware/common/file.c
index bc57d55..d526f28 100644
--- a/firmware/common/file.c
+++ b/firmware/common/file.c
@@ -21,7 +21,7 @@
 #include <stdbool.h>
 #include "file.h"
 #include "fat.h"
-#include "dir.h"
+#include "dir_uncached.h"
 #include "debug.h"
 #include "dircache.h"
 #include "system.h"
@@ -59,8 +59,8 @@
 
 static int open_internal(const char* pathname, int flags, bool use_cache)
 {
-    DIR* dir;
-    struct dirent* entry;
+    DIR_UNCACHED* dir;
+    struct dirent_uncached* entry;
     int fd;
     char pathnamecopy[MAX_PATH];
     char* name;
@@ -134,12 +134,12 @@
     name=strrchr(pathnamecopy+1,'/');
     if ( name ) {
         *name = 0; 
-        dir = opendir(pathnamecopy);
+        dir = opendir_uncached(pathnamecopy);
         *name = '/';
         name++;
     }
     else {
-        dir = opendir("/");
+        dir = opendir_uncached("/");
         name = pathnamecopy+1;
     }
     if (!dir) {
@@ -153,12 +153,12 @@
         DEBUGF("Empty file name\n");
         errno = EINVAL;
         file->busy = false;
-        closedir(dir);
+        closedir_uncached(dir);
         return -5;
     }
     
     /* scan dir for name */
-    while ((entry = readdir(dir))) {
+    while ((entry = readdir_uncached(dir))) {
         if ( !strcasecmp(name, entry->d_name) ) {
             fat_open(IF_MV2(dir->fatdir.file.volume,)
                      entry->startcluster,
@@ -180,7 +180,7 @@
                 DEBUGF("Couldn't create %s in %s\n",name,pathnamecopy);
                 errno = EIO;
                 file->busy = false;
-                closedir(dir);
+                closedir_uncached(dir);
                 return rc * 10 - 6;
             }
 #ifdef HAVE_DIRCACHE
@@ -193,18 +193,18 @@
             DEBUGF("Couldn't find %s in %s\n",name,pathnamecopy);
             errno = ENOENT;
             file->busy = false;
-            closedir(dir);
+            closedir_uncached(dir);
             return -7;
         }
     } else {
         if(file->write && (file->attr & FAT_ATTR_DIRECTORY)) {
             errno = EISDIR;
             file->busy = false;
-            closedir(dir);
+            closedir_uncached(dir);
             return -8;
         }
     }
-    closedir(dir);
+    closedir_uncached(dir);
 
     file->cacheoffset = -1;
     file->fileoffset = 0;
@@ -327,7 +327,7 @@
 int rename(const char* path, const char* newpath)
 {
     int rc, fd;
-    DIR* dir;
+    DIR_UNCACHED* dir;
     char* nameptr;
     char* dirptr;
     struct filedesc* file;
@@ -371,7 +371,7 @@
         dirptr = "/";
     }
     
-    dir = opendir(dirptr);
+    dir = opendir_uncached(dirptr);
     if(!dir)
         return - 5;
     
@@ -401,7 +401,7 @@
         return rc * 10 - 8;
     }
 
-    rc = closedir(dir);
+    rc = closedir_uncached(dir);
     if (rc<0) {
         errno = EIO;
         return rc * 10 - 9;
diff --git a/firmware/include/dir.h b/firmware/include/dir.h
index 020b24a..8778d0b 100644
--- a/firmware/include/dir.h
+++ b/firmware/include/dir.h
@@ -7,7 +7,7 @@
  *                     \/            \/     \/    \/            \/
  * $Id$
  *
- * Copyright (C) 2002 by Björn Stenberg
+ * Copyright (C) 2007 by Kévin Ferrare
  *
  * All files in this archive are subject to the GNU General Public License.
  * See the file COPYING in the source tree root for full license agreement.
@@ -16,76 +16,30 @@
  * KIND, either express or implied.
  *
  ****************************************************************************/
+
 #ifndef _DIR_H_
 #define _DIR_H_
 
-#include <stdbool.h>
-#include "file.h"
-
-#define ATTR_READ_ONLY   0x01
-#define ATTR_HIDDEN      0x02
-#define ATTR_SYSTEM      0x04
-#define ATTR_VOLUME_ID   0x08
-#define ATTR_DIRECTORY   0x10
-#define ATTR_ARCHIVE     0x20
-#define ATTR_VOLUME      0x40 /* this is a volume, not a real directory */
-
-#ifdef SIMULATOR
-#define dirent sim_dirent
-#define DIR SIM_DIR
-#define opendir(x) sim_opendir(x)
-#define readdir(x) sim_readdir(x)
-#define closedir(x) sim_closedir(x)
-#define mkdir(x) sim_mkdir(x)
-#define rmdir(x) sim_rmdir(x)
-#endif
-
-#ifndef DIRENT_DEFINED
-
-struct dirent {
-    unsigned char d_name[MAX_PATH];
-    int attribute;
-    long size;
-    long startcluster;
-    unsigned short wrtdate; /*  Last write date */ 
-    unsigned short wrttime; /*  Last write time */
-};
-#endif
-
-#include "fat.h"
-
-typedef struct {
-#ifndef SIMULATOR
-    bool busy;
-    long startcluster;
-    struct fat_dir fatdir;
-    struct fat_dir parent_dir;
-    struct dirent theent;
-#ifdef HAVE_MULTIVOLUME
-    int volumecounter; /* running counter for faked volume entries */
-#endif
+#ifdef HAVE_DIRCACHE
+# include "dircache.h"
+# define DIR DIR_CACHED
+# define dirent dircache_entry
+# define opendir opendir_cached
+# define closedir closedir_cached
+# define readdir readdir_cached
+# define closedir closedir_cached
+# define mkdir mkdir_cached
+# define rmdir rmdir_cached
 #else
-    /* simulator: */
-    void *dir; /* actually a DIR* dir */
-    char *name;
+#include "dir_uncached.h"
+# define DIR DIR_UNCACHED
+# define dirent dirent_uncached
+# define opendir opendir_uncached
+# define closedir closedir_uncached
+# define readdir readdir_uncached
+# define closedir closedir_uncached
+# define mkdir mkdir_uncached
+# define rmdir rmdir_uncached
 #endif
-} DIR;
-
-#ifdef HAVE_HOTSWAP
-char *get_volume_name(int volume);
-#endif
-
-#ifndef DIRFUNCTIONS_DEFINED
-
-extern DIR* opendir(const char* name);
-extern int closedir(DIR* dir);
-extern int mkdir(const char* name);
-extern int rmdir(const char* name);
-
-extern struct dirent* readdir(DIR* dir);
-
-extern int release_dirs(int volume);
-
-#endif /* DIRFUNCTIONS_DEFINED */
 
 #endif
diff --git a/firmware/include/dir_uncached.h b/firmware/include/dir_uncached.h
new file mode 100644
index 0000000..575c3b6
--- /dev/null
+++ b/firmware/include/dir_uncached.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: dir.h 13741 2007-06-30 02:08:27Z jethead71 $
+ *
+ * Copyright (C) 2002 by Björn Stenberg
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef _DIR_UNCACHED_H_
+#define _DIR_UNCACHED_H_
+
+#include <stdbool.h>
+#include "file.h"
+
+#define ATTR_READ_ONLY   0x01
+#define ATTR_HIDDEN      0x02
+#define ATTR_SYSTEM      0x04
+#define ATTR_VOLUME_ID   0x08
+#define ATTR_DIRECTORY   0x10
+#define ATTR_ARCHIVE     0x20
+#define ATTR_VOLUME      0x40 /* this is a volume, not a real directory */
+
+#ifdef SIMULATOR
+#define dirent_uncached sim_dirent
+#define DIR_UNCACHED SIM_DIR
+#define opendir_uncached sim_opendir
+#define readdir_uncached sim_readdir
+#define closedir_uncached sim_closedir
+#define mkdir_uncached sim_mkdir
+#define rmdir_uncached sim_rmdir
+#endif
+
+#ifndef DIRENT_DEFINED
+
+struct dirent_uncached {
+    unsigned char d_name[MAX_PATH];
+    int attribute;
+    long size;
+    long startcluster;
+    unsigned short wrtdate; /*  Last write date */ 
+    unsigned short wrttime; /*  Last write time */
+};
+#endif
+
+#include "fat.h"
+
+typedef struct {
+#ifndef SIMULATOR
+    bool busy;
+    long startcluster;
+    struct fat_dir fatdir;
+    struct fat_dir parent_dir;
+    struct dirent_uncached theent;
+#ifdef HAVE_MULTIVOLUME
+    int volumecounter; /* running counter for faked volume entries */
+#endif
+#else
+    /* simulator: */
+    void *dir; /* actually a DIR* dir */
+    char *name;
+#endif
+} DIR_UNCACHED;
+
+#ifdef HAVE_HOTSWAP
+char *get_volume_name(int volume);
+#endif
+
+#ifndef DIRFUNCTIONS_DEFINED
+
+extern DIR_UNCACHED* opendir_uncached(const char* name);
+extern int closedir_uncached(DIR_UNCACHED* dir);
+extern int mkdir_uncached(const char* name);
+extern int rmdir_uncached(const char* name);
+
+extern struct dirent_uncached* readdir_uncached(DIR_UNCACHED* dir);
+
+extern int release_dirs(int volume);
+
+#endif /* DIRFUNCTIONS_DEFINED */
+
+#endif
diff --git a/firmware/include/dircache.h b/firmware/include/dircache.h
index 1483843..6b47f3f 100644
--- a/firmware/include/dircache.h
+++ b/firmware/include/dircache.h
@@ -19,7 +19,7 @@
 #ifndef _DIRCACHE_H
 #define _DIRCACHE_H
 
-#include "dir.h"
+#include "dir_uncached.h"
 
 #ifdef HAVE_DIRCACHE
 
@@ -34,8 +34,8 @@
     struct dircache_entry *ce;
     struct dircache_entry *down_entry;
 #ifdef SIMULATOR
-    DIR *dir, *newdir;
-    struct dirent *entry;
+    DIR_UNCACHED *dir, *newdir;
+    struct dirent_uncached *entry;
 #else
     struct fat_dir *dir;
     struct fat_dir newdir;
@@ -77,8 +77,8 @@
     struct dircache_entry *entry;
     struct dircache_entry *internal_entry;
     struct dircache_entry secondary_entry;
-    DIR *regulardir;
-} DIRCACHED;
+    DIR_UNCACHED *regulardir;
+} DIR_CACHED;
 
 void dircache_init(void);
 int dircache_load(void);
@@ -103,17 +103,11 @@
 void dircache_rename(const char *oldpath, const char *newpath);
 void dircache_add_file(const char *path, long startcluster);
 
-DIRCACHED* opendir_cached(const char* name);
-struct dircache_entry* readdir_cached(DIRCACHED* dir);
-int closedir_cached(DIRCACHED *dir);
-
-#else /* HAVE_DIRCACHE */
-# define DIRCACHED DIR
-# define dircache_entry dirent
-# define opendir_cached opendir
-# define closedir_cached closedir
-# define readdir_cached readdir
-# define closedir_cached closedir
+DIR_CACHED* opendir_cached(const char* name);
+struct dircache_entry* readdir_cached(DIR_CACHED* dir);
+int closedir_cached(DIR_CACHED *dir);
+int mkdir_cached(const char *name);
+int rmdir_cached(const char* name);
 #endif /* !HAVE_DIRCACHE */
 
 #endif