diff options
author | sos <sos@FreeBSD.org> | 1994-10-13 21:01:47 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 1994-10-13 21:01:47 +0000 |
commit | 2a629797bff6630986742c451b38ca5013911ccf (patch) | |
tree | 4cc2f7f7f5960fa952b4bee0ecb3aed2e4cd80fc /sys/kern/sys_generic.c | |
parent | bb709a3eecb1cc8dc575b2e670a2de03e56bb031 (diff) | |
download | FreeBSD-src-2a629797bff6630986742c451b38ca5013911ccf.zip FreeBSD-src-2a629797bff6630986742c451b38ca5013911ccf.tar.gz |
Made it possible for ioctl to return a value.
Ifdef by COMPAT_IBCS2 (used by the socksys system).
Submitted by: Mostyn Lewis (mostyn@mrl.com)
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r-- | sys/kern/sys_generic.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index c9d641a..8acf476 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)sys_generic.c 8.5 (Berkeley) 1/21/94 - * $Id: sys_generic.c,v 1.7 1994/10/02 17:35:24 phk Exp $ + * $Id: sys_generic.c,v 1.1 1994/10/13 12:13:00 sos Exp sos $ */ #include <sys/param.h> @@ -57,6 +57,7 @@ #include <sys/ktrace.h> #endif #include <vm/vm.h> +#include <i386/ibcs2/ibcs2.h> int selscan __P((struct proc *, fd_set *, fd_set *, int, int *)); @@ -407,11 +408,23 @@ ioctl(p, uap, retval) if (size > IOCPARM_MAX) return (ENOTTY); memp = NULL; +#ifdef COMPAT_IBCS2 + if (size + IBCS2_RETVAL_SIZE > sizeof (stkbuf)) { + memp = (caddr_t)malloc((u_long)size + IBCS2_RETVAL_SIZE, + M_IOCTLOPS, M_WAITOK); + data = memp; + } else + data = stkbuf; + *(int *)(data - IBCS2_RETVAL_SIZE) = IBCS2_MAGIC_IN; + *(int *)(data - (IBCS2_RETVAL_SIZE - sizeof(int))) = 0; + *(int *)(data - (IBCS2_RETVAL_SIZE - 2*sizeof(int))) = 0; +#else if (size > sizeof (stkbuf)) { memp = (caddr_t)malloc((u_long)size, M_IOCTLOPS, M_WAITOK); data = memp; } else data = stkbuf; +#endif if (com&IOC_IN) { if (size) { error = copyin(uap->data, data, (u_int)size); @@ -430,6 +443,15 @@ ioctl(p, uap, retval) bzero(data, size); else if (com&IOC_VOID) *(caddr_t *)data = uap->data; +#ifdef COMPAT_IBCS2 + else if (com) + /* + * Pick up such things as NIOCxx. + * Any copyouts will have to be done prior + * to return by their servicing code. + */ + *(caddr_t *)data = uap->data; +#endif switch (com) { @@ -490,6 +512,12 @@ ioctl(p, uap, retval) error = copyout(data, uap->data, (u_int)size); break; } +#ifdef COMPAT_IBCS2 + if ((*(int *)(data - IBCS2_RETVAL_SIZE)) == IBCS2_MAGIC_OUT) { + retval[0] = *(int *)(data-(IBCS2_RETVAL_SIZE - sizeof(int))); + retval[1] = *(int *)(data-(IBCS2_RETVAL_SIZE - 2*sizeof(int))); + } +#endif if (memp) free(memp, M_IOCTLOPS); return (error); |