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"
11#include "ipc-namespace.h"
16 uint32_t uid, gid, cuid, cgid;
17 uint32_t mode, sequence, padding;
20static_assert(
sizeof(
Permission) == 48,
"Linux amd64 ipc_perm layout");
26inline void initialize(Permission& permission,
int key,
unsigned mode,
unsigned sequence) {
30 permission.uid = permission.cuid = current->getEffectiveUserId();
31 permission.gid = permission.cgid = current->getEffectiveGroupId();
32 permission.mode = mode & 0777;
33 permission.sequence = sequence;
36inline bool owner(
const Permission& permission) {
37 const int64_t uid = process()->getEffectiveUserId();
38 return uid == permission.uid || uid == permission.cuid ||
39 posix_namespace_capable(posix_ipc_owner(), PosixCapabilities::SysAdmin);
42inline bool allowed(
const Permission& permission,
unsigned requestedMode) {
44 const int64_t uid = current->getEffectiveUserId();
45 if (!requestedMode || posix_namespace_capable(posix_ipc_owner(), 15)) {
49 if (uid == permission.uid || uid == permission.cuid) {
52 const int64_t gid = current->getEffectiveGroupId();
53 bool group = gid == permission.gid || gid == permission.cgid;
56 current->getSupplementalGroupIds(groups);
57 for (
size_t i = 0; i < groups.
count(); ++i) {
58 if (groups[i] == permission.gid || groups[i] == permission.cgid) {
68 return (((permission.mode >> shift) & requestedMode) == requestedMode);
static ProcessorInformation & information()
A vector / dynamic array.