1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#![allow(dead_code)]
#[repr(C)]
#[derive(Copy, Clone)]
pub enum Ipc {
CREAT = 0o0001000,
NOWAIT = 2048,
EXCL = 0o0002000,
RMID = 0o0000000,
SET = 0o0000001,
STAT = 0o0000002,
INFO = 0o0000003,
}
#[repr(C)]
#[derive(Copy, Clone)]
#[cfg(target_os = "linux")]
pub enum Sem {
GETPID = 11,
GETVAL = 12,
GETALL = 13,
GETZCNT = 15,
SETVAL = 16,
SETALL = 17,
}
#[repr(C)]
#[derive(Copy, Clone)]
#[cfg(target_os = "macos")]
pub enum Sem {
GETPID = 4,
GETVAL = 5,
GETALL = 6,
GETZCNT = 7,
SETVAL = 8,
SETALL = 9,
}
pub const TOK_PATHNAME: &'static [u8; 4] = b"/tmp";
pub const TOK_PROJ_ID: u32 = 0;
pub const SEM_NUM: i32 = 0;
pub const NSEMS: i32 = 1;
pub const NSOPS: u64 = 1;
#[cfg(any(unix))]
extern "C" {
pub fn ftok(path: *mut i8, id: i32) -> i64;
pub fn semget(key: u32, nsems: i32, semflg: i32) -> i32;
pub fn semop(semid: i32, sops: *mut SemBuf, nsops: u64) -> i32;
pub fn semctl(semid: i32, semnum: i32, cmd: i32, arg: i32) -> i32;
}
#[repr(C)]
pub struct SemBuf {
pub sem_num: u16,
pub sem_op: i16,
pub sem_flg: i16,
}
#[repr(C)]
pub struct SemUn {
pub val: i32,
pub buf: SemIdDs,
pub array: i16,
}
#[repr(C)]
pub struct SemIdDs {
pub sem_perm: IpcPerm,
pub sem_otime: i64,
pub sem_ctime: i64,
pub sem_nsems: u16,
}
#[repr(C)]
pub struct IpcPerm {
pub key: u32,
pub uid: u16,
pub gid: u16,
pub cuid: u16,
pub cgid: u16,
pub mode: u16,
pub seq: u16,
}