mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-11 06:05:21 -05:00
Added opendir, closedir and readdir
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@412 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
924164e6a7
commit
4d4ec3aa0b
4 changed files with 133 additions and 27 deletions
97
firmware/common/dir.c
Normal file
97
firmware/common/dir.c
Normal file
|
|
@ -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 <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef _DIR_H_
|
#ifndef _DIR_H_
|
||||||
#define _DIR_H_
|
#define _DIR_H_
|
||||||
|
|
||||||
|
|
@ -31,10 +30,16 @@ struct dirent {
|
||||||
|
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
|
|
||||||
|
#include "fat.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int offset;
|
int startcluster;
|
||||||
|
struct fat_dir fatdir;
|
||||||
} DIR;
|
} DIR;
|
||||||
|
|
||||||
#else // SIMULATOR
|
#else // SIMULATOR
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
typedef struct DIRtag
|
typedef struct DIRtag
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ CFLAGS = -g -Wall -DTEST_FAT -I$(DRIVERS) -I$(FIRMWARE)/common -I$(FIRMWARE) -I.
|
||||||
|
|
||||||
TARGET = fat
|
TARGET = fat
|
||||||
|
|
||||||
$(TARGET): fat.o ata-sim.o debug.o main.o disk.o
|
$(TARGET): fat.o ata-sim.o main.o disk.o debug.o dir.o
|
||||||
gcc -g -o fat $+ -lfl
|
gcc -g -o fat $+ -lfl
|
||||||
|
|
||||||
fat.o: $(DRIVERS)/fat.c $(DRIVERS)/fat.h $(DRIVERS)/ata.h
|
fat.o: $(DRIVERS)/fat.c $(DRIVERS)/fat.h $(DRIVERS)/ata.h
|
||||||
|
|
@ -14,6 +14,9 @@ fat.o: $(DRIVERS)/fat.c $(DRIVERS)/fat.h $(DRIVERS)/ata.h
|
||||||
disk.o: $(FIRMWARE)/common/disk.c
|
disk.o: $(FIRMWARE)/common/disk.c
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
dir.o: $(FIRMWARE)/common/dir.c
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
debug.o: $(FIRMWARE)/debug.c
|
debug.o: $(FIRMWARE)/debug.c
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,12 @@
|
||||||
#include "ata.h"
|
#include "ata.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
|
#include "dir.h"
|
||||||
|
|
||||||
void dbg_dump_sector(int sec);
|
void dbg_dump_sector(int sec);
|
||||||
void dbg_dump_buffer(unsigned char *buf);
|
void dbg_dump_buffer(unsigned char *buf);
|
||||||
void dbg_print_bpb(struct bpb *bpb);
|
void dbg_print_bpb(struct bpb *bpb);
|
||||||
void dbg_console(struct bpb *bpb);
|
void dbg_console(void);
|
||||||
|
|
||||||
void dbg_dump_sector(int sec)
|
void dbg_dump_sector(int sec)
|
||||||
{
|
{
|
||||||
|
|
@ -79,34 +80,38 @@ void dbg_print_bpb(struct bpb *bpb)
|
||||||
printf("fat_type = FAT32\n");
|
printf("fat_type = FAT32\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_dir(struct bpb *bpb, int currdir)
|
void dbg_dir(char* currdir)
|
||||||
{
|
{
|
||||||
struct fat_dirent dent;
|
DIR* dir;
|
||||||
struct fat_direntry de;
|
struct dirent* entry;
|
||||||
|
|
||||||
if(fat_opendir(bpb, &dent, currdir) >= 0)
|
dir = opendir(currdir);
|
||||||
|
if (dir)
|
||||||
{
|
{
|
||||||
while(fat_getnext(bpb, &dent, &de) >= 0)
|
for ( entry = readdir(dir);
|
||||||
|
entry;
|
||||||
|
entry = readdir(dir) )
|
||||||
{
|
{
|
||||||
printf("%s (%d)\n", de.name,de.firstcluster);
|
printf("%s (%08x)\n", entry->d_name, entry->size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Could not read dir on cluster %d\n", currdir);
|
fprintf(stderr, "Could not open dir %s\n", currdir);
|
||||||
}
|
}
|
||||||
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_type(struct bpb *bpb, int cluster)
|
void dbg_type(int cluster)
|
||||||
{
|
{
|
||||||
unsigned char buf[SECTOR_SIZE*5];
|
unsigned char buf[SECTOR_SIZE*5];
|
||||||
struct fat_fileent ent;
|
struct fat_file ent;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
fat_open(bpb,cluster,&ent);
|
fat_open(cluster,&ent);
|
||||||
|
|
||||||
for (i=0;i<5;i++)
|
for (i=0;i<5;i++)
|
||||||
if(fat_read(bpb, &ent, 1, buf) >= 0)
|
if(fat_read(&ent, 1, buf) >= 0)
|
||||||
{
|
{
|
||||||
buf[SECTOR_SIZE]=0;
|
buf[SECTOR_SIZE]=0;
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
|
|
@ -125,7 +130,7 @@ void dbg_prompt(void)
|
||||||
printf("C:%s> ", current_directory);
|
printf("C:%s> ", current_directory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_console(struct bpb* bpb)
|
void dbg_console(void)
|
||||||
{
|
{
|
||||||
char cmd[32] = "";
|
char cmd[32] = "";
|
||||||
char last_cmd[32] = "";
|
char last_cmd[32] = "";
|
||||||
|
|
@ -148,12 +153,10 @@ void dbg_console(struct bpb* bpb)
|
||||||
{
|
{
|
||||||
if(!strcasecmp(s, "dir"))
|
if(!strcasecmp(s, "dir"))
|
||||||
{
|
{
|
||||||
int secnum = 0;
|
s = strtok(NULL, " \n");
|
||||||
if((s = strtok(NULL, " \n")))
|
if (!s)
|
||||||
{
|
s = "/";
|
||||||
secnum = atoi(s);
|
dbg_dir(s);
|
||||||
}
|
|
||||||
dbg_dir(bpb, secnum);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,7 +185,7 @@ void dbg_console(struct bpb* bpb)
|
||||||
{
|
{
|
||||||
cluster = atoi(s);
|
cluster = atoi(s);
|
||||||
}
|
}
|
||||||
dbg_type(bpb,cluster);
|
dbg_type(cluster);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -198,8 +201,6 @@ void dbg_console(struct bpb* bpb)
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct bpb bpb;
|
|
||||||
|
|
||||||
if(ata_init()) {
|
if(ata_init()) {
|
||||||
DEBUGF("*** Warning! The disk is uninitialized\n");
|
DEBUGF("*** Warning! The disk is uninitialized\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -209,11 +210,11 @@ int main(int argc, char *argv[])
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fat_mount(&bpb,part[0].start)) {
|
if(fat_mount(part[0].start)) {
|
||||||
DEBUGF("*** Failed mounting fat\n");
|
DEBUGF("*** Failed mounting fat\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
dbg_console(&bpb);
|
dbg_console();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue