Serenity Operating System
at master 38 lines 1.0 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 <AK/Userspace.h> 8#include <Kernel/API/Ioctl.h> 9#include <Kernel/FileSystem/OpenFileDescription.h> 10#include <Kernel/Process.h> 11 12namespace Kernel { 13 14ErrorOr<FlatPtr> Process::sys$ioctl(int fd, unsigned request, FlatPtr arg) 15{ 16 VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); 17 auto description = TRY(open_file_description(fd)); 18 if (request == FIONBIO) { 19 description->set_blocking(TRY(copy_typed_from_user(Userspace<int const*>(arg))) == 0); 20 return 0; 21 } 22 if (request == FIOCLEX) { 23 m_fds.with_exclusive([&](auto& fds) { 24 fds[fd].set_flags(fds[fd].flags() | FD_CLOEXEC); 25 }); 26 return 0; 27 } 28 if (request == FIONCLEX) { 29 m_fds.with_exclusive([&](auto& fds) { 30 fds[fd].set_flags(fds[fd].flags() & ~FD_CLOEXEC); 31 }); 32 return 0; 33 } 34 TRY(description->file().ioctl(*description, request, arg)); 35 return 0; 36} 37 38}