#include #include #include "ext2fs.h" size_t ext2fs_read(File *file, char *buf, size_t size, off_t offset); int ext2fs_readdir(File *file, DirEntry *de, off_t index); int ext2fs_open(File *file); FileOps ext2fsFileOps = { .read = ext2fs_read, // .readdir = ext2fs_readdir, .open = ext2fs_open, }; /* Read an ext2fs file */ size_t ext2fs_read(File *file, char *buf, size_t size, off_t offset) { SuperBlock *sb = file->inode->super; struct Ext2Inode inode; uint16_t min, indent = offset % PAGE_SIZE; size_t count = 0, i = offset / PAGE_SIZE; uint32_t blk; char ebuf[PAGE_SIZE]; ext2fs_read_inode(sb, file->inode->ino, &inode); if (offset > inode.lsize) return 0; if (size + offset > inode.lsize) size = inode.lsize - offset; while (size) { min = (size > PAGE_SIZE) ? PAGE_SIZE : size; blk = ext2fs_get_data_addr(sb, &inode, i); ext2fs_read_block(sb, blk, ebuf); memcpy(buf + count, ebuf + indent, min); size -= min; count += min; indent = 0; i++; } return count; } /* Read an ext2fs directory entry */ int ext2fs_readdir(File *file, DirEntry *de, off_t index) { return 0; } /* Open an ext2fs file */ int ext2fs_open(File *file) { return 0; }