diff options
| author | njoly <njoly@NetBSD.org> | 2009-02-18 14:40:14 +0000 |
|---|---|---|
| committer | njoly <njoly@NetBSD.org> | 2009-02-18 14:40:14 +0000 |
| commit | 65488d267ef2197d41cccb2d538fc8f339a75b59 (patch) | |
| tree | 62ad1d473a972d4e9f7ddabe3ea487868b034e6a /sys/compat/linux32 | |
| parent | a1cf1f2eab51b1c6ab0db8310fb11af081b586d6 (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.c | 84 |
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 */ |
