103 lines
1.9 KiB
Rust
103 lines
1.9 KiB
Rust
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
use crate::{
|
|
prelude::*,
|
|
process::{Gid, Uid},
|
|
};
|
|
|
|
pub mod semaphore;
|
|
|
|
#[expect(non_camel_case_types)]
|
|
pub type key_t = i32;
|
|
|
|
bitflags! {
|
|
pub struct IpcFlags: u32{
|
|
/// Create key if key does not exist
|
|
const IPC_CREAT = 1 << 9;
|
|
/// Fail if key exists
|
|
const IPC_EXCL = 1 << 10;
|
|
/// Return error on wait
|
|
const IPC_NOWAIT = 1 << 11;
|
|
/// Undo the operation on exit
|
|
const SEM_UNDO = 1 << 12;
|
|
}
|
|
}
|
|
|
|
#[repr(i32)]
|
|
#[derive(Debug, Clone, Copy, TryFromInt)]
|
|
#[expect(non_camel_case_types)]
|
|
pub enum IpcControlCmd {
|
|
IPC_RMID = 0,
|
|
IPC_SET = 1,
|
|
IPC_STAT = 2,
|
|
|
|
SEM_GETPID = 11,
|
|
SEM_GETVAL = 12,
|
|
SEM_GETALL = 13,
|
|
SEM_GETNCNT = 14,
|
|
SEM_GETZCNT = 15,
|
|
SEM_SETVAL = 16,
|
|
SEM_SETALL = 17,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct IpcPermission {
|
|
key: key_t,
|
|
/// Owner's UID
|
|
uid: Uid,
|
|
/// Owner's GID
|
|
gid: Gid,
|
|
/// Creator's UID
|
|
cuid: Uid,
|
|
/// Creator's GID
|
|
cguid: Gid,
|
|
/// Permission mode
|
|
mode: u16,
|
|
}
|
|
|
|
impl IpcPermission {
|
|
pub fn key(&self) -> key_t {
|
|
self.key
|
|
}
|
|
|
|
/// Returns owner's UID
|
|
pub fn uid(&self) -> Uid {
|
|
self.uid
|
|
}
|
|
|
|
/// Returns owner's GID
|
|
pub fn gid(&self) -> Gid {
|
|
self.gid
|
|
}
|
|
|
|
/// Returns creator's UID
|
|
pub fn cuid(&self) -> Uid {
|
|
self.cuid
|
|
}
|
|
|
|
/// Returns creator's GID
|
|
pub fn cguid(&self) -> Gid {
|
|
self.cguid
|
|
}
|
|
|
|
/// Returns permission mode
|
|
pub fn mode(&self) -> u16 {
|
|
self.mode
|
|
}
|
|
|
|
pub(self) fn new_sem_perm(key: key_t, uid: Uid, gid: Gid, mode: u16) -> Self {
|
|
Self {
|
|
key,
|
|
uid,
|
|
gid,
|
|
cuid: uid,
|
|
cguid: gid,
|
|
mode,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub(super) fn init_in_first_kthread() {
|
|
semaphore::init_in_first_kthread();
|
|
}
|