diff --git a/base-sysroot.tar.gz b/base-sysroot.tar.gz index dab00c6a..053a7772 100644 Binary files a/base-sysroot.tar.gz and b/base-sysroot.tar.gz differ diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 160ad1b6..f9595689 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -146,6 +146,8 @@ namespace Kernel BAN::ErrorOr sys_clock_gettime(clockid_t, timespec*); + BAN::ErrorOr sys_load_keymap(const char* path); + TTY& tty() { ASSERT(m_controlling_terminal); return *m_controlling_terminal; } static Process& current() { return Thread::current().process(); } diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 38384af7..431dc9f7 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -1253,6 +1254,17 @@ namespace Kernel return 0; } + + BAN::ErrorOr Process::sys_load_keymap(const char* path) + { + LockGuard _(m_lock); + TRY(validate_string_access(path)); + + auto absolute_path = TRY(absolute_path_of(path)); + TRY(Input::KeyboardLayout::get().load_from_file(absolute_path)); + return 0; + } + BAN::ErrorOr Process::sys_signal(int signal, void (*handler)(int)) { if (signal < _SIGMIN || signal > _SIGMAX) diff --git a/kernel/kernel/Syscall.cpp b/kernel/kernel/Syscall.cpp index 3a9454c0..e44fbc45 100644 --- a/kernel/kernel/Syscall.cpp +++ b/kernel/kernel/Syscall.cpp @@ -210,6 +210,9 @@ namespace Kernel case SYS_CHOWN: ret = Process::current().sys_chown((const char*)arg1, (uid_t)arg2, (gid_t)arg3); break; + case SYS_LOAD_KEYMAP: + ret = Process::current().sys_load_keymap((const char*)arg1); + break; default: dwarnln("Unknown syscall {}", syscall); break; diff --git a/libc/include/sys/banan-os.h b/libc/include/sys/banan-os.h index 7e4558cf..665082e5 100644 --- a/libc/include/sys/banan-os.h +++ b/libc/include/sys/banan-os.h @@ -34,6 +34,8 @@ return value: 0 on success, -1 on failure and errno set to the error int tty_ctrl(int fildes, int command, int flags); int poweroff(int command); +int load_keymap(const char* path); + __END_DECLS #endif diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h index bfa5cbac..e8971516 100644 --- a/libc/include/sys/syscall.h +++ b/libc/include/sys/syscall.h @@ -62,6 +62,7 @@ __BEGIN_DECLS #define SYS_MSYNC 61 #define SYS_PREAD 62 #define SYS_CHOWN 63 +#define SYS_LOAD_KEYMAP 64 __END_DECLS diff --git a/libc/sys/banan-os.cpp b/libc/sys/banan-os.cpp index d37d7060..bdeccd55 100644 --- a/libc/sys/banan-os.cpp +++ b/libc/sys/banan-os.cpp @@ -11,3 +11,8 @@ int poweroff(int command) { return syscall(SYS_POWEROFF, command); } + +int load_keymap(const char* path) +{ + return syscall(SYS_LOAD_KEYMAP, path); +} diff --git a/userspace/init/main.cpp b/userspace/init/main.cpp index 53520dde..bd48cd86 100644 --- a/userspace/init/main.cpp +++ b/userspace/init/main.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include void initialize_stdio() @@ -25,6 +26,9 @@ int main() if (signal(SIGINT, [](int) {}) == SIG_ERR) perror("signal"); + if (load_keymap("/usr/share/keymaps/fi.keymap") == -1) + perror("load_keymap"); + bool first = true; termios termios;