From 07e865cc5afb11e6e882e998306ab0f7fb64357e Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 13 Apr 2011 16:45:43 -0400 Subject: numerous fixes to sysv ipc 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. --- arch/i386/bits/ipc.h | 17 ++--------------- arch/i386/bits/msg.h | 16 ++++++++++++++++ arch/i386/bits/shm.h | 12 +++--------- arch/x86_64/bits/ipc.h | 17 ++--------------- arch/x86_64/bits/msg.h | 13 +++++++++++++ arch/x86_64/bits/shm.h | 9 --------- include/sys/ipc.h | 18 ++++++++++++++++-- include/sys/msg.h | 22 +++++++++++----------- include/sys/shm.h | 28 ++++++++++++++++++++++++++++ src/ipc/msgctl.c | 4 ++-- src/ipc/semctl.c | 2 +- src/ipc/shmctl.c | 4 ++-- 12 files changed, 96 insertions(+), 66 deletions(-) create mode 100644 arch/i386/bits/msg.h create mode 100644 arch/x86_64/bits/msg.h diff --git a/arch/i386/bits/ipc.h b/arch/i386/bits/ipc.h index 08316a37..51ad4427 100644 --- a/arch/i386/bits/ipc.h +++ b/arch/i386/bits/ipc.h @@ -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 index 00000000..3db8576b --- /dev/null +++ b/arch/i386/bits/msg.h @@ -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]; +}; diff --git a/arch/i386/bits/shm.h b/arch/i386/bits/shm.h index bc95a1ca..8807c4fb 100644 --- a/arch/i386/bits/shm.h +++ b/arch/i386/bits/shm.h @@ -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; diff --git a/arch/x86_64/bits/ipc.h b/arch/x86_64/bits/ipc.h index 04fbefe1..51ad4427 100644 --- a/arch/x86_64/bits/ipc.h +++ b/arch/x86_64/bits/ipc.h @@ -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 index 00000000..badcf168 --- /dev/null +++ b/arch/x86_64/bits/msg.h @@ -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]; +}; diff --git a/arch/x86_64/bits/shm.h b/arch/x86_64/bits/shm.h index bc95a1ca..abf1d506 100644 --- a/arch/x86_64/bits/shm.h +++ b/arch/x86_64/bits/shm.h @@ -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; diff --git a/include/sys/ipc.h b/include/sys/ipc.h index 9de9f3e7..8e2f7172 100644 --- a/include/sys/ipc.h +++ b/include/sys/ipc.h @@ -11,13 +11,27 @@ extern "C" { #include +#ifdef _GNU_SOURCE +#define __ipc_perm_key key +#define __ipc_perm_seq seq +#endif + #include +#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 - - diff --git a/include/sys/msg.h b/include/sys/msg.h index 4ae522fb..06f25533 100644 --- a/include/sys/msg.h +++ b/include/sys/msg.h @@ -14,20 +14,20 @@ 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 + +#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); diff --git a/include/sys/shm.h b/include/sys/shm.h index 6ebb9412..fa927101 100644 --- a/include/sys/shm.h +++ b/include/sys/shm.h @@ -10,6 +10,34 @@ #include #include +#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 *); diff --git a/src/ipc/msgctl.c b/src/ipc/msgctl.c index d50e395b..d1ff7c70 100644 --- a/src/ipc/msgctl.c +++ b/src/ipc/msgctl.c @@ -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 } diff --git a/src/ipc/semctl.c b/src/ipc/semctl.c index df05ec74..a210e20b 100644 --- a/src/ipc/semctl.c +++ b/src/ipc/semctl.c @@ -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 diff --git a/src/ipc/shmctl.c b/src/ipc/shmctl.c index b2bdfa18..ae6ce69e 100644 --- a/src/ipc/shmctl.c +++ b/src/ipc/shmctl.c @@ -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 } -- cgit v1.2.1