summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-08-25 00:08:23 +0000
committerEric Andersen <andersen@codepoet.org>2002-08-25 00:08:23 +0000
commitd7aaa51dffc2d29192b64b382590d6752c82c3a3 (patch)
tree83e9f0f38956f65cddae2e23c6e552224aad7b44
parente590469b10c9823ac8eabcbe73152c3a4c570421 (diff)
Make shm stuff work properly.
-Erik
-rw-r--r--libc/misc/sysvipc/sem.c19
-rw-r--r--libc/sysdeps/linux/common/bits/ipc.h26
-rw-r--r--libc/sysdeps/linux/common/bits/sem.h19
3 files changed, 30 insertions, 34 deletions
diff --git a/libc/misc/sysvipc/sem.c b/libc/misc/sysvipc/sem.c
index 46b4821a4..a3eaca7be 100644
--- a/libc/misc/sysvipc/sem.c
+++ b/libc/misc/sysvipc/sem.c
@@ -26,13 +26,13 @@
/* Return identifier for array of NSEMS semaphores associated with
KEY. */
#include <stdarg.h>
-/* Define a `union semun' suitable for Linux here. */
-union semun
-{
+/* arg for semctl system calls. */
+union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
- unsigned short int *array; /* array for GETALL & SETALL */
- struct seminfo *__buf; /* buffer for IPC_INFO */
+ unsigned short *array; /* array for GETALL & SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+ void *__pad;
};
@@ -41,18 +41,15 @@ union semun
static inline _syscall4(int, __semctl, int, semid, int, semnum, int, cmd, union semun *, arg);
#endif
-int semctl (int semid, int semnum, int cmd, ...)
+int semctl(int semid, int semnum, int cmd, ...)
{
union semun arg;
- va_list ap;
-
- va_start (ap, cmd);
+ va_list ap;
/* Get the argument. */
+ va_start (ap, cmd);
arg = va_arg (ap, union semun);
-
va_end (ap);
-
#ifdef __NR_semctl
return __semctl(semid, semnum, cmd, &arg);
#else
diff --git a/libc/sysdeps/linux/common/bits/ipc.h b/libc/sysdeps/linux/common/bits/ipc.h
index f1a043fe5..54412ff32 100644
--- a/libc/sysdeps/linux/common/bits/ipc.h
+++ b/libc/sysdeps/linux/common/bits/ipc.h
@@ -35,22 +35,22 @@
# define IPC_INFO 3 /* See ipcs. */
#endif
+/* Type of a SYSV IPC key. */
+typedef int __kernel_key_t;
+
/* Special key values. */
#define IPC_PRIVATE ((__key_t) 0) /* Private key. */
/* Data structure used to pass permission information to IPC operations. */
struct ipc_perm
- {
- __key_t __key; /* Key. */
- __uid_t uid; /* Owner's user ID. */
- __gid_t gid; /* Owner's group ID. */
- __uid_t cuid; /* Creator's user ID. */
- __gid_t cgid; /* Creator's group ID. */
- unsigned short int mode; /* Read/write permission. */
- unsigned short int __pad1;
- unsigned short int __seq; /* Sequence number. */
- unsigned short int __pad2;
- unsigned long int __unused1;
- unsigned long int __unused2;
- };
+{
+ __kernel_key_t key;
+ __kernel_uid_t uid;
+ __kernel_gid_t gid;
+ __kernel_uid_t cuid;
+ __kernel_gid_t cgid;
+ __kernel_mode_t mode;
+ unsigned short seq;
+};
+
diff --git a/libc/sysdeps/linux/common/bits/sem.h b/libc/sysdeps/linux/common/bits/sem.h
index 6193501e2..864e0a947 100644
--- a/libc/sysdeps/linux/common/bits/sem.h
+++ b/libc/sysdeps/linux/common/bits/sem.h
@@ -36,16 +36,15 @@
/* Data structure describing a set of semaphores. */
-struct semid_ds
-{
- struct ipc_perm sem_perm; /* operation permission struct */
- __time_t sem_otime; /* last semop() time */
- unsigned long int __unused1;
- __time_t sem_ctime; /* last time changed by semctl() */
- unsigned long int __unused2;
- unsigned long int sem_nsems; /* number of semaphores in set */
- unsigned long int __unused3;
- unsigned long int __unused4;
+struct semid_ds {
+ struct ipc_perm sem_perm; /* permissions .. see ipc.h */
+ time_t sem_otime; /* last semop time */
+ time_t sem_ctime; /* last change time */
+ struct sem *sem_base; /* ptr to first semaphore in array */
+ struct sem_queue *sem_pending; /* pending operations to be processed */
+ struct sem_queue **sem_pending_last; /* last pending operation */
+ struct sem_undo *undo; /* undo requests on this array */
+ unsigned short sem_nsems; /* no. of semaphores in array */
};
/* The user should define a union like the following to use it for arguments