Index: apps/playlist.c =================================================================== --- apps/playlist.c (révision 13934) +++ apps/playlist.c (copie de travail) @@ -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" Index: apps/tree.c =================================================================== --- apps/tree.c (révision 13934) +++ apps/tree.c (copie de travail) @@ -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; } Index: apps/plugins/doom/rockdoom.c =================================================================== --- apps/plugins/doom/rockdoom.c (révision 13934) +++ apps/plugins/doom/rockdoom.c (copie de travail) @@ -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; } Index: apps/plugins/doom/rockmacros.h =================================================================== --- apps/plugins/doom/rockmacros.h (révision 13934) +++ apps/plugins/doom/rockmacros.h (copie de travail) @@ -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)) Index: apps/plugins/rockboy/rockmacros.h =================================================================== --- apps/plugins/rockboy/rockmacros.h (révision 13934) +++ apps/plugins/rockboy/rockmacros.h (copie de travail) @@ -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)) Index: apps/plugins/rockboy/rockboy.c =================================================================== --- apps/plugins/rockboy/rockboy.c (révision 13934) +++ apps/plugins/rockboy/rockboy.c (copie de travail) @@ -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); Index: apps/plugins/rockpaint.c =================================================================== --- apps/plugins/rockpaint.c (révision 13934) +++ apps/plugins/rockpaint.c (copie de travail) @@ -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); Index: apps/plugins/properties.c =================================================================== --- apps/plugins/properties.c (révision 13934) +++ apps/plugins/properties.c (copie de travail) @@ -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 */ Index: apps/filetree.c =================================================================== --- apps/filetree.c (révision 13934) +++ apps/filetree.c (copie de travail) @@ -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); Index: apps/tagcache.c =================================================================== --- apps/tagcache.c (révision 13934) +++ apps/tagcache.c (copie de travail) @@ -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; } Index: apps/plugin.c =================================================================== --- apps/plugin.c (révision 13934) +++ apps/plugin.c (copie de travail) @@ -222,19 +222,12 @@ create_numbered_filename, /* dir */ - PREFIX(opendir), - PREFIX(closedir), - PREFIX(readdir), - PREFIX(mkdir), - PREFIX(rmdir), + opendir, + closedir, + readdir, + mkdir, + rmdir, - /* dir, cached */ -#ifdef HAVE_DIRCACHE - opendir_cached, - readdir_cached, - closedir_cached, -#endif - /* kernel/ system */ PREFIX(sleep), yield, Index: apps/plugin.h =================================================================== --- apps/plugin.h (révision 13934) +++ apps/plugin.h (copie de travail) @@ -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); Index: firmware/include/dircache.h =================================================================== --- firmware/include/dircache.h (révision 13934) +++ firmware/include/dircache.h (copie de travail) @@ -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 Index: firmware/include/dir.h =================================================================== --- firmware/include/dir.h (révision 13934) +++ firmware/include/dir.h (copie de travail) @@ -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 -#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 Index: firmware/SOURCES =================================================================== --- firmware/SOURCES (révision 13934) +++ firmware/SOURCES (copie de travail) @@ -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 Index: firmware/common/disk.c =================================================================== --- firmware/common/disk.c (révision 13934) +++ firmware/common/disk.c (copie de travail) @@ -24,7 +24,6 @@ #include "hotswap.h" #endif #include "file.h" /* for release_dirs() */ -#include "dir.h" /* for release_files() */ #include "disk.h" /* Partition table entry layout: Index: firmware/common/dircache.c =================================================================== --- firmware/common/dircache.c (révision 13934) +++ firmware/common/dircache.c (copie de travail) @@ -27,7 +27,6 @@ #include #include #include -#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); +} Index: firmware/common/file.c =================================================================== --- firmware/common/file.c (révision 13934) +++ firmware/common/file.c (copie de travail) @@ -21,7 +21,7 @@ #include #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;