numerous fixes to sysv ipc
authorRich Felker <dalias@aerifal.cx>
Wed, 13 Apr 2011 20:45:43 +0000 (16:45 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 13 Apr 2011 20:45:43 +0000 (16:45 -0400)
some of these definitions were just plain wrong, others based on
outdated ancient "non-64" versions of the kernel interface.

as much as possible has now been moved out of bits/*

these changes break abi (the old abi for these functions was wrong),
but since they were not working anyway it can hardly matter.

12 files changed:
arch/i386/bits/ipc.h
arch/i386/bits/msg.h [new file with mode: 0644]
arch/i386/bits/shm.h
arch/x86_64/bits/ipc.h
arch/x86_64/bits/msg.h [new file with mode: 0644]
arch/x86_64/bits/shm.h
include/sys/ipc.h
include/sys/msg.h
include/sys/shm.h
src/ipc/msgctl.c
src/ipc/semctl.c
src/ipc/shmctl.c

index 08316a377ea7c513dad6a96dc0c190d6335403e8..51ad44275158a9bb598af758365c179a09f2fe97 100644 (file)
@@ -1,25 +1,12 @@
-#define IPC_CREAT  01000
-#define IPC_EXCL   02000
-#define IPC_NOWAIT 04000
-
-#define IPC_RMID 0
-#define IPC_SET  1
-#define IPC_STAT 2
-#ifdef _GNU_SOURCE
-#define IPC_INFO 3
-#endif
-
-#define IPC_PRIVATE ((key_t) 0)
-
 struct ipc_perm
 {
-       key_t key;
+       key_t __ipc_perm_key;
        uid_t uid;
        gid_t gid;
        uid_t cuid;
        gid_t cgid;
        mode_t mode;
-       int seq;
+       int __ipc_perm_seq;
        long __pad1;
        long __pad2;
 };
diff --git a/arch/i386/bits/msg.h b/arch/i386/bits/msg.h
new file mode 100644 (file)
index 0000000..3db8576
--- /dev/null
@@ -0,0 +1,16 @@
+struct msqid_ds
+{
+       struct ipc_perm msg_perm;
+       time_t msg_stime;
+       int __unused1;
+       time_t msg_rtime;
+       int __unused2;
+       time_t msg_ctime;
+       int __unused3;
+       unsigned long msg_cbytes;
+       msgqnum_t msg_qnum;
+       msglen_t msg_qbytes;
+       pid_t msg_lspid;
+       pid_t msg_lrpid;
+       unsigned long __unused[2];
+};
index bc95a1ca08b6ac9d94ff735387f4aa715a4ea073..8807c4fb2691870fc1ce9b3f157de75cddec76a1 100644 (file)
@@ -1,21 +1,15 @@
 #define SHMLBA 4096
 
-#define SHM_RDONLY 010000
-#define SHM_RND    020000
-#define SHM_REMAP  040000
-#define SHM_EXEC   0100000
-
-/* linux extensions */
-#define SHM_LOCK        11
-#define SHM_UNLOCK      12
-
 struct shmid_ds
 {
        struct ipc_perm shm_perm;
        size_t shm_segsz;
        time_t shm_atime;
+       int __unused1;
        time_t shm_dtime;
+       int __unused2;
        time_t shm_ctime;
+       int __unused3;
        pid_t shm_cpid;
        pid_t shm_lpid;
        unsigned long shm_nattch;
index 04fbefe1a0cf2d728a79f690f6859758999e12af..51ad44275158a9bb598af758365c179a09f2fe97 100644 (file)
@@ -1,25 +1,12 @@
-#define IPC_CREAT  01000
-#define IPC_EXCL   02000
-#define IPC_NOWAIT 04000
-
-#define IPC_RMID 0
-#define IPC_SET  1
-#define IPC_STAT 2
-#ifdef _GNU_SOURCE
-# define IPC_INFO       3               /* See ipcs.  */
-#endif
-
-#define IPC_PRIVATE ((key_t) 0)
-
 struct ipc_perm
 {
-       key_t key;
+       key_t __ipc_perm_key;
        uid_t uid;
        gid_t gid;
        uid_t cuid;
        gid_t cgid;
        mode_t mode;
-       int seq;
+       int __ipc_perm_seq;
        long __pad1;
        long __pad2;
 };
diff --git a/arch/x86_64/bits/msg.h b/arch/x86_64/bits/msg.h
new file mode 100644 (file)
index 0000000..badcf16
--- /dev/null
@@ -0,0 +1,13 @@
+struct msqid_ds
+{
+       struct ipc_perm msg_perm;
+       time_t msg_stime;
+       time_t msg_rtime;
+       time_t msg_ctime;
+       unsigned long msg_cbytes;
+       msgqnum_t msg_qnum;
+       msglen_t msg_qbytes;
+       pid_t msg_lspid;
+       pid_t msg_lrpid;
+       unsigned long __unused[2];
+};
index bc95a1ca08b6ac9d94ff735387f4aa715a4ea073..abf1d506db8d888087687bd4f209668074348d40 100644 (file)
@@ -1,14 +1,5 @@
 #define SHMLBA 4096
 
-#define SHM_RDONLY 010000
-#define SHM_RND    020000
-#define SHM_REMAP  040000
-#define SHM_EXEC   0100000
-
-/* linux extensions */
-#define SHM_LOCK        11
-#define SHM_UNLOCK      12
-
 struct shmid_ds
 {
        struct ipc_perm shm_perm;
index 9de9f3e73771c7df1fdc8ed658b44f7f5507faab..8e2f71725c8c614bcc0ccd4f37e06b1601d9040a 100644 (file)
@@ -11,13 +11,27 @@ extern "C" {
 
 #include <bits/alltypes.h>
 
+#ifdef _GNU_SOURCE
+#define __ipc_perm_key key
+#define __ipc_perm_seq seq
+#endif
+
 #include <bits/ipc.h>
 
+#define IPC_CREAT  01000
+#define IPC_EXCL   02000
+#define IPC_NOWAIT 04000
+
+#define IPC_RMID 0
+#define IPC_SET  1
+#define IPC_STAT 2
+#define IPC_INFO 3
+
+#define IPC_PRIVATE ((key_t) 0)
+
 key_t ftok (const char *, int);
 
 #ifdef __cplusplus
 }
 #endif
 #endif
-
-
index 4ae522fb3c70c7118fb3e515769ff6ff2f39016b..06f255334b18eec8198b55e1991d962a8a12095f 100644 (file)
 typedef unsigned long msgqnum_t;
 typedef unsigned long msglen_t;
 
-struct msqid_ds
-{
-       struct ipc_perm msg_perm;
-       time_t msg_stime;
-       time_t msg_rtime;
-       time_t msg_ctime;
-       msgqnum_t msg_qnum;
-       msglen_t msg_qbytes;
-       pid_t msg_lspid;
-       pid_t msg_lrpid;
-};
+#include <bits/msg.h>
+
+#define __msg_cbytes msg_cbytes
 
 #define MSG_NOERROR 010000
 
+#define MSG_STAT 11
+#define MSG_INFO 12
+
+struct msginfo {
+       int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
+       unsigned short msgseg;
+};
+
 int msgctl (int, int, struct msqid_ds *);
 int msgget (key_t, int);
 ssize_t msgrcv (int, void *, size_t, long, int);
index 6ebb9412269b70254e2603d197ed78a87efb3db7..fa927101886a1303db6a66ccf71203ae13cc98af 100644 (file)
 #include <sys/ipc.h>
 #include <bits/shm.h>
 
+#define SHM_RDONLY 010000
+#define SHM_RND    020000
+#define SHM_REMAP  040000
+#define SHM_EXEC   0100000
+
+#define SHM_LOCK 11
+#define SHM_UNLOCK 12
+#define SHM_STAT 13
+#define SHM_INFO 14
+#define SHM_DEST 01000
+#define SHM_LOCKED 02000
+#define SHM_HUGETLB 04000
+#define SHM_NORESERVE 010000
+
+struct shminfo {
+       unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+};
+
+struct shm_info {
+       int used_ids;
+       unsigned long shm_tot, shm_rss, shm_swp;
+#ifdef _GNU_SOURCE
+       unsigned long swap_attempts, swap_successes;
+#else
+       unsigned long __reserved[2];
+#endif
+};
+
 void *shmat(int, const void *, int);
 int shmctl(int, int, struct shmid_ds *);
 int shmdt(const void *);
index d50e395b2534cdbcee8e56407bc28557c9d89d67..d1ff7c70b494b99f2f2cadcbbfe0e3b6a9a25aca 100644 (file)
@@ -5,8 +5,8 @@
 int msgctl(int q, int cmd, struct msqid_ds *buf)
 {
 #ifdef SYS_msgctl
-       return syscall(SYS_msgctl, q, cmd, buf);
+       return syscall(SYS_msgctl, q, cmd | 0x100, buf);
 #else
-       return syscall(SYS_ipc, IPCOP_msgctl, q, cmd, buf);
+       return syscall(SYS_ipc, IPCOP_msgctl, q, cmd | 0x100, 0, buf, 0);
 #endif
 }
index df05ec7416f1ef5fd0ecf2fe0e84dba364e64474..a210e20baa12f01e6854b057f5fea96f0f517661 100644 (file)
@@ -11,7 +11,7 @@ int semctl(int id, int num, int cmd, ...)
        arg = va_arg(ap, long);
        va_end(ap);
 #ifdef SYS_semctl
-       return syscall(SYS_semctl, id, num, cmd, arg);
+       return syscall(SYS_semctl, id, num, cmd | 0x100, arg);
 #else
        return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | 0x100, &arg);
 #endif
index b2bdfa18bbbd194077c9666f2a3dac8d02428dde..ae6ce69ecd73053f1b1c53ee0b35c73c85addfb0 100644 (file)
@@ -5,8 +5,8 @@
 int shmctl(int id, int cmd, struct shmid_ds *buf)
 {
 #ifdef SYS_shmctl
-       return syscall(SYS_shmctl, id, cmd, buf);
+       return syscall(SYS_shmctl, id, cmd | IPC_MODERN, buf);
 #else
-       return syscall(SYS_ipc, IPCOP_shmctl, id, cmd | IPC_MODERN, buf);
+       return syscall(SYS_ipc, IPCOP_shmctl, id, cmd | IPC_MODERN, 0, buf, 0);
 #endif
 }