aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/msgctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/msgctl.c')
-rw-r--r--sysdeps/unix/sysv/linux/msgctl.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c
index 0776472d5e..a1f24ab242 100644
--- a/sysdeps/unix/sysv/linux/msgctl.c
+++ b/sysdeps/unix/sysv/linux/msgctl.c
@@ -90,8 +90,15 @@ __msgctl64 (int msqid, int cmd, struct __msqid64_ds *buf)
struct kernel_msqid64_ds ksemid, *arg = NULL;
if (buf != NULL)
{
- msqid64_to_kmsqid64 (buf, &ksemid);
- arg = &ksemid;
+ /* This is a Linux extension where kernel returns a 'struct msginfo'
+ instead. */
+ if (cmd == IPC_INFO || cmd == MSG_INFO)
+ arg = (struct kernel_msqid64_ds *) buf;
+ else
+ {
+ msqid64_to_kmsqid64 (buf, &ksemid);
+ arg = &ksemid;
+ }
}
# ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T
if (cmd == IPC_SET)
@@ -169,8 +176,15 @@ __msgctl (int msqid, int cmd, struct msqid_ds *buf)
struct __msqid64_ds msqid64, *buf64 = NULL;
if (buf != NULL)
{
- msqid_to_msqid64 (&msqid64, buf);
- buf64 = &msqid64;
+ /* This is a Linux extension where kernel returns a 'struct msginfo'
+ instead. */
+ if (cmd == IPC_INFO || cmd == MSG_INFO)
+ buf64 = (struct __msqid64_ds *) buf;
+ else
+ {
+ msqid_to_msqid64 (&msqid64, buf);
+ buf64 = &msqid64;
+ }
}
int ret = __msgctl64 (msqid, cmd, buf64);