xref: /aosp_15_r20/external/musl/src/ipc/msgctl.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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