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