X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fipc%2Fmsgctl.c;h=ea9b23377e47dad684ae1e7cc72df2cab81faf4c;hb=0cd2be231481d68d244662bde25ad9cadbd7221d;hp=4372c71939cad44717423282cc6382842ffed1bd;hpb=7ea235b1be38c57c49b164c9762cf90be02dbc05;p=oweals%2Fmusl.git diff --git a/src/ipc/msgctl.c b/src/ipc/msgctl.c index 4372c719..ea9b2337 100644 --- a/src/ipc/msgctl.c +++ b/src/ipc/msgctl.c @@ -1,12 +1,34 @@ #include +#include #include "syscall.h" #include "ipc.h" +#if __BYTE_ORDER != __BIG_ENDIAN +#undef SYSCALL_IPC_BROKEN_MODE +#endif + int msgctl(int q, int cmd, struct msqid_ds *buf) { +#ifdef SYSCALL_IPC_BROKEN_MODE + struct msqid_ds tmp; + if (cmd == IPC_SET) { + tmp = *buf; + tmp.msg_perm.mode *= 0x10000U; + buf = &tmp; + } +#endif #ifdef SYS_msgctl - return syscall(SYS_msgctl, q, cmd | IPC_64, buf); + int r = __syscall(SYS_msgctl, q, cmd | IPC_64, buf); #else - return syscall(SYS_ipc, IPCOP_msgctl, q, cmd | IPC_64, 0, buf, 0); + int r = __syscall(SYS_ipc, IPCOP_msgctl, q, cmd | IPC_64, 0, buf, 0); +#endif +#ifdef SYSCALL_IPC_BROKEN_MODE + if (r >= 0) switch (cmd) { + case IPC_STAT: + case MSG_STAT: + case MSG_STAT_ANY: + buf->msg_perm.mode >>= 16; + } #endif + return __syscall_ret(r); }