Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <AK/Types.h>
8#include <Kernel/Process.h>
9
10namespace Kernel {
11
12ErrorOr<FlatPtr> Process::sys$getpid()
13{
14 VERIFY_NO_PROCESS_BIG_LOCK(this);
15 TRY(require_promise(Pledge::stdio));
16 return pid().value();
17}
18
19ErrorOr<FlatPtr> Process::sys$getppid()
20{
21 VERIFY_NO_PROCESS_BIG_LOCK(this);
22 TRY(require_promise(Pledge::stdio));
23 return ppid().value();
24}
25
26ErrorOr<FlatPtr> Process::sys$get_process_name(Userspace<char*> buffer, size_t buffer_size)
27{
28 VERIFY_NO_PROCESS_BIG_LOCK(this);
29 TRY(require_promise(Pledge::stdio));
30
31 TRY(m_name.with([&buffer, buffer_size](auto& name) -> ErrorOr<void> {
32 if (name->length() + 1 > buffer_size)
33 return ENAMETOOLONG;
34
35 return copy_to_user(buffer, name->characters(), name->length() + 1);
36 }));
37
38 return 0;
39}
40
41ErrorOr<FlatPtr> Process::sys$set_process_name(Userspace<char const*> user_name, size_t user_name_length)
42{
43 VERIFY_NO_PROCESS_BIG_LOCK(this);
44 TRY(require_promise(Pledge::proc));
45 if (user_name_length > 256)
46 return ENAMETOOLONG;
47 auto name = TRY(try_copy_kstring_from_user(user_name, user_name_length));
48 // Empty and whitespace-only names only exist to confuse users.
49 if (name->view().is_whitespace())
50 return EINVAL;
51 set_name(move(name));
52 return 0;
53}
54
55}