Nucleus
Barry Simple tmpfs file system driver 8250907 (3 years, 3 months ago)
diff --git a/vfs/tmpfs/file.c b/vfs/tmpfs/file.c
new file mode 100644
index 0000000..9851ec3
--- /dev/null
+++ b/vfs/tmpfs/file.c
@@ -0,0 +1,75 @@
+#include <stdint.h>
+#include <stddef.h>
+#include <string.h>
+#include <nucleus/memory.h>
+#include <nucleus/vfs.h>
+
+size_t tmpfs_read(File *file, char *buf, size_t size, off_t offset);
+size_t tmpfs_write(File *file, char *buf, size_t size, off_t offset);
+int tmpfs_open(File *file);
+
+FileOps tmpfsFileOps = {
+ .read = tmpfs_read,
+ .write = tmpfs_write,
+ .open = tmpfs_open,
+};
+
+/* Read a file */
+size_t
+tmpfs_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
+tmpfs_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
+tmpfs_open(File *file)
+{
+ return 0;
+}