diff --git a/initrd/sbin/init b/initrd/sbin/init index a6923ad8..85da7109 100755 Binary files a/initrd/sbin/init and b/initrd/sbin/init differ diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index 4068fd5c..bf75c68d 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -18,35 +18,6 @@ #include #include -/* - -static volatile struct limine_terminal_request liminettyr = { - .id = LIMINE_TERMINAL_REQUEST, - .revision = 0 -}; - -struct limine_terminal_response* liminetty; - -int ttylock = 0; - -static vmm_context* liminettyctx; - -void liminewrite(char* str, size_t c){ - - vmm_context* old = arch_getcls()->context; - - if(liminettyctx) - vmm_switchcontext(liminettyctx); - - liminetty->write(liminetty->terminals[0], str, c); - - if(liminettyctx) - vmm_switchcontext(old); - -} - -*/ - void kmain(){ liminetty_init(); @@ -88,6 +59,8 @@ void kmain(){ initrd_parse(); devman_init(); + + consoledev_init(); pci_enumerate(); diff --git a/src/fs/devfs.c b/src/fs/devfs.c index d1e20012..4c53e629 100644 --- a/src/fs/devfs.c +++ b/src/fs/devfs.c @@ -39,6 +39,8 @@ static int devfs_open(dirnode_t* parent, char* name){ return ENOMEM; } + node->st = devnode->st; + return 0; } diff --git a/src/include/kernel/consoledev.h b/src/include/kernel/consoledev.h new file mode 100644 index 00000000..ffbb5807 --- /dev/null +++ b/src/include/kernel/consoledev.h @@ -0,0 +1,6 @@ +#ifndef _CONSOLEDEV_H_INCLUDE +#define _CONSOLEDEV_H_INCLUDE + +void consoledev_init(); + +#endif diff --git a/src/sys/devman.c b/src/sys/devman.c index e7c05459..4f35a889 100644 --- a/src/sys/devman.c +++ b/src/sys/devman.c @@ -17,6 +17,7 @@ int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls if(!addr) return ENOMEM; majorcalls = addr; + highestmajor = major; } majorcalls[major] = calls; @@ -26,10 +27,9 @@ int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls } int devman_write(int *error, int dev, void* buff, size_t count, size_t offset){ - + if(major(dev) > highestmajor) return ENODEV; - return majorcalls[major(dev)]->write(error, minor(dev), buff, count, offset); diff --git a/src/sys/sched/scheduler.c b/src/sys/sched/scheduler.c index 16b8d1b3..1009e559 100644 --- a/src/sys/sched/scheduler.c +++ b/src/sys/sched/scheduler.c @@ -295,31 +295,23 @@ void sched_runinit(){ fd_t* stdoutfd = &proc->fds[1]; fd_t* stderrfd = &proc->fds[2]; - // dummy file before console actually gets implemented and a devfs node - - #define CONSOLE_DUMMY "etc/consoledummy" + #define CONSOLE_PATH "dev/console" - size_t ret = vfs_create(vfs_root(), CONSOLE_DUMMY, 0777); - - if(ret){ - printf("Create failed: %s\n", strerror(ret)); - _panic("Failed to create dummy console", 0); - } - ret = vfs_open(&stdinfd->node, vfs_root(), CONSOLE_DUMMY); + int ret = vfs_open(&stdinfd->node, vfs_root(), CONSOLE_PATH); if(ret){ printf("Open failed: %s\n", strerror(ret)); _panic("Could not open stdin for init", 0); } - ret = vfs_open(&stdoutfd->node, vfs_root(), CONSOLE_DUMMY); + ret = vfs_open(&stdoutfd->node, vfs_root(), CONSOLE_PATH); if(ret){ printf("Open failed: %s\n", strerror(ret)); _panic("Could not open stdout for init", 0); } - ret = vfs_open(&stderrfd->node, vfs_root(), CONSOLE_DUMMY); + ret = vfs_open(&stderrfd->node, vfs_root(), CONSOLE_PATH); if(ret){ printf("Open failed: %s\n", strerror(ret)); diff --git a/src/sys/syscalls/write.c b/src/sys/syscalls/write.c index 3a73a489..b8e40052 100644 --- a/src/sys/syscalls/write.c +++ b/src/sys/syscalls/write.c @@ -59,6 +59,9 @@ syscallret syscall_write(int ifd, void* buff, size_t count){ fd->offset += writec; + if(fd->node->st.st_size < fd->offset) + fd->offset = fd->node->st.st_size; + retv.errno = 0; retv.ret = writec; diff --git a/src/video/consoledev.c b/src/video/consoledev.c new file mode 100644 index 00000000..861a9a88 --- /dev/null +++ b/src/video/consoledev.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include + +#define CONSOLE_MAJOR 1 + +static int isatty(int minor){ + return 0; +} + +static int read(int *error, int dev, void* buff, size_t count, size_t offset){ + *error = ENOSYS; + return -1; +} + +static int write(int *error, int dev, void* buff, size_t count, size_t offset){ + *error = 0; + + liminetty_writeuser(buff, count); + + return count; +} + +devcalls calls = { + read, write, isatty +}; + + +void consoledev_init(){ + + if(devman_newdevice("console", TYPE_CHARDEV, CONSOLE_MAJOR, 0, &calls)) + _panic("Failed to create console device", 0); + + +}