asterinas/kernel/src/ipc/mod.rs

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();
}