Serenity Operating System
at master 90 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/Process.h> 8 9namespace Kernel { 10 11ErrorOr<FlatPtr> Process::sys$getuid() 12{ 13 VERIFY_NO_PROCESS_BIG_LOCK(this); 14 TRY(require_promise(Pledge::stdio)); 15 auto credentials = this->credentials(); 16 return credentials->uid().value(); 17} 18 19ErrorOr<FlatPtr> Process::sys$getgid() 20{ 21 VERIFY_NO_PROCESS_BIG_LOCK(this); 22 TRY(require_promise(Pledge::stdio)); 23 auto credentials = this->credentials(); 24 return credentials->gid().value(); 25} 26 27ErrorOr<FlatPtr> Process::sys$geteuid() 28{ 29 VERIFY_NO_PROCESS_BIG_LOCK(this); 30 TRY(require_promise(Pledge::stdio)); 31 auto credentials = this->credentials(); 32 return credentials->euid().value(); 33} 34 35ErrorOr<FlatPtr> Process::sys$getegid() 36{ 37 VERIFY_NO_PROCESS_BIG_LOCK(this); 38 TRY(require_promise(Pledge::stdio)); 39 auto credentials = this->credentials(); 40 return credentials->egid().value(); 41} 42 43ErrorOr<FlatPtr> Process::sys$getresuid(Userspace<UserID*> user_ruid, Userspace<UserID*> user_euid, Userspace<UserID*> user_suid) 44{ 45 VERIFY_NO_PROCESS_BIG_LOCK(this); 46 TRY(require_promise(Pledge::stdio)); 47 48 auto credentials = this->credentials(); 49 auto uid = credentials->uid(); 50 auto euid = credentials->euid(); 51 auto suid = credentials->suid(); 52 53 TRY(copy_to_user(user_ruid, &uid)); 54 TRY(copy_to_user(user_euid, &euid)); 55 TRY(copy_to_user(user_suid, &suid)); 56 return 0; 57} 58 59ErrorOr<FlatPtr> Process::sys$getresgid(Userspace<GroupID*> user_rgid, Userspace<GroupID*> user_egid, Userspace<GroupID*> user_sgid) 60{ 61 VERIFY_NO_PROCESS_BIG_LOCK(this); 62 TRY(require_promise(Pledge::stdio)); 63 64 auto credentials = this->credentials(); 65 auto gid = credentials->gid(); 66 auto egid = credentials->egid(); 67 auto sgid = credentials->sgid(); 68 69 TRY(copy_to_user(user_rgid, &gid)); 70 TRY(copy_to_user(user_egid, &egid)); 71 TRY(copy_to_user(user_sgid, &sgid)); 72 return 0; 73} 74 75ErrorOr<FlatPtr> Process::sys$getgroups(size_t count, Userspace<GroupID*> user_gids) 76{ 77 VERIFY_NO_PROCESS_BIG_LOCK(this); 78 TRY(require_promise(Pledge::stdio)); 79 80 auto credentials = this->credentials(); 81 82 if (!count) 83 return credentials->extra_gids().size(); 84 if (count != credentials->extra_gids().size()) 85 return EINVAL; 86 TRY(copy_to_user(user_gids, credentials->extra_gids().data(), sizeof(GroupID) * count)); 87 return 0; 88} 89 90}