diff options
Diffstat (limited to 'src/kernel/fs/dev.c')
-rw-r--r-- | src/kernel/fs/dev.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/kernel/fs/dev.c b/src/kernel/fs/dev.c new file mode 100644 index 0000000..968dcfe --- /dev/null +++ b/src/kernel/fs/dev.c @@ -0,0 +1,114 @@ +#include <stdint.h> +#include <stddef.h> +#include <kernel/system.h> +#include <kernel/fs/dev.h> +#include <kernel/fs/vfs.h> +#include <kernel/fs/ext2.h> +#include <kernel/memory/alloc.h> +#include <kernel/lib/stdlib.h> +#include <kernel/lib/stdio.h> + +void dev_make(char *name, read read, write write) +{ + struct fs_node *dev_node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(dev_node->name, "/dev"); + ext2_root->open(dev_node); + + if (dev_node->inode == 0) { + warn("Can't make device, no path for /dev"); + return; + } + + ext2_root->close(dev_node); + + char *path = (char *)kmalloc(strlen(name) + strlen("/dev/") + 2); + strcpy(path, "/dev/"); + strcpy(&path[strlen("/dev/")], name); + + // TODO: Touch dev files in the vfs instead of opening it via ext2 + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, path); + ext2_root->open(node); + kfree(path); + + if (node->inode == 0) { + warn("Couldn't resolve path"); + return; + } + + node->read = read; + node->write = write; + + node->dev = (struct dev *)kmalloc(sizeof(struct dev)); + node->dev->read = read; + node->dev->write = write; + node->dev->block_size = 512; +} + +uint32_t dev_read(struct fs_node *dev, uint32_t offset, uint32_t size, char *buffer) +{ + if (dev->read == NULL) { + warn("Can't read from device"); + return (uint32_t)-1; + } + + return dev->read(dev, offset, size, buffer); +} + +uint32_t dev_write(struct fs_node *dev, uint32_t offset, uint32_t size, char *buffer) +{ + if (dev->write == NULL) { + warn("Can't write to device"); + return (uint32_t)-1; + } + + return dev->write(dev, offset, size, buffer); +} + +// Standard devices + +uint32_t stdin_read(struct fs_node *node, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + // Do something + return 0; +} + +void dev_stdin() +{ + dev_make("stdout", (read)stdin_read, NULL); + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, "/dev/stdin"); + ext2_root->open(node); + node->dev->block_size = 0; + node->length = 0xFFFFFFFF; +} + +uint32_t stdout_write(struct fs_node *node, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + //putch(*buffer); + return 0; +} + +void dev_stdout() +{ + dev_make("stdout", NULL, (write)stdout_write); + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, "/dev/stdout"); + ext2_root->open(node); + node->dev->block_size = 0; +} + +uint32_t stderr_write(struct fs_node *node, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + //putch(*buffer); + return 0; +} + +void dev_stderr() +{ + dev_make("stderr", NULL, (write)stderr_write); + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, "/dev/stderr"); + ext2_root->open(node); + node->dev->block_size = 0; +}
\ No newline at end of file |