xref: /aosp_15_r20/external/musl/src/ipc/shmctl.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <sys/shm.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 
shmctl(int id,int cmd,struct shmid_ds * buf)10*c9945492SAndroid Build Coastguard Worker int shmctl(int id, int cmd, struct shmid_ds *buf)
11*c9945492SAndroid Build Coastguard Worker {
12*c9945492SAndroid Build Coastguard Worker #if IPC_TIME64
13*c9945492SAndroid Build Coastguard Worker 	struct shmid_ds out, *orig;
14*c9945492SAndroid Build Coastguard Worker 	if (cmd&IPC_TIME64) {
15*c9945492SAndroid Build Coastguard Worker 		out = (struct shmid_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 shmid_ds tmp;
22*c9945492SAndroid Build Coastguard Worker 	if (cmd == IPC_SET) {
23*c9945492SAndroid Build Coastguard Worker 		tmp = *buf;
24*c9945492SAndroid Build Coastguard Worker 		tmp.shm_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_shmctl, id, IPC_CMD(cmd), buf);
30*c9945492SAndroid Build Coastguard Worker #else
31*c9945492SAndroid Build Coastguard Worker 	int r = __syscall(SYS_ipc, IPCOP_shmctl, id, 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 SHM_STAT:
37*c9945492SAndroid Build Coastguard Worker 	case SHM_STAT_ANY:
38*c9945492SAndroid Build Coastguard Worker 		buf->shm_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, shm_atime);
46*c9945492SAndroid Build Coastguard Worker 		IPC_HILO(buf, shm_dtime);
47*c9945492SAndroid Build Coastguard Worker 		IPC_HILO(buf, shm_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