summaryrefslogtreecommitdiff
path: root/sys/compat/linux32
diff options
context:
space:
mode:
authornjoly <njoly@NetBSD.org>2009-02-18 14:40:14 +0000
committernjoly <njoly@NetBSD.org>2009-02-18 14:40:14 +0000
commit65488d267ef2197d41cccb2d538fc8f339a75b59 (patch)
tree62ad1d473a972d4e9f7ddabe3ea487868b034e6a /sys/compat/linux32
parenta1cf1f2eab51b1c6ab0db8310fb11af081b586d6 (diff)
Add IPC_64 support for all shmctl(2) commands, and reduce diffs with
compat linux version.
Diffstat (limited to 'sys/compat/linux32')
-rw-r--r--sys/compat/linux32/common/linux32_ipccall.c84
1 files changed, 37 insertions, 47 deletions
diff --git a/sys/compat/linux32/common/linux32_ipccall.c b/sys/compat/linux32/common/linux32_ipccall.c
index 20321300e54..2a2ffb521e6 100644
--- a/sys/compat/linux32/common/linux32_ipccall.c
+++ b/sys/compat/linux32/common/linux32_ipccall.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_ipccall.c,v 1.2 2008/09/17 20:11:51 scw Exp $ */
+/* $NetBSD: linux32_ipccall.c,v 1.3 2009/02/18 14:40:14 njoly Exp $ */
/*
* Copyright (c) 2008 Nicolas Joly
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_ipccall.c,v 1.2 2008/09/17 20:11:51 scw Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_ipccall.c,v 1.3 2009/02/18 14:40:14 njoly Exp $");
#if defined(_KERNEL_OPT)
#include "opt_sysv.h"
@@ -451,68 +451,58 @@ linux32_shmctl(struct lwp *l, const struct linux32_sys_ipc_args *uap,
register_t *retval)
{
int shmid, cmd, error;
- struct shmid_ds bs, *bsp = NULL;
+ struct shmid_ds bs;
struct linux32_shmid_ds ls;
struct linux32_shmid64_ds ls64;
shmid = SCARG(uap, a1);
+ cmd = SCARG(uap, a2);
+
+ switch (cmd & ~LINUX32_IPC_64) {
- switch (SCARG(uap, a2)) {
- case LINUX32_IPC_RMID:
- cmd = IPC_RMID;
- break;
case LINUX32_SHM_STAT:
- case LINUX32_SHM_STAT|LINUX32_IPC_64:
return ENOSYS;
+
case LINUX32_IPC_STAT:
- case LINUX32_IPC_STAT|LINUX32_IPC_64:
- cmd = IPC_STAT;
- bsp = &bs;
- break;
- case LINUX32_IPC_SET:
- cmd = IPC_SET;
- bsp = &bs;
- if ((error = copyin(SCARG_P32(uap, ptr), &ls, sizeof ls)))
+ error = shmctl1(l, shmid, IPC_STAT, &bs);
+ if (error != 0)
return error;
- linux32_to_bsd_shmid_ds(&ls, &bs);
- break;
- case LINUX32_IPC_SET|LINUX32_IPC_64:
- cmd = IPC_SET;
- bsp = &bs;
- if ((error = copyin(SCARG_P32(uap, ptr), &ls64, sizeof ls64)))
+ if (cmd & LINUX32_IPC_64) {
+ bsd_to_linux32_shmid64_ds(&bs, &ls64);
+ error = copyout(&ls64, SCARG_P32(uap, ptr), sizeof ls64);
+ } else {
+ bsd_to_linux32_shmid_ds(&bs, &ls);
+ error = copyout(&ls, SCARG_P32(uap, ptr), sizeof ls);
+ }
+ return error;
+
+ case LINUX32_IPC_SET:
+ if (cmd & LINUX32_IPC_64) {
+ error = copyin(SCARG_P32(uap, ptr), &ls64, sizeof ls64);
+ linux32_to_bsd_shmid64_ds(&ls64, &bs);
+ } else {
+ error = copyin(SCARG_P32(uap, ptr), &ls, sizeof ls);
+ linux32_to_bsd_shmid_ds(&ls, &bs);
+ }
+ if (error != 0)
return error;
- linux32_to_bsd_shmid64_ds(&ls64, &bs);
- break;
+ return shmctl1(l, shmid, IPC_SET, &bs);
+
+ case LINUX32_IPC_RMID:
+ return shmctl1(l, shmid, IPC_RMID, NULL);
+
case LINUX32_SHM_LOCK:
- cmd = SHM_LOCK;
- break;
+ return shmctl1(l, shmid, SHM_LOCK, NULL);
+
case LINUX32_SHM_UNLOCK:
- cmd = SHM_UNLOCK;
- break;
+ return shmctl1(l, shmid, SHM_UNLOCK, NULL);
+
case LINUX32_IPC_INFO:
case LINUX32_SHM_INFO:
return ENOSYS;
- default:
- return EINVAL;
- }
-
- if ((error = shmctl1(l, shmid, cmd, bsp)))
- return error;
- switch (SCARG(uap, a2)) {
- case LINUX32_IPC_STAT:
- case LINUX32_SHM_STAT:
- bsd_to_linux32_shmid_ds(&bs, &ls);
- error = copyout(&ls, SCARG_P32(uap, ptr), sizeof ls);
- break;
- case LINUX32_IPC_STAT|LINUX32_IPC_64:
- case LINUX32_SHM_STAT|LINUX32_IPC_64:
- bsd_to_linux32_shmid64_ds(&bs, &ls64);
- error = copyout(&ls64, SCARG_P32(uap, ptr), sizeof ls64);
default:
- break;
+ return EINVAL;
}
-
- return error;
}
#endif /* SYSVSHM */