From 5dc441c4afd443f2f4f1ae5f812de727c16f4a3c Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 3 Jul 2024 09:02:49 +0300 Subject: [PATCH] Kernel/userspace: Implement KD_LOADFONT and loadfont program --- kernel/include/kernel/Terminal/TTY.h | 2 ++ kernel/kernel/Terminal/TTY.cpp | 17 ++++++++++++ userspace/CMakeLists.txt | 1 + userspace/libraries/LibC/include/stropts.h | 2 ++ userspace/loadfont/CMakeLists.txt | 9 +++++++ userspace/loadfont/main.cpp | 30 ++++++++++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 userspace/loadfont/CMakeLists.txt create mode 100644 userspace/loadfont/main.cpp diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index 8615ca16..9ec278bb 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -44,6 +44,8 @@ namespace Kernel virtual BAN::ErrorOr chmod_impl(mode_t) override; virtual BAN::ErrorOr chown_impl(uid_t, gid_t) override; + virtual BAN::ErrorOr ioctl_impl(int, void*) override; + virtual bool can_read_impl() const override { return m_output.flush; } virtual bool can_write_impl() const override { return true; } virtual bool has_error_impl() const override { return false; } diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index b8d2633b..8fac3a2e 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -122,6 +123,22 @@ namespace Kernel return {}; } + BAN::ErrorOr TTY::ioctl_impl(int request, void* argument) + { + switch (request) + { + case KD_LOADFONT: + { + auto absolute_path = TRY(Process::current().absolute_path_of(BAN::StringView(reinterpret_cast(argument)))); + auto new_font = TRY(LibFont::Font::load(absolute_path)); + set_font(new_font); + return 0; + } + default: + return BAN::Error::from_errno(EINVAL); + } + } + void TTY::on_key_event(LibInput::KeyEvent event) { LockGuard _(m_mutex); diff --git a/userspace/CMakeLists.txt b/userspace/CMakeLists.txt index 00881bdd..781e1c84 100644 --- a/userspace/CMakeLists.txt +++ b/userspace/CMakeLists.txt @@ -11,6 +11,7 @@ set(USERSPACE_PROJECTS id image init + loadfont loadkeys ls meminfo diff --git a/userspace/libraries/LibC/include/stropts.h b/userspace/libraries/LibC/include/stropts.h index 08ece53a..76261ccf 100644 --- a/userspace/libraries/LibC/include/stropts.h +++ b/userspace/libraries/LibC/include/stropts.h @@ -101,6 +101,8 @@ struct str_list #define I_SWROPT 28 #define I_UNLINK 29 +#define KD_LOADFONT 30 + #define FLUSHR 1 #define FLUSHRW 2 #define FLUSHW 3 diff --git a/userspace/loadfont/CMakeLists.txt b/userspace/loadfont/CMakeLists.txt new file mode 100644 index 00000000..6eef3346 --- /dev/null +++ b/userspace/loadfont/CMakeLists.txt @@ -0,0 +1,9 @@ +set(SOURCES + main.cpp +) + +add_executable(loadfont ${SOURCES}) +banan_link_library(loadfont ban) +banan_link_library(loadfont libc) + +install(TARGETS loadfont) diff --git a/userspace/loadfont/main.cpp b/userspace/loadfont/main.cpp new file mode 100644 index 00000000..03d28f0b --- /dev/null +++ b/userspace/loadfont/main.cpp @@ -0,0 +1,30 @@ +#include +#include +#include + +int usage(int ret, const char* argv0) +{ + FILE* fout = ret ? stderr : stdout; + fprintf(fout, "usage: %s FILE\n", argv0); + return ret; +} + +int main(int argc, char** argv) +{ + if (argc != 2) + return usage(1, argv[0]); + + if (!isatty(STDOUT_FILENO)) + { + fprintf(stderr, "stdout is not tty\n"); + return 1; + } + + if (ioctl(STDOUT_FILENO, KD_LOADFONT, argv[1]) == -1) + { + perror("ioctl"); + return 1; + } + + return 0; +}