summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_sem.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1995-10-21 19:50:00 +0000
committerbde <bde@FreeBSD.org>1995-10-21 19:50:00 +0000
commit2f3f635ee848c555dd74d424053ca0722cbe8d77 (patch)
treed76c7dacc8e15aed67fd05370a96749d0af845fc /sys/kern/sysv_sem.c
parent24b513df484222b79b96be40e5765dd94d41b0de (diff)
downloadFreeBSD-src-2f3f635ee848c555dd74d424053ca0722cbe8d77.zip
FreeBSD-src-2f3f635ee848c555dd74d424053ca0722cbe8d77.tar.gz
Start including <sys/sysproto.h> to get the correct args structs and
prototypes for all syscalls. The args structs are still declared in comments as in VOP implementation functions. I don't like the duplication for this, but several more layers of changes are required to get it right. First we need to catch up with 4.4lite2, which uses macros to handle struct padding. Then we need to catch up with NetBSD, which passes the args correctly (as void *). Then we need to handle varargs functions and struct padding better. I think all the details can be hidden in machine-generated functions so that the args structs and verbose macros to reference them don't have to appear in the core sources. Add prototypes. Add bogus casts to hide the evil type puns exposed by the previous steps. &uap[1] was used to get at the args after the first. This worked because only the first arg in *uap was declared. This broke when the machine- genenerated args struct declared all the args (actually it declares extra args in some cases and depends on the user stack having some accessible junk after the last arg, not to mention the user args being on the stack. It isn't possible to declare a correct args struct for a varargs syscall). The msgsys(), semsys() and shmsys() syscall interfaces are BAD because they multiplex several syscalls that have different types of args. There was no reason to duplicate this sysv braindamage but now we're stuck with it. NetBSD has reimplemented the syscalls properly as separate syscalls #220-231. Declare static functions as static in both their prototype and their implementation (the latter is optional, and this misfeature was used). Remove gratuitous #includes. Continue cleaning up new init stuff.
Diffstat (limited to 'sys/kern/sysv_sem.c')
-rw-r--r--sys/kern/sysv_sem.c55
1 files changed, 38 insertions, 17 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index afcbc6d..ff4acae 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -1,4 +1,4 @@
-/* $Id: sysv_sem.c,v 1.8 1995/08/30 00:33:01 bde Exp $ */
+/* $Id: sysv_sem.c,v 1.9 1995/09/09 18:10:07 davidg Exp $ */
/*
* Implementation of SVID semaphores
@@ -10,16 +10,35 @@
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/sysproto.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/sem.h>
-#include <sys/malloc.h>
+#include <sys/sysent.h>
static void seminit __P((void *));
SYSINIT(sysv_sem, SI_SUB_SYSV_SEM, SI_ORDER_FIRST, seminit, NULL)
-static int semctl(), semget(), semop(), semconfig();
-int (*semcalls[])() = { semctl, semget, semop, semconfig };
+struct semctl_args;
+static int semctl __P((struct proc *p, struct semctl_args *uap, int *retval));
+struct semget_args;
+static int semget __P((struct proc *p, struct semget_args *uap, int *retval));
+struct semop_args;
+static int semop __P((struct proc *p, struct semop_args *uap, int *retval));
+struct semconfig_args;
+static int semconfig __P((struct proc *p, struct semconfig_args *uap, int *retval));
+
+struct sem_undo *semu_alloc __P((struct proc *p));
+int semundo_adjust __P((struct proc *p, struct sem_undo **supptr, int semid, int semnum, int adjval));
+void semundo_clear __P((int semid, int semnum));
+void semexit __P((struct proc *p));
+
+/* XXX casting to (sy_call_t *) is bogus, as usual. */
+sy_call_t *semcalls[] = {
+ (sy_call_t *)semctl, (sy_call_t *)semget,
+ (sy_call_t *)semop, (sy_call_t *)semconfig
+};
+
int semtot = 0;
struct semid_ds *sema; /* semaphore id pool */
struct sem *sem; /* semaphore pool */
@@ -30,8 +49,8 @@ int *semu; /* undo structure pool */
static struct proc *semlock_holder = NULL;
void
-seminit(udata)
- void *udata;
+seminit(dummy)
+ void *dummy;
{
register int i;
@@ -54,15 +73,17 @@ seminit(udata)
/*
* Entry point for all SEM calls
*/
-
-struct semsys_args {
- u_int which;
-};
-
int
semsys(p, uap, retval)
struct proc *p;
- struct semsys_args *uap;
+ /* XXX actually varargs. */
+ struct semsys_args /* {
+ u_int which;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ } */ *uap;
int *retval;
{
@@ -71,7 +92,7 @@ semsys(p, uap, retval)
if (uap->which >= sizeof(semcalls)/sizeof(semcalls[0]))
return (EINVAL);
- return ((*semcalls[uap->which])(p, &uap[1], retval));
+ return ((*semcalls[uap->which])(p, &uap->a2, retval));
}
/*
@@ -93,7 +114,7 @@ struct semconfig_args {
semconfig_ctl_t flag;
};
-int
+static int
semconfig(p, uap, retval)
struct proc *p;
struct semconfig_args *uap;
@@ -299,7 +320,7 @@ struct semctl_args {
union semun *arg;
};
-int
+static int
semctl(p, uap, retval)
struct proc *p;
register struct semctl_args *uap;
@@ -462,7 +483,7 @@ struct semget_args {
int semflg;
};
-int
+static int
semget(p, uap, retval)
struct proc *p;
register struct semget_args *uap;
@@ -575,7 +596,7 @@ struct semop_args {
int nsops;
};
-int
+static int
semop(p, uap, retval)
struct proc *p;
register struct semop_args *uap;
OpenPOWER on IntegriCloud