7 #if __BYTE_ORDER != __BIG_ENDIAN
8 #undef SYSCALL_IPC_BROKEN_MODE
14 unsigned short *array
;
17 int semctl(int id
, int num
, int cmd
, ...)
19 union semun arg
= {0};
21 switch (cmd
& ~IPC_TIME64
) {
22 case SETVAL
: case GETALL
: case SETALL
: case IPC_SET
:
23 case IPC_INFO
: case SEM_INFO
:
24 case IPC_STAT
& ~IPC_TIME64
:
25 case SEM_STAT
& ~IPC_TIME64
:
26 case SEM_STAT_ANY
& ~IPC_TIME64
:
28 arg
= va_arg(ap
, union semun
);
32 struct semid_ds out
, *orig
;
34 out
= (struct semid_ds
){0};
39 #ifdef SYSCALL_IPC_BROKEN_MODE
43 tmp
.sem_perm
.mode
*= 0x10000U
;
48 int r
= __syscall(SYS_semctl
, id
, num
, IPC_CMD(cmd
), arg
.buf
);
50 int r
= __syscall(SYS_ipc
, IPCOP_semctl
, id
, num
, IPC_CMD(cmd
), &arg
.buf
);
52 #ifdef SYSCALL_IPC_BROKEN_MODE
53 if (r
>= 0) switch (cmd
| IPC_TIME64
) {
57 arg
.buf
->sem_perm
.mode
>>= 16;
61 if (r
>= 0 && (cmd
&IPC_TIME64
)) {
64 IPC_HILO(arg
.buf
, sem_otime
);
65 IPC_HILO(arg
.buf
, sem_ctime
);
68 return __syscall_ret(r
);