EFI_STATUS fsw_efi_dir_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data; struct fsw_dnode *dno; #if DEBUG_LEVEL Print(L"fsw_efi_dir_read...\n"); #endif // read the next entry Status = fsw_efi_map_status(fsw_dnode_dir_read(&File->shand, &dno), Volume); if (Status == EFI_NOT_FOUND) { // end of directory *BufferSize = 0; #if DEBUG_LEVEL Print(L"...no more entries\n"); #endif return EFI_SUCCESS; } if (EFI_ERROR(Status)) return Status; // get info into buffer Status = fsw_efi_dnode_fill_FileInfo(Volume, dno, BufferSize, Buffer); fsw_dnode_release(dno); return Status; }
struct dirent * fsw_posix_readdir(struct fsw_posix_dir *dir) { fsw_status_t status; struct fsw_dnode *dno; static struct dirent dent; // get next entry from file system status = fsw_dnode_dir_read(&dir->shand, &dno); if (status) { fprintf(stderr, "fsw_posix_readdir: fsw_dnode_dir_read returned %d\n", status); return NULL; } status = fsw_dnode_fill(dno); if (status) { fprintf(stderr, "fsw_posix_readdir: fsw_dnode_fill returned %d\n", status); fsw_dnode_release(dno); return NULL; } // fill dirent structure dent.d_fileno = dno->dnode_id; dent.d_reclen = 8 + dno->name.size + 1; switch (dno->type) { case FSW_DNODE_TYPE_FILE: dent.d_type = DT_REG; break; case FSW_DNODE_TYPE_DIR: dent.d_type = DT_DIR; break; case FSW_DNODE_TYPE_SYMLINK: dent.d_type = DT_LNK; break; default: dent.d_type = DT_UNKNOWN; break; } dent.d_namlen = dno->name.size; memcpy(dent.d_name, dno->name.data, dno->name.size); dent.d_name[dent.d_namlen] = 0; return &dent; }