From 4d4ec3aa0b2c0bb45e7c004885accee303f1277f Mon Sep 17 00:00:00 2001 From: Björn Stenberg Date: Fri, 3 May 2002 15:36:52 +0000 Subject: Added opendir, closedir and readdir git-svn-id: svn://svn.rockbox.org/rockbox/trunk@412 a1c6a512-1295-4272-9138-f99709370657 --- firmware/common/dir.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 firmware/common/dir.c (limited to 'firmware/common/dir.c') diff --git a/firmware/common/dir.c b/firmware/common/dir.c new file mode 100644 index 0000000000..9388fb243a --- /dev/null +++ b/firmware/common/dir.c @@ -0,0 +1,97 @@ +/*************************************************************************** + * __________ __ ___. + * 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 "fat.h" +#include "dir.h" +#include "debug.h" +#include "types.h" + +static DIR thedir; +static struct dirent theent; +static bool busy=FALSE; + +DIR* opendir(char* name) +{ + char* part; + struct fat_direntry entry; + struct fat_dir* dir = &(thedir.fatdir); + + if ( busy ) { + DEBUGF("Only one open dir at a time\n"); + return NULL; + } + + if ( name[0] != '/' ) { + DEBUGF("Only absolute paths supported right now\n"); + return NULL; + } + + if ( fat_opendir(dir, 0) < 0 ) { + DEBUGF("Failed opening root dir\n"); + return NULL; + } + + while ( (part = strtok(name, "/")) ) { + int partlen = strlen(part); + /* scan dir for name */ + while (1) { + if (fat_getnext(dir,&entry) < 0) + return NULL; + if ( !entry.name[0] ) + return NULL; + if ( (entry.attr & FAT_ATTR_DIRECTORY) && + (!strncmp(part, entry.name, partlen)) ) { + if ( fat_opendir(dir, entry.firstcluster) < 0 ) { + DEBUGF("Failed opening dir '%s' (%d)\n", + part, entry.firstcluster); + return NULL; + } + break; + } + } + } + + busy = TRUE; + + return &thedir; +} + +int closedir(DIR* dir) +{ + busy=FALSE; + return 0; +} + +struct dirent* readdir(DIR* dir) +{ + struct fat_direntry entry; + + 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; + + return &theent; +} -- cgit v1.2.3