Bladeren bron

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.
Rich Felker 14 jaren geleden
bovenliggende
commit
07e865cc5a
12 gewijzigde bestanden met toevoegingen van 96 en 66 verwijderingen
  1. 2 15
      arch/i386/bits/ipc.h
  2. 16 0
      arch/i386/bits/msg.h
  3. 3 9
      arch/i386/bits/shm.h
  4. 2 15
      arch/x86_64/bits/ipc.h
  5. 13 0
      arch/x86_64/bits/msg.h
  6. 0 9
      arch/x86_64/bits/shm.h
  7. 16 2
      include/sys/ipc.h
  8. 11 11
      include/sys/msg.h
  9. 28 0
      include/sys/shm.h
  10. 2 2
      src/ipc/msgctl.c
  11. 1 1
      src/ipc/semctl.c
  12. 2 2
      src/ipc/shmctl.c

+ 2 - 15
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;
 };

+ 16 - 0
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];
+};

+ 3 - 9
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;

+ 2 - 15
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;
 };

+ 13 - 0
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];
+};

+ 0 - 9
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;

+ 16 - 2
include/sys/ipc.h

@@ -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
-
-

+ 11 - 11
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 <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);

+ 28 - 0
include/sys/shm.h

@@ -10,6 +10,34 @@
 #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 *);

+ 2 - 2
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
 }

+ 1 - 1
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

+ 2 - 2
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
 }