1#ifndef POSIX_IPC_COMMON_H
2#define POSIX_IPC_COMMON_H
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"
14 uint32_t uid, gid, cuid, cgid;
15 uint32_t mode, sequence, padding;
18static_assert(
sizeof(
Permission) == 48,
"Linux amd64 ipc_perm layout");
24inline void initialize(Permission& permission,
int key,
unsigned mode,
unsigned sequence) {
28 permission.uid = permission.cuid = current->getEffectiveUserId();
29 permission.gid = permission.cgid = current->getEffectiveGroupId();
30 permission.mode = mode & 0777;
31 permission.sequence = sequence;
34inline bool owner(
const Permission& permission) {
35 const int64_t uid = process()->getEffectiveUserId();
36 return uid == 0 || uid == permission.uid || uid == permission.cuid;
39inline bool allowed(
const Permission& permission,
unsigned requestedMode) {
41 const int64_t uid = current->getEffectiveUserId();
42 if (!requestedMode || uid == 0) {
46 if (uid == permission.uid || uid == permission.cuid) {
49 const int64_t gid = current->getEffectiveGroupId();
50 bool group = gid == permission.gid || gid == permission.cgid;
53 current->getSupplementalGroupIds(groups);
54 for (
size_t i = 0; i < groups.
count(); ++i) {
55 if (groups[i] == permission.gid || groups[i] == permission.cgid) {
65 return (((permission.mode >> shift) & requestedMode) == requestedMode);
static ProcessorInformation & information()
A vector / dynamic array.