forked from Bananymous/banan-os
Kernel: Process can now initialize stdio
This allows the use of the fds STD{IN,OUT,ERR}_FILENO
This commit is contained in:
parent
fe10ea85db
commit
db076058b9
|
@ -27,6 +27,8 @@ namespace Kernel
|
||||||
BAN::ErrorOr<void> add_thread(entry_t, void*);
|
BAN::ErrorOr<void> add_thread(entry_t, void*);
|
||||||
void on_thread_exit(Thread&);
|
void on_thread_exit(Thread&);
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> init_stdio();
|
||||||
|
|
||||||
pid_t pid() const { return m_pid; }
|
pid_t pid() const { return m_pid; }
|
||||||
|
|
||||||
BAN::ErrorOr<int> open(BAN::StringView, int);
|
BAN::ErrorOr<int> open(BAN::StringView, int);
|
||||||
|
|
|
@ -18,6 +18,16 @@ namespace Kernel
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> Process::init_stdio()
|
||||||
|
{
|
||||||
|
if (!m_open_files.empty())
|
||||||
|
return BAN::Error::from_c_string("Could not init stdio, process already has open files");
|
||||||
|
TRY(open("/dev/tty1", O_RDONLY)); // stdin
|
||||||
|
TRY(open("/dev/tty1", O_WRONLY)); // stdout
|
||||||
|
TRY(open("/dev/tty1", O_WRONLY)); // stderr
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> Process::add_thread(entry_t entry, void* data)
|
BAN::ErrorOr<void> Process::add_thread(entry_t entry, void* data)
|
||||||
{
|
{
|
||||||
Thread* thread = TRY(Thread::create(entry, data, this));
|
Thread* thread = TRY(Thread::create(entry, data, this));
|
||||||
|
@ -43,7 +53,7 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<int> Process::open(BAN::StringView path, int flags)
|
BAN::ErrorOr<int> Process::open(BAN::StringView path, int flags)
|
||||||
{
|
{
|
||||||
if (flags != O_RDONLY)
|
if (flags & ~O_RDWR)
|
||||||
return BAN::Error::from_errno(ENOTSUP);
|
return BAN::Error::from_errno(ENOTSUP);
|
||||||
|
|
||||||
BAN::String absolute_path = TRY(absolute_path_of(path));
|
BAN::String absolute_path = TRY(absolute_path_of(path));
|
||||||
|
@ -97,7 +107,7 @@ namespace Kernel
|
||||||
auto open_fd_copy = open_file_description(fd);
|
auto open_fd_copy = open_file_description(fd);
|
||||||
m_lock.unlock();
|
m_lock.unlock();
|
||||||
|
|
||||||
if (!(open_fd_copy.flags & O_RDONLY))
|
if (!(open_fd_copy.flags & O_WRONLY))
|
||||||
return BAN::Error::from_errno(EBADF);
|
return BAN::Error::from_errno(EBADF);
|
||||||
size_t n_written = TRY(open_fd_copy.inode->write(open_fd_copy.offset, buffer, count));
|
size_t n_written = TRY(open_fd_copy.inode->write(open_fd_copy.offset, buffer, count));
|
||||||
open_fd_copy.offset += n_written;
|
open_fd_copy.offset += n_written;
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include <kernel/Terminal/TTY.h>
|
#include <kernel/Terminal/TTY.h>
|
||||||
#include <kernel/Terminal/VesaTerminalDriver.h>
|
#include <kernel/Terminal/VesaTerminalDriver.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
extern "C" const char g_kernel_cmdline[];
|
extern "C" const char g_kernel_cmdline[];
|
||||||
|
|
||||||
struct ParsedCommandLine
|
struct ParsedCommandLine
|
||||||
|
@ -223,12 +225,12 @@ static void init2(void* terminal_driver)
|
||||||
MUST(Process::create_kernel(
|
MUST(Process::create_kernel(
|
||||||
[](void*)
|
[](void*)
|
||||||
{
|
{
|
||||||
int fd = MUST(Process::current()->open("/dev/tty1", 1));
|
MUST(Process::current()->init_stdio());
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
int n_read = MUST(Process::current()->read(fd, buffer, sizeof(buffer)));
|
int n_read = MUST(Process::current()->read(STDIN_FILENO, buffer, sizeof(buffer)));
|
||||||
MUST(Process::current()->write(fd, buffer, n_read));
|
MUST(Process::current()->write(STDOUT_FILENO, buffer, n_read));
|
||||||
dprintln("{} bytes", n_read);
|
dprintln("{} bytes", n_read);
|
||||||
}
|
}
|
||||||
}, nullptr
|
}, nullptr
|
||||||
|
|
Loading…
Reference in New Issue