1*c9945492SAndroid Build Coastguard Worker #include <sys/msg.h>
2*c9945492SAndroid Build Coastguard Worker #include <endian.h>
3*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
4*c9945492SAndroid Build Coastguard Worker #include "ipc.h"
5*c9945492SAndroid Build Coastguard Worker
6*c9945492SAndroid Build Coastguard Worker #if __BYTE_ORDER != __BIG_ENDIAN
7*c9945492SAndroid Build Coastguard Worker #undef SYSCALL_IPC_BROKEN_MODE
8*c9945492SAndroid Build Coastguard Worker #endif
9*c9945492SAndroid Build Coastguard Worker
msgctl(int q,int cmd,struct msqid_ds * buf)10*c9945492SAndroid Build Coastguard Worker int msgctl(int q, int cmd, struct msqid_ds *buf)
11*c9945492SAndroid Build Coastguard Worker {
12*c9945492SAndroid Build Coastguard Worker #if IPC_TIME64
13*c9945492SAndroid Build Coastguard Worker struct msqid_ds out, *orig;
14*c9945492SAndroid Build Coastguard Worker if (cmd&IPC_TIME64) {
15*c9945492SAndroid Build Coastguard Worker out = (struct msqid_ds){0};
16*c9945492SAndroid Build Coastguard Worker orig = buf;
17*c9945492SAndroid Build Coastguard Worker buf = &out;
18*c9945492SAndroid Build Coastguard Worker }
19*c9945492SAndroid Build Coastguard Worker #endif
20*c9945492SAndroid Build Coastguard Worker #ifdef SYSCALL_IPC_BROKEN_MODE
21*c9945492SAndroid Build Coastguard Worker struct msqid_ds tmp;
22*c9945492SAndroid Build Coastguard Worker if (cmd == IPC_SET) {
23*c9945492SAndroid Build Coastguard Worker tmp = *buf;
24*c9945492SAndroid Build Coastguard Worker tmp.msg_perm.mode *= 0x10000U;
25*c9945492SAndroid Build Coastguard Worker buf = &tmp;
26*c9945492SAndroid Build Coastguard Worker }
27*c9945492SAndroid Build Coastguard Worker #endif
28*c9945492SAndroid Build Coastguard Worker #ifndef SYS_ipc
29*c9945492SAndroid Build Coastguard Worker int r = __syscall(SYS_msgctl, q, IPC_CMD(cmd), buf);
30*c9945492SAndroid Build Coastguard Worker #else
31*c9945492SAndroid Build Coastguard Worker int r = __syscall(SYS_ipc, IPCOP_msgctl, q, IPC_CMD(cmd), 0, buf, 0);
32*c9945492SAndroid Build Coastguard Worker #endif
33*c9945492SAndroid Build Coastguard Worker #ifdef SYSCALL_IPC_BROKEN_MODE
34*c9945492SAndroid Build Coastguard Worker if (r >= 0) switch (cmd | IPC_TIME64) {
35*c9945492SAndroid Build Coastguard Worker case IPC_STAT:
36*c9945492SAndroid Build Coastguard Worker case MSG_STAT:
37*c9945492SAndroid Build Coastguard Worker case MSG_STAT_ANY:
38*c9945492SAndroid Build Coastguard Worker buf->msg_perm.mode >>= 16;
39*c9945492SAndroid Build Coastguard Worker }
40*c9945492SAndroid Build Coastguard Worker #endif
41*c9945492SAndroid Build Coastguard Worker #if IPC_TIME64
42*c9945492SAndroid Build Coastguard Worker if (r >= 0 && (cmd&IPC_TIME64)) {
43*c9945492SAndroid Build Coastguard Worker buf = orig;
44*c9945492SAndroid Build Coastguard Worker *buf = out;
45*c9945492SAndroid Build Coastguard Worker IPC_HILO(buf, msg_stime);
46*c9945492SAndroid Build Coastguard Worker IPC_HILO(buf, msg_rtime);
47*c9945492SAndroid Build Coastguard Worker IPC_HILO(buf, msg_ctime);
48*c9945492SAndroid Build Coastguard Worker }
49*c9945492SAndroid Build Coastguard Worker #endif
50*c9945492SAndroid Build Coastguard Worker return __syscall_ret(r);
51*c9945492SAndroid Build Coastguard Worker }
52