The Pedigree Project 0.1
ipc-common.h
1#ifndef POSIX_IPC_COMMON_H
2#define POSIX_IPC_COMMON_H
3
4#include "pedigree/kernel/process/Process.h"
5#include "pedigree/kernel/process/Thread.h"
6#include "pedigree/kernel/processor/Processor.h"
7#include "pedigree/kernel/processor/ProcessorInformation.h"
8#include "pedigree/kernel/processor/types.h"
9#include "pedigree/kernel/utilities/Vector.h"
10
11namespace PosixIpc {
12struct Permission {
13 int32_t key;
14 uint32_t uid, gid, cuid, cgid;
15 uint32_t mode, sequence, padding;
16 uint64_t unused[2];
17};
18static_assert(sizeof(Permission) == 48, "Linux amd64 ipc_perm layout");
19
20inline Process* process() {
21 return Processor::information().getCurrentThread()->getParent();
22}
23
24inline void initialize(Permission& permission, int key, unsigned mode, unsigned sequence) {
25 Process* current = process();
26 permission = {};
27 permission.key = key;
28 permission.uid = permission.cuid = current->getEffectiveUserId();
29 permission.gid = permission.cgid = current->getEffectiveGroupId();
30 permission.mode = mode & 0777;
31 permission.sequence = sequence;
32}
33
34inline bool owner(const Permission& permission) {
35 const int64_t uid = process()->getEffectiveUserId();
36 return uid == 0 || uid == permission.uid || uid == permission.cuid;
37}
38
39inline bool allowed(const Permission& permission, unsigned requestedMode) {
40 Process* current = process();
41 const int64_t uid = current->getEffectiveUserId();
42 if (!requestedMode || uid == 0) {
43 return true;
44 }
45 unsigned shift = 0;
46 if (uid == permission.uid || uid == permission.cuid) {
47 shift = 6;
48 } else {
49 const int64_t gid = current->getEffectiveGroupId();
50 bool group = gid == permission.gid || gid == permission.cgid;
51 if (!group) {
52 Vector<int64_t> groups;
53 current->getSupplementalGroupIds(groups);
54 for (size_t i = 0; i < groups.count(); ++i) {
55 if (groups[i] == permission.gid || groups[i] == permission.cgid) {
56 group = true;
57 break;
58 }
59 }
60 }
61 if (group) {
62 shift = 3;
63 }
64 }
65 return (((permission.mode >> shift) & requestedMode) == requestedMode);
66}
67} // namespace PosixIpc
68#endif
Process * getParent()
Definition Process.h:567
static ProcessorInformation & information()
A vector / dynamic array.
Definition Vector.h:33
size_t count() const
Definition Vector.h:270