FSStatus FSReadDirAsync(FSClient *client, FSCmdBlock *block, FSDirectoryHandle handle, FSDirectoryEntry *entry, uint32_t flags, FSAsyncData *asyncData) { assert(asyncData->callback); auto result = FSReadDir(client, block, handle, entry, flags); FSAsyncCallback cb = static_cast<uint32_t>(asyncData->callback); cb(client, block, result, asyncData->param); return result; }
static int FSDrvDirNext(struct _reent* r, DIR_ITER* dirState, char* filename, struct stat* filestat) { FSDirHandle* handle = (FSDirHandle*) dirState->dirStruct; FSDirEntry dirEntry; FSStatus err = FSReadDir(fsClient, fsCmdBlock, *handle, &dirEntry, FS_RET_ALL_ERROR); if(err == FS_STATUS_OK) { strncpy(filename, dirEntry.name, NAME_MAX); FSDrvConvertStat(filestat, &dirEntry.stat); } else { FSDrvReportError(r); return -1; } return 0; }
static int sd_fat_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st) { sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; if(!dirIter->dev) { r->_errno = ENODEV; return -1; } OSLockMutex(dirIter->dev->pMutex); FSDirEntry * dir_entry = malloc(sizeof(FSDirEntry)); int result = FSReadDir(dirIter->dev->pClient, dirIter->dev->pCmd, dirIter->dirHandle, (FSDirectoryEntry*)dir_entry, -1); if(result < 0) { free(dir_entry); r->_errno = result; OSUnlockMutex(dirIter->dev->pMutex); return -1; } // Fetch the current entry strcpy(filename, dir_entry->name); if(st) { memset(st, 0, sizeof(struct stat)); st->st_mode = (dir_entry->stat.flag & 0x80000000) ? S_IFDIR : S_IFREG; st->st_nlink = 1; st->st_size = dir_entry->stat.size; st->st_blocks = (dir_entry->stat.size + 511) >> 9; st->st_dev = dir_entry->stat.ent_id; st->st_uid = dir_entry->stat.owner_id; st->st_gid = dir_entry->stat.group_id; st->st_ino = dir_entry->stat.ent_id; st->st_atime = dir_entry->stat.mtime; st->st_ctime = dir_entry->stat.ctime; st->st_mtime = dir_entry->stat.mtime; } free(dir_entry); OSUnlockMutex(dirIter->dev->pMutex); return 0; }