BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 88d672affcc1b9e1de646809e06bca1737f94f25 / vfs / devfs / file.c

// Related

Nucleus

Barry Device file system 88d672a (3 years, 3 months ago)
diff --git a/vfs/devfs/file.c b/vfs/devfs/file.c
new file mode 100644
index 0000000..a984c1d
--- /dev/null
+++ b/vfs/devfs/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 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;
+}