summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>1994-10-13 21:01:47 +0000
committersos <sos@FreeBSD.org>1994-10-13 21:01:47 +0000
commit2a629797bff6630986742c451b38ca5013911ccf (patch)
tree4cc2f7f7f5960fa952b4bee0ecb3aed2e4cd80fc /sys/kern/sys_generic.c
parentbb709a3eecb1cc8dc575b2e670a2de03e56bb031 (diff)
downloadFreeBSD-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.c30
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);
OpenPOWER on IntegriCloud