From 011a325e32c05f6e4817dcdc555615e6b7b6c102 Mon Sep 17 00:00:00 2001 From: Kevin Ferrare Date: Fri, 20 Jul 2007 17:06:55 +0000 Subject: 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 --- apps/filetree.c | 21 ++- apps/playlist.c | 1 - apps/plugin.c | 17 +- apps/plugin.h | 23 +-- apps/plugins/doom/rockdoom.c | 8 +- apps/plugins/doom/rockmacros.h | 11 +- apps/plugins/properties.c | 53 +----- apps/plugins/rockboy/rockboy.c | 6 +- apps/plugins/rockboy/rockmacros.h | 13 +- apps/plugins/rockpaint.c | 22 +-- apps/tagcache.c | 24 +-- apps/tree.c | 10 +- firmware/SOURCES | 2 +- firmware/common/dir.c | 334 -------------------------------------- firmware/common/dir_uncached.c | 322 ++++++++++++++++++++++++++++++++++++ firmware/common/dircache.c | 48 ++++-- firmware/common/disk.c | 4 +- firmware/common/file.c | 28 ++-- firmware/include/dir.h | 88 +++------- firmware/include/dir_uncached.h | 91 +++++++++++ firmware/include/dircache.h | 26 ++- 21 files changed, 553 insertions(+), 599 deletions(-) delete mode 100644 firmware/common/dir.c create mode 100644 firmware/common/dir_uncached.c create mode 100644 firmware/include/dir_uncached.h diff --git a/apps/filetree.c b/apps/filetree.c index 90b234a605..bc4709baab 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 @@ int ft_build_playlist(struct tree_context* c, int start_index) 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 @@ static void check_file_thumbnails(struct tree_context* c) } } - while((entry = readdir_cached(dir)) != 0) /* walk directory */ + while((entry = readdir(dir)) != 0) /* walk directory */ { int ext_pos; @@ -135,7 +134,7 @@ static void check_file_thumbnails(struct tree_context* c) } } } - closedir_cached(dir); + closedir(dir); } /* support function for qsort() */ @@ -209,12 +208,12 @@ int ft_load(struct tree_context* c, const char* tempdir) { 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 @@ int ft_load(struct tree_context* c, const char* tempdir) 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 @@ int ft_load(struct tree_context* c, const char* tempdir) } 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 7b1b91e123..f0ac29d1ef 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 aff24e0059..68b430d2f3 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -222,18 +222,11 @@ static const struct plugin_api rockbox_api = { 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 920d804ab5..ac6988152a 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 @@ struct plugin_api { 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 90c446b9eb..a9e348160f 100644 --- a/apps/plugins/doom/rockdoom.c +++ b/apps/plugins/doom/rockdoom.c @@ -329,7 +329,7 @@ int Dbuild_filelistm(struct menu_item **names, char *firstentry, char *directory char *startpt; struct menu_item *temp; - filedir=opendir(directory); + filedir=rb->opendir(directory); if(filedir==NULL) { @@ -345,8 +345,8 @@ int Dbuild_filelistm(struct menu_item **names, char *firstentry, char *directory 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 @@ int Dbuild_filelistm(struct menu_item **names, char *firstentry, char *directory 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 86de4cbe13..1541ef48fd 100644 --- a/apps/plugins/doom/rockmacros.h +++ b/apps/plugins/doom/rockmacros.h @@ -40,26 +40,17 @@ char *my_strtok( char * s, const char * delim ); #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 3b4f2797af..86817e2cc7 100644 --- a/apps/plugins/properties.c +++ b/apps/plugins/properties.c @@ -59,30 +59,18 @@ static bool file_properties(char* selected_file) { 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 @@ static bool file_properties(char* selected_file) break; } } -#ifdef HAVE_DIRCACHE - rb->closedir_cached(dir); -#else rb->closedir(dir); -#endif } return found; } @@ -128,30 +112,17 @@ static bool _dir_properties(DPS* dps) 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 @@ static bool _dir_properties(DPS* dps) result = false; rb->yield(); } -#ifdef HAVE_DIRCACHE - rb->closedir_cached(dir); -#else rb->closedir(dir); -#endif - return result; } @@ -256,30 +222,17 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file) /* 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 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file) 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 46a0aa56c3..93bd98ca78 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -71,11 +71,11 @@ void setoptions (void) 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 ecf8a1ef6a..5d60d3f3e3 100644 --- a/apps/plugins/rockboy/rockmacros.h +++ b/apps/plugins/rockboy/rockmacros.h @@ -71,22 +71,13 @@ void dynamic_recompile (struct dynarec_block *newblock); #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 d478bf9947..a273e4ca37 100644 --- a/apps/plugins/rockpaint.c +++ b/apps/plugins/rockpaint.c @@ -688,7 +688,7 @@ static bool browse( char *dst, int dst_size, const char *start ) while( 1 ) { - d = rb->PREFIX(opendir)( bbuf ); + d = rb->opendir( bbuf ); if( !d ) { /* @@ -702,7 +702,7 @@ static bool browse( char *dst, int dst_size, const char *start ) else if( errno == EACCES || errno == ENOENT ) { bbuf[0] = '/'; bbuf[1] = '\0'; - d = rb->PREFIX(opendir)( "/" ); + d = rb->opendir( "/" ); } else { @@ -714,12 +714,12 @@ static bool browse( char *dst, int dst_size, const char *start ) 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 @@ static bool browse( char *dst, int dst_size, const char *start ) 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 @@ static bool browse_fonts( char *dst, int dst_size ) { b_need_redraw = 0; - d = rb->PREFIX(opendir)( FONT_DIR "/" ); + d = rb->opendir( FONT_DIR "/" ); if( !d ) { return false; @@ -873,7 +873,7 @@ static bool browse_fonts( char *dst, int dst_size ) li = -1; while( i < fvi ) { - rb->PREFIX(readdir)( d ); + rb->readdir( d ); i++; } cp = top_inside+LINE_SPACE; @@ -883,7 +883,7 @@ static bool browse_fonts( char *dst, int dst_size ) while( cp < top+HEIGHT ) { - de = rb->PREFIX(readdir)( d ); + de = rb->readdir( d ); if( !de ) { li = i-1; @@ -920,7 +920,7 @@ static bool browse_fonts( char *dst, int dst_size ) lvi = i-1; if( li == -1 ) { - if( !(de = rb->PREFIX(readdir)( d ) ) ) + if( !(de = rb->readdir( d ) ) ) { li = lvi; } @@ -936,7 +936,7 @@ static bool browse_fonts( char *dst, int dst_size ) } } 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 41138ddf2c..f832f1e543 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 @@ static bool do_timed_yield(void) #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 @@ static bool retrieve(struct tagcache_search *tcs, struct index_entry *idx, # 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 @@ static bool get_next(struct tagcache_search *tcs) # 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 @@ static int check_if_empty(char **tag) 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 @@ static bool load_tagcache(void) 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_deleted_files(void) 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 @@ static bool check_dir(const char *dirname) 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 @@ static bool check_dir(const char *dirname) curpath[len] = '\0'; } - closedir_cached(dir); + closedir(dir); return success; } diff --git a/apps/tree.c b/apps/tree.c index b54238b08c..ccdbd69d0a 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -931,20 +931,20 @@ static long pltick; 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 @@ static bool add_dir(char* dirname, int len, int fd) } } } - closedir_cached(dir); + closedir(dir); return abort; } diff --git a/firmware/SOURCES b/firmware/SOURCES index d899551a37..6e7762ac75 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -28,7 +28,7 @@ common/crc32-mi4.c #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.c deleted file mode 100644 index 0f46652b3c..0000000000 --- a/firmware/common/dir.c +++ /dev/null @@ -1,334 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * 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. - * - ****************************************************************************/ -#include -#include -#include -#include -#include "fat.h" -#include "dir.h" -#include "debug.h" -#include "atoi.h" -#include "dircache.h" - -#define MAX_OPEN_DIRS 8 - -static DIR opendirs[MAX_OPEN_DIRS]; - -#ifdef HAVE_MULTIVOLUME - -/* how to name volumes, first char must be outside of legal file names, - a number gets appended to enumerate, if applicable */ -#ifdef HAVE_MMC -static const char* vol_names = ""; -#define VOL_ENUM_POS 4 /* position of %d, to avoid runtime calculation */ -#elif defined(HAVE_HOTSWAP) -static const char* vol_names = ""; -#define VOL_ENUM_POS 8 /* position of %d, to avoid runtime calculation */ -#else -static const char* vol_names = ""; -#define VOL_ENUM_POS 3 -#endif - -/* returns on which volume this is, and copies the reduced name - (sortof a preprocessor for volume-decorated pathnames) */ -static int strip_volume(const char* name, char* namecopy) -{ - int volume = 0; - const char *temp = name; - - while (*temp == '/') /* skip all leading slashes */ - ++temp; - - if (*temp && !strncmp(temp, vol_names, VOL_ENUM_POS)) - { - temp += VOL_ENUM_POS; /* behind special name */ - volume = atoi(temp); /* number is following */ - temp = strchr(temp, '/'); /* search for slash behind */ - if (temp != NULL) - name = temp; /* use the part behind the volume */ - else - name = "/"; /* else this must be the root dir */ - } - - strncpy(namecopy, name, MAX_PATH); - namecopy[MAX_PATH-1] = '\0'; - - return volume; -} -#endif /* #ifdef HAVE_MULTIVOLUME */ - - -#ifdef HAVE_HOTSWAP -// release all dir handles on a given volume "by force", to avoid leaks -int release_dirs(int volume) -{ - DIR* pdir = opendirs; - int dd; - int closed = 0; - for ( dd=0; ddfatdir.file.volume == volume) - { - pdir->busy = false; /* mark as available, no further action */ - closed++; - } - } - return closed; /* return how many we did */ -} -#endif /* #ifdef HAVE_HOTSWAP */ - -DIR* opendir(const char* name) -{ - char namecopy[MAX_PATH]; - char* part; - char* end; - struct fat_direntry entry; - int dd; - DIR* pdir = opendirs; -#ifdef HAVE_MULTIVOLUME - int volume; -#endif - - if ( name[0] != '/' ) { - DEBUGF("Only absolute paths supported right now\n"); - return NULL; - } - - /* find a free dir descriptor */ - for ( dd=0; ddbusy ) - break; - - if ( dd == MAX_OPEN_DIRS ) { - DEBUGF("Too many dirs open\n"); - errno = EMFILE; - return NULL; - } - - pdir->busy = true; - -#ifdef HAVE_MULTIVOLUME - /* try to extract a heading volume name, if present */ - volume = strip_volume(name, namecopy); - pdir->volumecounter = 0; -#else - strncpy(namecopy,name,sizeof(namecopy)); /* just copy */ - namecopy[sizeof(namecopy)-1] = '\0'; -#endif - - if ( fat_opendir(IF_MV2(volume,) &pdir->fatdir, 0, NULL) < 0 ) { - DEBUGF("Failed opening root dir\n"); - pdir->busy = false; - return NULL; - } - - for ( part = strtok_r(namecopy, "/", &end); part; - part = strtok_r(NULL, "/", &end)) { - /* scan dir for name */ - while (1) { - if ((fat_getnext(&pdir->fatdir,&entry) < 0) || - (!entry.name[0])) { - pdir->busy = false; - return NULL; - } - if ( (entry.attr & FAT_ATTR_DIRECTORY) && - (!strcasecmp(part, entry.name)) ) { - pdir->parent_dir = pdir->fatdir; - if ( fat_opendir(IF_MV2(volume,) - &pdir->fatdir, - entry.firstcluster, - &pdir->parent_dir) < 0 ) { - DEBUGF("Failed opening dir '%s' (%ld)\n", - part, entry.firstcluster); - pdir->busy = false; - return NULL; - } -#ifdef HAVE_MULTIVOLUME - pdir->volumecounter = -1; /* n.a. to subdirs */ -#endif - break; - } - } - } - - return pdir; -} - -int closedir(DIR* dir) -{ - dir->busy=false; - return 0; -} - -struct dirent* readdir(DIR* dir) -{ - struct fat_direntry entry; - struct dirent* theent = &(dir->theent); - - if (!dir->busy) - return NULL; - -#ifdef HAVE_MULTIVOLUME - /* Volumes (secondary file systems) get inserted into the root directory - of the first volume, since we have no separate top level. */ - if (dir->volumecounter >= 0 /* on a root dir */ - && 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() */ - while (++dir->volumecounter < NUM_VOLUMES) - { - if (fat_ismounted(dir->volumecounter)) - { - memset(theent, 0, sizeof(*theent)); - theent->attribute = FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME; - snprintf(theent->d_name, sizeof(theent->d_name), - vol_names, dir->volumecounter); - return theent; - } - } - } -#endif - /* normal directory entry fetching follows here */ - if (fat_getnext(&(dir->fatdir),&entry) < 0) - return NULL; - - if ( !entry.name[0] ) - return NULL; - - strncpy(theent->d_name, entry.name, sizeof( theent->d_name ) ); - theent->attribute = entry.attr; - theent->size = entry.filesize; - theent->startcluster = entry.firstcluster; - theent->wrtdate = entry.wrtdate; - theent->wrttime = entry.wrttime; - - return theent; -} - -int mkdir(const char *name) -{ - DIR *dir; - char namecopy[MAX_PATH]; - char* end; - char *basename; - char *parent; - struct dirent *entry; - struct fat_dir newdir; - int rc; - - if ( name[0] != '/' ) { - DEBUGF("mkdir: Only absolute paths supported right now\n"); - return -1; - } - - strncpy(namecopy,name,sizeof(namecopy)); - namecopy[sizeof(namecopy)-1] = 0; - - /* Split the base name and the path */ - end = strrchr(namecopy, '/'); - *end = 0; - basename = end+1; - - if(namecopy == end) /* Root dir? */ - parent = "/"; - else - parent = namecopy; - - DEBUGF("mkdir: parent: %s, name: %s\n", parent, basename); - - dir = opendir(parent); - - if(!dir) { - DEBUGF("mkdir: can't open parent dir\n"); - return -2; - } - - if(basename[0] == 0) { - DEBUGF("mkdir: Empty dir name\n"); - errno = EINVAL; - return -3; - } - - /* Now check if the name already exists */ - while ((entry = readdir(dir))) { - if ( !strcasecmp(basename, entry->d_name) ) { - DEBUGF("mkdir error: file exists\n"); - errno = EEXIST; - closedir(dir); - return - 4; - } - } - - 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); - - return rc; -} - -int rmdir(const char* name) -{ - int rc; - DIR* dir; - struct dirent* entry; - - dir = opendir(name); - if (!dir) - { - errno = ENOENT; /* open error */ - return -1; - } - - /* check if the directory is empty */ - while ((entry = readdir(dir))) - { - if (strcmp(entry->d_name, ".") && - strcmp(entry->d_name, "..")) - { - DEBUGF("rmdir error: not empty\n"); - errno = ENOTEMPTY; - closedir(dir); - return -2; - } - } - - rc = fat_remove(&(dir->fatdir.file)); - if ( rc < 0 ) { - DEBUGF("Failed removing dir: %d\n", rc); - errno = EIO; - rc = rc * 10 - 3; - } -#ifdef HAVE_DIRCACHE - else - { - dircache_rmdir(name); - } -#endif - - closedir(dir); - - return rc; -} diff --git a/firmware/common/dir_uncached.c b/firmware/common/dir_uncached.c new file mode 100644 index 0000000000..e6b59c30ec --- /dev/null +++ b/firmware/common/dir_uncached.c @@ -0,0 +1,322 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: dir.c 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. + * + ****************************************************************************/ +#include +#include +#include +#include +#include "fat.h" +#include "dir.h" +#include "debug.h" +#include "atoi.h" +//#include "dircache.h" + +#define MAX_OPEN_DIRS 8 + +static DIR_UNCACHED opendirs[MAX_OPEN_DIRS]; + +#ifdef HAVE_MULTIVOLUME + +/* how to name volumes, first char must be outside of legal file names, + a number gets appended to enumerate, if applicable */ +#ifdef HAVE_MMC +static const char* vol_names = ""; +#define VOL_ENUM_POS 4 /* position of %d, to avoid runtime calculation */ +#elif defined(HAVE_HOTSWAP) +static const char* vol_names = ""; +#define VOL_ENUM_POS 8 /* position of %d, to avoid runtime calculation */ +#else +static const char* vol_names = ""; +#define VOL_ENUM_POS 3 +#endif + +/* returns on which volume this is, and copies the reduced name + (sortof a preprocessor for volume-decorated pathnames) */ +static int strip_volume(const char* name, char* namecopy) +{ + int volume = 0; + const char *temp = name; + + while (*temp == '/') /* skip all leading slashes */ + ++temp; + + if (*temp && !strncmp(temp, vol_names, VOL_ENUM_POS)) + { + temp += VOL_ENUM_POS; /* behind special name */ + volume = atoi(temp); /* number is following */ + temp = strchr(temp, '/'); /* search for slash behind */ + if (temp != NULL) + name = temp; /* use the part behind the volume */ + else + name = "/"; /* else this must be the root dir */ + } + + strncpy(namecopy, name, MAX_PATH); + namecopy[MAX_PATH-1] = '\0'; + + return volume; +} +#endif /* #ifdef HAVE_MULTIVOLUME */ + + +#ifdef HAVE_HOTSWAP +// release all dir handles on a given volume "by force", to avoid leaks +int release_dirs(int volume) +{ + DIR_UNCACHED* pdir = opendirs; + int dd; + int closed = 0; + for ( dd=0; ddfatdir.file.volume == volume) + { + pdir->busy = false; /* mark as available, no further action */ + closed++; + } + } + return closed; /* return how many we did */ +} +#endif /* #ifdef HAVE_HOTSWAP */ + +DIR_UNCACHED* opendir_uncached(const char* name) +{ + char namecopy[MAX_PATH]; + char* part; + char* end; + struct fat_direntry entry; + int dd; + DIR_UNCACHED* pdir = opendirs; +#ifdef HAVE_MULTIVOLUME + int volume; +#endif + + if ( name[0] != '/' ) { + DEBUGF("Only absolute paths supported right now\n"); + return NULL; + } + + /* find a free dir descriptor */ + for ( dd=0; ddbusy ) + break; + + if ( dd == MAX_OPEN_DIRS ) { + DEBUGF("Too many dirs open\n"); + errno = EMFILE; + return NULL; + } + + pdir->busy = true; + +#ifdef HAVE_MULTIVOLUME + /* try to extract a heading volume name, if present */ + volume = strip_volume(name, namecopy); + pdir->volumecounter = 0; +#else + strncpy(namecopy,name,sizeof(namecopy)); /* just copy */ + namecopy[sizeof(namecopy)-1] = '\0'; +#endif + + if ( fat_opendir(IF_MV2(volume,) &pdir->fatdir, 0, NULL) < 0 ) { + DEBUGF("Failed opening root dir\n"); + pdir->busy = false; + return NULL; + } + + for ( part = strtok_r(namecopy, "/", &end); part; + part = strtok_r(NULL, "/", &end)) { + /* scan dir for name */ + while (1) { + if ((fat_getnext(&pdir->fatdir,&entry) < 0) || + (!entry.name[0])) { + pdir->busy = false; + return NULL; + } + if ( (entry.attr & FAT_ATTR_DIRECTORY) && + (!strcasecmp(part, entry.name)) ) { + pdir->parent_dir = pdir->fatdir; + if ( fat_opendir(IF_MV2(volume,) + &pdir->fatdir, + entry.firstcluster, + &pdir->parent_dir) < 0 ) { + DEBUGF("Failed opening dir '%s' (%ld)\n", + part, entry.firstcluster); + pdir->busy = false; + return NULL; + } +#ifdef HAVE_MULTIVOLUME + pdir->volumecounter = -1; /* n.a. to subdirs */ +#endif + break; + } + } + } + + return pdir; +} + +int closedir_uncached(DIR_UNCACHED* dir) +{ + dir->busy=false; + return 0; +} + +struct dirent_uncached* readdir_uncached(DIR_UNCACHED* dir) +{ + struct fat_direntry entry; + struct dirent_uncached* theent = &(dir->theent); + + if (!dir->busy) + return NULL; + +#ifdef HAVE_MULTIVOLUME + /* Volumes (secondary file systems) get inserted into the root directory + of the first volume, since we have no separate top level. */ + if (dir->volumecounter >= 0 /* on a root dir */ + && 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_uncached() */ + while (++dir->volumecounter < NUM_VOLUMES) + { + if (fat_ismounted(dir->volumecounter)) + { + memset(theent, 0, sizeof(*theent)); + theent->attribute = FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME; + snprintf(theent->d_name, sizeof(theent->d_name), + vol_names, dir->volumecounter); + return theent; + } + } + } +#endif + /* normal directory entry fetching follows here */ + if (fat_getnext(&(dir->fatdir),&entry) < 0) + return NULL; + + if ( !entry.name[0] ) + return NULL; + + strncpy(theent->d_name, entry.name, sizeof( theent->d_name ) ); + theent->attribute = entry.attr; + theent->size = entry.filesize; + theent->startcluster = entry.firstcluster; + theent->wrtdate = entry.wrtdate; + theent->wrttime = entry.wrttime; + + return theent; +} + +int mkdir_uncached(const char *name) +{ + DIR_UNCACHED *dir; + char namecopy[MAX_PATH]; + char* end; + char *basename; + char *parent; + struct dirent_uncached *entry; + struct fat_dir newdir; + int rc; + + if ( name[0] != '/' ) { + DEBUGF("mkdir: Only absolute paths supported right now\n"); + return -1; + } + + strncpy(namecopy,name,sizeof(namecopy)); + namecopy[sizeof(namecopy)-1] = 0; + + /* Split the base name and the path */ + end = strrchr(namecopy, '/'); + *end = 0; + basename = end+1; + + if(namecopy == end) /* Root dir? */ + parent = "/"; + else + parent = namecopy; + + DEBUGF("mkdir: parent: %s, name: %s\n", parent, basename); + + dir = opendir_uncached(parent); + + if(!dir) { + DEBUGF("mkdir: can't open parent dir\n"); + return -2; + } + + if(basename[0] == 0) { + DEBUGF("mkdir: Empty dir name\n"); + errno = EINVAL; + return -3; + } + + /* Now check if the name already exists */ + while ((entry = readdir_uncached(dir))) { + if ( !strcasecmp(basename, entry->d_name) ) { + DEBUGF("mkdir error: file exists\n"); + errno = EEXIST; + closedir_uncached(dir); + return - 4; + } + } + + memset(&newdir, sizeof(struct fat_dir), 0); + + rc = fat_create_dir(basename, &newdir, &(dir->fatdir)); + closedir_uncached(dir); + + return rc; +} + +int rmdir_uncached(const char* name) +{ + int rc; + DIR_UNCACHED* dir; + struct dirent_uncached* entry; + + dir = opendir_uncached(name); + if (!dir) + { + errno = ENOENT; /* open error */ + return -1; + } + + /* check if the directory is empty */ + while ((entry = readdir_uncached(dir))) + { + if (strcmp(entry->d_name, ".") && + strcmp(entry->d_name, "..")) + { + DEBUGF("rmdir error: not empty\n"); + errno = ENOTEMPTY; + closedir_uncached(dir); + return -2; + } + } + + rc = fat_remove(&(dir->fatdir.file)); + if ( rc < 0 ) { + DEBUGF("Failed removing dir: %d\n", rc); + errno = EIO; + rc = rc * 10 - 3; + } + + closedir_uncached(dir); + return rc; +} diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index be356e1ddf..97c58842d5 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c @@ -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 bool check_event_queue(void) 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 @@ static int dircache_scan(struct travel_data *td) 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 @@ static int dircache_scan(struct travel_data *td) * 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 @@ static int dircache_travel(struct fat_dir *dir, struct dircache_entry *ce) 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 @@ int dircache_save(void) static int dircache_do_rebuild(void) { #ifdef SIMULATOR - DIR *pdir; + DIR_UNCACHED *pdir; #else struct fat_dir dir, *pdir; #endif @@ -532,7 +531,7 @@ static int dircache_do_rebuild(void) dircache_initializing = true; #ifdef SIMULATOR - pdir = opendir("/"); + pdir = opendir_uncached("/"); if (pdir == NULL) { logf("Failed to open rootdir"); @@ -1082,11 +1081,11 @@ void dircache_add_file(const char *path, long startcluster) 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 @@ DIRCACHED* opendir_cached(const char* name) if (!dircache_initialized) { - pdir->regulardir = opendir(name); + pdir->regulardir = opendir_uncached(name); if (!pdir->regulardir) return NULL; @@ -1130,9 +1129,9 @@ DIRCACHED* opendir_cached(const char* name) 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 @@ struct dircache_entry* readdir_cached(DIRCACHED* dir) if (dir->regulardir != NULL) { - regentry = readdir(dir->regulardir); + regentry = readdir_uncached(dir->regulardir); if (regentry == NULL) return NULL; @@ -1181,15 +1180,30 @@ struct dircache_entry* readdir_cached(DIRCACHED* dir) 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 f491c9b26a..563bb05ec1 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 bc57d556b3..d526f28859 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c @@ -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 @@ int creat(const char *pathname) 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 @@ static int open_internal(const char* pathname, int flags, bool use_cache) 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 @@ static int open_internal(const char* pathname, int flags, bool use_cache) 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 @@ static int open_internal(const char* pathname, int flags, bool use_cache) 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 @@ static int open_internal(const char* pathname, int flags, bool use_cache) 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 remove(const char* name) 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 @@ int rename(const char* path, const char* newpath) dirptr = "/"; } - dir = opendir(dirptr); + dir = opendir_uncached(dirptr); if(!dir) return - 5; @@ -401,7 +401,7 @@ int rename(const char* path, const char* newpath) 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 020b24a502..8778d0be02 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 -#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; -#endif -} DIR; - -#ifdef HAVE_HOTSWAP -char *get_volume_name(int volume); +#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 -#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 0000000000..575c3b67e4 --- /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 +#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 1483843a73..6b47f3f1bb 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 travel_data { 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 @@ typedef struct { 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_remove(const char *name); 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 -- cgit v1.2.3