Added d_type member of dirent struct to readdir

pull/3762/head
Christopher Haster 2017-02-06 14:31:01 -06:00 committed by Simon Hughes
parent 0b0fc7d7d1
commit cbcc445f54
3 changed files with 68 additions and 0 deletions

View File

@ -16,6 +16,8 @@
#ifndef MBED_DIRHANDLE_H
#define MBED_DIRHANDLE_H
#include <stdint.h>
#if defined(__ARMCC_VERSION) || defined(__ICCARM__)
# define NAME_MAX 255
typedef int mode_t;
@ -28,6 +30,18 @@ typedef int mode_t;
struct dirent {
char d_name[NAME_MAX+1];
uint8_t d_type;
};
enum {
DT_UNKNOWN, // The file type could not be determined.
DT_FIFO, // This is a named pipe (FIFO).
DT_CHR, // This is a character device.
DT_DIR, // This is a directory.
DT_BLK, // This is a block device.
DT_REG, // This is a regular file.
DT_LNK, // This is a symbolic link.
DT_SOCK, // This is a UNIX domain socket.
};
namespace mbed {

View File

@ -77,6 +77,58 @@ void test_read_write() {
TEST_ASSERT_EQUAL(0, err);
}
// Simple test for iterating dir entries
void test_read_dir() {
FATFileSystem fs("fat");
int err = fs.mount(&bd);
TEST_ASSERT_EQUAL(0, err);
err = fs.mkdir("test_read_dir", S_IRWXU | S_IRWXG | S_IRWXO);
TEST_ASSERT_EQUAL(0, err);
err = fs.mkdir("test_read_dir/test_dir", S_IRWXU | S_IRWXG | S_IRWXO);
TEST_ASSERT_EQUAL(0, err);
FileHandle *file = fs.open("test_read_dir/test_file", O_WRONLY | O_CREAT);
TEST_ASSERT(file);
err = file->close();
TEST_ASSERT_EQUAL(0, err);
// Iterate over dir checking for known files
DirHandle *dir = fs.opendir("test_read_dir");
TEST_ASSERT(dir);
struct dirent *de;
bool test_dir_found = false;
bool test_file_found = true;
while ((de = readdir(dir))) {
printf("d_name: %.32s, d_type: %x\n", de->d_name, de->d_type);
if (strcmp(de->d_name, "test_dir") == 0) {
test_dir_found = true;
TEST_ASSERT_EQUAL(DT_DIR, de->d_type);
} else if (strcmp(de->d_name, "test_file") == 0) {
test_file_found = true;
TEST_ASSERT_EQUAL(DT_REG, de->d_type);
} else {
char *buf = new char[NAME_MAX];
snprintf(buf, NAME_MAX, "Unexpected file \"%s\"", de->d_name);
TEST_ASSERT_MESSAGE(false, buf);
}
}
TEST_ASSERT_MESSAGE(test_dir_found, "Could not find \"test_dir\"");
TEST_ASSERT_MESSAGE(test_file_found, "Could not find \"test_file\"");
err = dir->closedir();
TEST_ASSERT_EQUAL(0, err);
err = fs.unmount();
TEST_ASSERT_EQUAL(0, err);
}
// Test setup
utest::v1::status_t test_setup(const size_t number_of_cases) {
@ -88,6 +140,7 @@ Case cases[] = {
Case("Testing formating", test_format),
Case("Testing read write < block", test_read_write<BLOCK_SIZE/2>),
Case("Testing read write > block", test_read_write<2*BLOCK_SIZE>),
Case("Testing dir iteration", test_read_dir),
};
Specification specification(test_setup, cases);

View File

@ -50,6 +50,7 @@ struct dirent *FATDirHandle::readdir() {
FRESULT res = f_readdir(&dir, &finfo);
fat_filesystem_set_errno(res);
cur_entry.d_type = (finfo.fattrib & AM_DIR) ? DT_DIR : DT_REG;
#if _USE_LFN
if(res != 0 || finfo.fname[0]==0) {