Serenity Operating System
at master 62 lines 2.5 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Devices/HID/HIDManagement.h> 8#include <Kernel/Process.h> 9 10namespace Kernel { 11 12constexpr size_t map_name_max_size = 50; 13 14ErrorOr<FlatPtr> Process::sys$setkeymap(Userspace<Syscall::SC_setkeymap_params const*> user_params) 15{ 16 VERIFY_NO_PROCESS_BIG_LOCK(this); 17 TRY(require_promise(Pledge::setkeymap)); 18 19 auto credentials = this->credentials(); 20 if (!credentials->is_superuser()) 21 return EPERM; 22 23 auto params = TRY(copy_typed_from_user(user_params)); 24 25 Keyboard::CharacterMapData character_map_data; 26 27 TRY(copy_n_from_user(character_map_data.map, params.map, CHAR_MAP_SIZE)); 28 TRY(copy_n_from_user(character_map_data.shift_map, params.shift_map, CHAR_MAP_SIZE)); 29 TRY(copy_n_from_user(character_map_data.alt_map, params.alt_map, CHAR_MAP_SIZE)); 30 TRY(copy_n_from_user(character_map_data.altgr_map, params.altgr_map, CHAR_MAP_SIZE)); 31 TRY(copy_n_from_user(character_map_data.shift_altgr_map, params.shift_altgr_map, CHAR_MAP_SIZE)); 32 33 auto map_name = TRY(get_syscall_path_argument(params.map_name)); 34 if (map_name->length() > map_name_max_size) 35 return ENAMETOOLONG; 36 37 HIDManagement::the().set_maps(move(map_name), character_map_data); 38 return 0; 39} 40 41ErrorOr<FlatPtr> Process::sys$getkeymap(Userspace<Syscall::SC_getkeymap_params const*> user_params) 42{ 43 VERIFY_NO_PROCESS_BIG_LOCK(this); 44 TRY(require_promise(Pledge::getkeymap)); 45 auto params = TRY(copy_typed_from_user(user_params)); 46 47 return HIDManagement::the().keymap_data().with([&](auto const& keymap_data) -> ErrorOr<FlatPtr> { 48 if (params.map_name.size < keymap_data.character_map_name->length()) 49 return ENAMETOOLONG; 50 TRY(copy_to_user(params.map_name.data, keymap_data.character_map_name->characters(), keymap_data.character_map_name->length())); 51 52 auto const& character_maps = keymap_data.character_map; 53 TRY(copy_to_user(params.map, character_maps.map, CHAR_MAP_SIZE * sizeof(u32))); 54 TRY(copy_to_user(params.shift_map, character_maps.shift_map, CHAR_MAP_SIZE * sizeof(u32))); 55 TRY(copy_to_user(params.alt_map, character_maps.alt_map, CHAR_MAP_SIZE * sizeof(u32))); 56 TRY(copy_to_user(params.altgr_map, character_maps.altgr_map, CHAR_MAP_SIZE * sizeof(u32))); 57 TRY(copy_to_user(params.shift_altgr_map, character_maps.shift_altgr_map, CHAR_MAP_SIZE * sizeof(u32))); 58 return 0; 59 }); 60} 61 62}