#include #include #include #include #include size_t devfs_read(File *file, char *buf, size_t size, off_t offset); size_t devfs_write(File *file, char *buf, size_t size, off_t offset); int devfs_open(File *file); FileOps devfsFileOps = { .read = devfs_read, .write = devfs_write, .open = devfs_open, }; /* Read a file */ size_t devfs_read(File *file, char *buf, size_t size, off_t offset) { if (offset > file->inode->size) return 0; if (size + offset > file->inode->size) size = file->inode->size - offset; Page *page; char *data; size_t count = 0; uint16_t min, indent = offset % PAGE_SIZE; while (size) { min = (size > PAGE_SIZE) ? PAGE_SIZE : size; page = find_page(file->inode->pages, offset); if (!page) break; data = map_page(page); memcpy(buf + count, data + indent, min); size -= min; count += min; indent = 0; } return count; } /* Write a file */ size_t devfs_write(File *file, char *buf, size_t size, off_t offset) { if (size + offset > file->inode->size) file->inode->size = size + offset; Page *page; char *data; size_t count = 0; uint16_t min, indent = offset % PAGE_SIZE; while (size) { min = (size > PAGE_SIZE) ? PAGE_SIZE : size; page = find_page(file->inode->pages, offset); if (!page) page = create_page(file->inode->pages, alloc_frame(), offset); data = map_page(page); memcpy(data + indent, buf + count, min); size -= min; count += min; indent = 0; } return count; } /* Open a file */ int devfs_open(File *file) { return 0; }