1 /**
2 * D header file for POSIX.
3 *
4 * Authors: Neven Miculinić
5 */
6
7 module core.sys.posix.sys.msg;
8
9 import core.sys.posix.config;
10 import core.sys.posix.sys.ipc;
11 import core.sys.posix.sys.types;
12 import core.stdc.config;
13
14 version (CRuntime_Glibc):
15 // Some of these may be from linux kernel headers.
16 extern (C):
17
18 version (ARM) version = ARM_Any;
19 version (AArch64) version = ARM_Any;
20 version (HPPA) version = HPPA_Any;
21 version (HPPA64) version = HPPA_Any;
22 version (MIPS32) version = MIPS_Any;
23 version (MIPS64) version = MIPS_Any;
24 version (PPC) version = PPC_Any;
25 version (PPC64) version = PPC_Any;
26 version (RISCV32) version = RISCV_Any;
27 version (RISCV64) version = RISCV_Any;
28 version (S390) version = IBMZ_Any;
29 version (SPARC) version = SPARC_Any;
30 version (SPARC64) version = SPARC_Any;
31 version (SystemZ) version = IBMZ_Any;
32
version(linux)33 version (linux)
34 {
35 enum MSG_STAT = 11;
36 enum MSG_INFO = 12;
37
38 enum MSG_NOERROR = 1 << 12; // octal!10000
39 enum MSG_EXCEPT = 2 << 12; // octal!20000
40 enum MSG_COPY = 4 << 12; // octal!40000
41
42 struct msginfo
43 {
44 int msgpool;
45 int msgmap;
46 int msgmax;
47 int msgmnb;
48 int msgmni;
49 int msgssz;
50 int msgtql;
51 ushort msgseg;
52 }
53
54 version (Alpha) version = GENERICMSQ;
55 version (ARM_Any) version = GENERICMSQ;
56 version (IA64) version = GENERICMSQ;
57 version (IBMZ_Any) version = GENERICMSQ;
58 version (RISCV_Any) version = GENERICMSQ;
59
60 version (GENERICMSQ)
61 {
62 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq-pad.h
63 private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32);
64 private enum MSQ_PAD_BEFORE_TIME = false;
65 }
66 else version (HPPA_Any)
67 {
68 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/hppa/bits/msq-pad.h
69 private enum MSQ_PAD_AFTER_TIME = false;
70 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
71 }
72 else version (MIPS_Any)
73 {
74 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/msq-pad.h
75 version (LittleEndian)
76 {
77 private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32);
78 private enum MSQ_PAD_BEFORE_TIME = false;
79 }
80 else
81 {
82 private enum MSQ_PAD_AFTER_TIME = false;
83 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
84 }
85 }
86 else version (PPC_Any)
87 {
88 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/msq-pad.h
89 private enum MSQ_PAD_AFTER_TIME = false;
90 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
91 }
92 else version (SPARC_Any)
93 {
94 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/msq-pad.h
95 private enum MSQ_PAD_AFTER_TIME = false;
96 private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
97 }
98 else version (X86)
99 {
100 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h
101 private enum MSQ_PAD_AFTER_TIME = true;
102 private enum MSQ_PAD_BEFORE_TIME = false;
103 }
104 else version (X86_64)
105 {
106 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h
107 private enum MSQ_PAD_AFTER_TIME = false;
108 private enum MSQ_PAD_BEFORE_TIME = false;
109 }
110 else
111 static assert(0, "unimplemented");
112
113 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq.h
114 alias msgqnum_t = ulong_t;
115 alias msglen_t = ulong_t;
116
117 static if (MSQ_PAD_BEFORE_TIME)
118 {
119 struct msqid_ds
120 {
121 ipc_perm msg_perm;
122 c_ulong __glibc_reserved1;
123 time_t msg_stime;
124 c_ulong __glibc_reserved2;
125 time_t msg_rtime;
126 c_ulong __glibc_reserved3;
127 time_t msg_ctime;
128 ulong_t __msg_cbytes;
129 msgqnum_t msg_qnum;
130 msglen_t msg_qbytes;
131 pid_t msg_lspid;
132 pid_t msg_lrpid;
133 ulong_t __glibc_reserved4;
134 ulong_t __glibc_reserved5;
135 }
136 }
137 else static if (MSQ_PAD_AFTER_TIME)
138 {
139 struct msqid_ds
140 {
141 ipc_perm msg_perm;
142 time_t msg_stime;
143 c_ulong __glibc_reserved1;
144 time_t msg_rtime;
145 c_ulong __glibc_reserved2;
146 time_t msg_ctime;
147 c_ulong __glibc_reserved3;
148 ulong_t __msg_cbytes;
149 msgqnum_t msg_qnum;
150 msglen_t msg_qbytes;
151 pid_t msg_lspid;
152 pid_t msg_lrpid;
153 ulong_t __glibc_reserved4;
154 ulong_t __glibc_reserved5;
155 }
156 }
157 else
158 {
159 struct msqid_ds
160 {
161 ipc_perm msg_perm;
162 time_t msg_stime;
163 time_t msg_rtime;
164 time_t msg_ctime;
165 ulong_t __msg_cbytes;
166 msgqnum_t msg_qnum;
167 msglen_t msg_qbytes;
168 pid_t msg_lspid;
169 pid_t msg_lrpid;
170 ulong_t __glibc_reserved4;
171 ulong_t __glibc_reserved5;
172 }
173 }
174 }
175 else
176 {
177 // https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/msq.h
178 enum MSG_NOERROR = 1 << 12; // octal!10000
179
180 alias msgqnum_t = ushort;
181 alias msglen_t = ushort;
182
183 struct msqid_ds
184 {
185 ipc_perm msg_perm;
186 time_t msg_stime;
187 time_t msg_rtime;
188 time_t msg_ctime;
189 msgqnum_t msg_qnum;
190 msglen_t msg_qbytes;
191 pid_t msg_lspid;
192 pid_t msg_lrpid;
193 }
194 }
195
196 struct msgbuf
197 {
198 c_long mtype;
199 char[1] mtext = 0;
200 }
201
202 int msgctl(int msqid, int cmd, msqid_ds* __buf);
203 int msgget(key_t key, int msgflg);
204 ssize_t msgrcv(int msqid, void* msgp, size_t msgsz, c_long msgtyp, int msgflg);
205 int msgsnd(int msqid, msgbuf* msgp, int msgsz, int msgflg);
206