summaryrefslogtreecommitdiffstats
path: root/sys/i386/ibcs2/ibcs2_ioctl.c
diff options
context:
space:
mode:
authorswallace <swallace@FreeBSD.org>1996-03-28 19:53:21 +0000
committerswallace <swallace@FreeBSD.org>1996-03-28 19:53:21 +0000
commit36d7c0f69e83de877d0c68e381a22f89af81a7c2 (patch)
treebc15908c8989a32bbd1b2573a6c17582c3b8bfc7 /sys/i386/ibcs2/ibcs2_ioctl.c
parentabe7f073d9f2b33d474721c03f3fa224c43e7fd7 (diff)
downloadFreeBSD-src-36d7c0f69e83de877d0c68e381a22f89af81a7c2.zip
FreeBSD-src-36d7c0f69e83de877d0c68e381a22f89af81a7c2.tar.gz
Implement ioctl's IBCS2_TCFLSH and IBCS2_TCXONC. Improve termios conversion.
Implement xenix_eaccess() system call. Obtained from: NetBSD
Diffstat (limited to 'sys/i386/ibcs2/ibcs2_ioctl.c')
-rw-r--r--sys/i386/ibcs2/ibcs2_ioctl.c62
1 files changed, 50 insertions, 12 deletions
diff --git a/sys/i386/ibcs2/ibcs2_ioctl.c b/sys/i386/ibcs2/ibcs2_ioctl.c
index 08e06c6..082d608 100644
--- a/sys/i386/ibcs2/ibcs2_ioctl.c
+++ b/sys/i386/ibcs2/ibcs2_ioctl.c
@@ -210,10 +210,15 @@ stios2btios(st, bt)
st->c_cc[IBCS2_VERASE] ? st->c_cc[IBCS2_VERASE] : _POSIX_VDISABLE;
bt->c_cc[VKILL] =
st->c_cc[IBCS2_VKILL] ? st->c_cc[IBCS2_VKILL] : _POSIX_VDISABLE;
- bt->c_cc[VEOF] =
- st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE;
- bt->c_cc[VEOL] =
- st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE;
+ if (bt->c_lflag & ICANON) {
+ bt->c_cc[VEOF] =
+ st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE;
+ bt->c_cc[VEOL] =
+ st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE;
+ } else {
+ bt->c_cc[VMIN] = st->c_cc[IBCS2_VMIN];
+ bt->c_cc[VTIME] = st->c_cc[IBCS2_VTIME];
+ }
bt->c_cc[VEOL2] =
st->c_cc[IBCS2_VEOL2] ? st->c_cc[IBCS2_VEOL2] : _POSIX_VDISABLE;
#if 0
@@ -301,10 +306,15 @@ btios2stios(bt, st)
bt->c_cc[VERASE] != _POSIX_VDISABLE ? bt->c_cc[VERASE] : 0;
st->c_cc[IBCS2_VKILL] =
bt->c_cc[VKILL] != _POSIX_VDISABLE ? bt->c_cc[VKILL] : 0;
- st->c_cc[IBCS2_VEOF] =
- bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0;
- st->c_cc[IBCS2_VEOL] =
- bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0;
+ if (bt->c_lflag & ICANON) {
+ st->c_cc[IBCS2_VEOF] =
+ bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0;
+ st->c_cc[IBCS2_VEOL] =
+ bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0;
+ } else {
+ st->c_cc[IBCS2_VMIN] = bt->c_cc[VMIN];
+ st->c_cc[IBCS2_VTIME] = bt->c_cc[VTIME];
+ }
st->c_cc[IBCS2_VEOL2] =
bt->c_cc[VEOL2] != _POSIX_VDISABLE ? bt->c_cc[VEOL2] : 0;
st->c_cc[IBCS2_VSWTCH] =
@@ -470,12 +480,40 @@ ibcs2_ioctl(p, uap, retval)
return ENOSYS;
case IBCS2_TCXONC:
- DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
- return ENOSYS;
+ {
+ switch ((int)SCARG(uap, data)) {
+ case 0:
+ case 1:
+ DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
+ return ENOSYS;
+ case 2:
+ return (*ctl)(fp, TIOCSTOP, (caddr_t)0, p);
+ case 3:
+ return (*ctl)(fp, TIOCSTART, (caddr_t)1, p);
+ default:
+ return EINVAL;
+ }
+ }
case IBCS2_TCFLSH:
- DPRINTF(("ibcs2_ioctl(%d): TCFLSH ", p->p_pid));
- return ENOSYS;
+ {
+ int arg;
+
+ switch ((int)SCARG(uap, data)) {
+ case 0:
+ arg = FREAD;
+ break;
+ case 1:
+ arg = FWRITE;
+ break;
+ case 2:
+ arg = FREAD | FWRITE;
+ break;
+ default:
+ return EINVAL;
+ }
+ return (*ctl)(fp, TIOCFLUSH, (caddr_t)&arg, p);
+ }
case IBCS2_TIOCGWINSZ:
SCARG(uap, cmd) = TIOCGWINSZ;
OpenPOWER on IntegriCloud