Rewrite (a copy of) the emul-sunos termio/termios emulation code to
emulate Ultrix termio/termios instead. Ultrix termio c_cc has separate VMIM/VTIME attributes, and the Ultrix termios c_cc is a strict superset of Ultrix termio c_cc. The termios-only c_cc indices are all changed, relative to SunOS.
This commit is contained in:
parent
2fc14be1c2
commit
36817f8d02
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: ultrix_ioctl.c,v 1.1 1995/12/26 04:44:39 jonathan Exp $ */
|
||||
/* $NetBSD: ultrix_ioctl.c,v 1.2 1996/01/04 19:03:32 jonathan Exp $ */
|
||||
/* from : NetBSD: sunos_ioctl.c,v 1.21 1995/10/07 06:27:31 mycroft Exp */
|
||||
|
||||
/*
|
||||
|
@ -48,6 +48,8 @@
|
|||
|
||||
#include "ultrix_tty.h"
|
||||
|
||||
#define emul_termio ultrix_termio
|
||||
#define emul_termios ultrix_termios
|
||||
|
||||
/*
|
||||
* SunOS ioctl calls.
|
||||
|
@ -95,6 +97,20 @@ static u_long s2btab[] = {
|
|||
38400,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Translate a single tty control char from the emulation value
|
||||
* to native termios, and vice-versa. Special-case
|
||||
* the value of POSIX_VDISABLE, mapping it to and from 0.
|
||||
*/
|
||||
#define NATIVE_TO_EMUL_CC(bsd_cc) \
|
||||
(((bsd_cc) != _POSIX_VDISABLE) ? (bsd_cc) : 0)
|
||||
|
||||
#define EMUL_TO_NATIVE_CC(emul_cc) \
|
||||
(emul_cc) ? (emul_cc) : _POSIX_VDISABLE;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* these two conversion functions have mostly been done
|
||||
* with some perl cut&paste, then handedited to comment
|
||||
|
@ -110,9 +126,10 @@ static u_long s2btab[] = {
|
|||
* code with ?:.
|
||||
*/
|
||||
|
||||
|
||||
static void
|
||||
stios2btios(st, bt)
|
||||
struct sunos_termios *st;
|
||||
struct emul_termios *st;
|
||||
struct termios *bt;
|
||||
{
|
||||
register u_long l, r;
|
||||
|
@ -208,34 +225,44 @@ stios2btios(st, bt)
|
|||
r |= ((l & 0x00004000) ? PENDIN : 0);
|
||||
bt->c_lflag = r;
|
||||
|
||||
bt->c_cc[VINTR] = st->c_cc[0] ? st->c_cc[0] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VQUIT] = st->c_cc[1] ? st->c_cc[1] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VERASE] = st->c_cc[2] ? st->c_cc[2] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VKILL] = st->c_cc[3] ? st->c_cc[3] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VEOF] = st->c_cc[4] ? st->c_cc[4] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VEOL] = st->c_cc[5] ? st->c_cc[5] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VEOL2] = st->c_cc[6] ? st->c_cc[6] : _POSIX_VDISABLE;
|
||||
/* bt->c_cc[VSWTCH] = st->c_cc[7] ? st->c_cc[7] : _POSIX_VDISABLE; */
|
||||
bt->c_cc[VSTART] = st->c_cc[8] ? st->c_cc[8] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VSTOP] = st->c_cc[9] ? st->c_cc[9] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VSUSP] = st->c_cc[10] ? st->c_cc[10] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VDSUSP] = st->c_cc[11] ? st->c_cc[11] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VREPRINT] = st->c_cc[12] ? st->c_cc[12] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VDISCARD] = st->c_cc[13] ? st->c_cc[13] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VWERASE] = st->c_cc[14] ? st->c_cc[14] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VLNEXT] = st->c_cc[15] ? st->c_cc[15] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VSTATUS] = st->c_cc[16] ? st->c_cc[16] : _POSIX_VDISABLE;
|
||||
bt->c_cc[VINTR] = EMUL_TO_NATIVE_CC(st->c_cc[0]);
|
||||
bt->c_cc[VQUIT] = EMUL_TO_NATIVE_CC(st->c_cc[1]);
|
||||
bt->c_cc[VERASE] = EMUL_TO_NATIVE_CC(st->c_cc[2]);
|
||||
bt->c_cc[VKILL] = EMUL_TO_NATIVE_CC(st->c_cc[3]);
|
||||
bt->c_cc[VEOF] = EMUL_TO_NATIVE_CC(st->c_cc[4]);
|
||||
bt->c_cc[VEOL] = EMUL_TO_NATIVE_CC(st->c_cc[5]);
|
||||
bt->c_cc[VEOL2] = EMUL_TO_NATIVE_CC(st->c_cc[6]);
|
||||
/* not present on NetBSD */
|
||||
/* bt->c_cc[VSWTCH] = EMUL_TO_NATIVE_CC(st->c_cc[7]); */
|
||||
bt->c_cc[VSTART] = EMUL_TO_NATIVE_CC(st->c_cc[10]);
|
||||
bt->c_cc[VSTOP] = EMUL_TO_NATIVE_CC(st->c_cc[11]);
|
||||
bt->c_cc[VSUSP] = EMUL_TO_NATIVE_CC(st->c_cc[112]);
|
||||
bt->c_cc[VDSUSP] = EMUL_TO_NATIVE_CC(st->c_cc[113]);
|
||||
bt->c_cc[VREPRINT] = EMUL_TO_NATIVE_CC(st->c_cc[14]);
|
||||
bt->c_cc[VDISCARD] = EMUL_TO_NATIVE_CC(st->c_cc[15]);
|
||||
bt->c_cc[VWERASE] = EMUL_TO_NATIVE_CC(st->c_cc[16]);
|
||||
bt->c_cc[VLNEXT] = EMUL_TO_NATIVE_CC(st->c_cc[17]);
|
||||
bt->c_cc[VSTATUS] = EMUL_TO_NATIVE_CC(st->c_cc[18]);
|
||||
|
||||
#ifdef COMPAT_ULTRIX
|
||||
/* Ultrix termio/termios has real vmin/vtime */
|
||||
bt->c_cc[VMIN] = EMUL_TO_NATIVE_CC(st->c_cc[8]);
|
||||
bt->c_cc[VTIME] = EMUL_TO_NATIVE_CC(st->c_cc[9]);
|
||||
#else
|
||||
/* if `raw mode', create native VMIN/VTIME from SunOS VEOF/VEOL */
|
||||
bt->c_cc[VMIN] = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOF];
|
||||
bt->c_cc[VTIME] = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOL];
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Convert bsd termios to "sunos" emulated termios
|
||||
*/
|
||||
static void
|
||||
btios2stios(bt, st)
|
||||
struct termios *bt;
|
||||
struct sunos_termios *st;
|
||||
struct emul_termios *st;
|
||||
{
|
||||
register u_long l, r;
|
||||
|
||||
|
@ -332,58 +359,78 @@ btios2stios(bt, st)
|
|||
if (l >= 0)
|
||||
st->c_cflag |= l;
|
||||
|
||||
st->c_cc[0] = bt->c_cc[VINTR] != _POSIX_VDISABLE? bt->c_cc[VINTR]:0;
|
||||
st->c_cc[1] = bt->c_cc[VQUIT] != _POSIX_VDISABLE? bt->c_cc[VQUIT]:0;
|
||||
st->c_cc[2] = bt->c_cc[VERASE] != _POSIX_VDISABLE? bt->c_cc[VERASE]:0;
|
||||
st->c_cc[3] = bt->c_cc[VKILL] != _POSIX_VDISABLE? bt->c_cc[VKILL]:0;
|
||||
st->c_cc[4] = bt->c_cc[VEOF] != _POSIX_VDISABLE? bt->c_cc[VEOF]:0;
|
||||
st->c_cc[5] = bt->c_cc[VEOL] != _POSIX_VDISABLE? bt->c_cc[VEOL]:0;
|
||||
st->c_cc[6] = bt->c_cc[VEOL2] != _POSIX_VDISABLE? bt->c_cc[VEOL2]:0;
|
||||
st->c_cc[0] = NATIVE_TO_EMUL_CC(bt->c_cc[VINTR]);
|
||||
st->c_cc[1] = NATIVE_TO_EMUL_CC(bt->c_cc[VQUIT]);
|
||||
st->c_cc[2] = NATIVE_TO_EMUL_CC(bt->c_cc[VERASE]);
|
||||
st->c_cc[3] = NATIVE_TO_EMUL_CC(bt->c_cc[VKILL]);
|
||||
st->c_cc[4] = NATIVE_TO_EMUL_CC(bt->c_cc[VEOF]);
|
||||
st->c_cc[5] = NATIVE_TO_EMUL_CC(bt->c_cc[VEOL]);
|
||||
st->c_cc[6] = NATIVE_TO_EMUL_CC(bt->c_cc[VEOL2]);
|
||||
#ifdef CMOPAT_ULTRIX
|
||||
st->c_cc[7] = NATIVE_TO_EMUL_CC(bt->c_cc[VSWTCH]);
|
||||
#else
|
||||
st->c_cc[7] = 0;
|
||||
/* bt->c_cc[VSWTCH] != _POSIX_VDISABLE? bt->c_cc[VSWTCH]: */
|
||||
st->c_cc[8] = bt->c_cc[VSTART] != _POSIX_VDISABLE? bt->c_cc[VSTART]:0;
|
||||
st->c_cc[9] = bt->c_cc[VSTOP] != _POSIX_VDISABLE? bt->c_cc[VSTOP]:0;
|
||||
st->c_cc[10]= bt->c_cc[VSUSP] != _POSIX_VDISABLE? bt->c_cc[VSUSP]:0;
|
||||
st->c_cc[11]= bt->c_cc[VDSUSP] != _POSIX_VDISABLE? bt->c_cc[VDSUSP]:0;
|
||||
st->c_cc[12]= bt->c_cc[VREPRINT]!= _POSIX_VDISABLE? bt->c_cc[VREPRINT]:0;
|
||||
st->c_cc[13]= bt->c_cc[VDISCARD]!= _POSIX_VDISABLE? bt->c_cc[VDISCARD]:0;
|
||||
st->c_cc[14]= bt->c_cc[VWERASE] != _POSIX_VDISABLE? bt->c_cc[VWERASE]:0;
|
||||
st->c_cc[15]= bt->c_cc[VLNEXT] != _POSIX_VDISABLE? bt->c_cc[VLNEXT]:0;
|
||||
st->c_cc[16]= bt->c_cc[VSTATUS] != _POSIX_VDISABLE? bt->c_cc[VSTATUS]:0;
|
||||
#endif
|
||||
st->c_cc[10] = NATIVE_TO_EMUL_CC(bt->c_cc[VSTART]);
|
||||
st->c_cc[11] = NATIVE_TO_EMUL_CC(bt->c_cc[VSTOP]);
|
||||
st->c_cc[12]= NATIVE_TO_EMUL_CC(bt->c_cc[VSUSP]);
|
||||
st->c_cc[13]= NATIVE_TO_EMUL_CC(bt->c_cc[VDSUSP]);
|
||||
st->c_cc[14]= NATIVE_TO_EMUL_CC(bt->c_cc[VREPRINT]);
|
||||
st->c_cc[15]= NATIVE_TO_EMUL_CC(bt->c_cc[VDISCARD]);
|
||||
st->c_cc[16]= NATIVE_TO_EMUL_CC(bt->c_cc[VWERASE]);
|
||||
st->c_cc[17]= NATIVE_TO_EMUL_CC(bt->c_cc[VLNEXT]);
|
||||
st->c_cc[18]= NATIVE_TO_EMUL_CC(bt->c_cc[VSTATUS]);
|
||||
|
||||
#ifdef COMPAT_ULTRIX
|
||||
st->c_cc[8]= NATIVE_TO_EMUL_CC(bt->c_cc[VMIN]);
|
||||
st->c_cc[9]= NATIVE_TO_EMUL_CC(bt->c_cc[VTIME]);
|
||||
#else
|
||||
if (!(bt->c_lflag & ICANON)) {
|
||||
/* SunOS stores VMIN/VTIME in VEOF/VEOL (if ICANON is off) */
|
||||
st->c_cc[4] = bt->c_cc[VMIN];
|
||||
st->c_cc[5] = bt->c_cc[VTIME];
|
||||
}
|
||||
#endif
|
||||
|
||||
st->c_line = 0;
|
||||
#ifdef COMPAT_SUNOS
|
||||
st->c_line = 0; /* 4.3bsd "old" line discipline */
|
||||
#else
|
||||
st->c_line = 2; /* 4.3bsd "new" line discipline */
|
||||
#endif
|
||||
}
|
||||
|
||||
#define TERMIO_NCC 10 /* ultrix termio NCC is 10 */
|
||||
|
||||
/*
|
||||
* Convert emulated struct termios to termio(?)
|
||||
*/
|
||||
static void
|
||||
stios2stio(ts, t)
|
||||
struct sunos_termios *ts;
|
||||
struct sunos_termio *t;
|
||||
struct emul_termios *ts;
|
||||
struct emul_termio *t;
|
||||
{
|
||||
t->c_iflag = ts->c_iflag;
|
||||
t->c_oflag = ts->c_oflag;
|
||||
t->c_cflag = ts->c_cflag;
|
||||
t->c_lflag = ts->c_lflag;
|
||||
t->c_line = ts->c_line;
|
||||
bcopy(ts->c_cc, t->c_cc, 8);
|
||||
bcopy(ts->c_cc, t->c_cc, TERMIO_NCC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert the other way
|
||||
*/
|
||||
static void
|
||||
stio2stios(t, ts)
|
||||
struct sunos_termio *t;
|
||||
struct sunos_termios *ts;
|
||||
struct emul_termio *t;
|
||||
struct emul_termios *ts;
|
||||
{
|
||||
ts->c_iflag = t->c_iflag;
|
||||
ts->c_oflag = t->c_oflag;
|
||||
ts->c_cflag = t->c_cflag;
|
||||
ts->c_lflag = t->c_lflag;
|
||||
ts->c_line = t->c_line;
|
||||
bcopy(t->c_cc, ts->c_cc, 8); /* don't touch the upper fields! */
|
||||
bcopy(t->c_cc, ts->c_cc, TERMIO_NCC); /* don't touch the upper fields! */
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -483,6 +530,7 @@ ultrix_sys_ioctl(p, v, retval)
|
|||
case _IO('t', 132):
|
||||
SCARG(uap, com) = TIOCSCTTY;
|
||||
break;
|
||||
/* Emulate termio or termios tcget() */
|
||||
case ULTRIX_TCGETA:
|
||||
case ULTRIX_TCGETS:
|
||||
{
|
||||
|
@ -503,6 +551,7 @@ ultrix_sys_ioctl(p, v, retval)
|
|||
sizeof (sts));
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
/* Emulate termio tcset() */
|
||||
case ULTRIX_TCSETA:
|
||||
case ULTRIX_TCSETAW:
|
||||
case ULTRIX_TCSETAF:
|
||||
|
@ -543,6 +592,7 @@ ultrix_sys_ioctl(p, v, retval)
|
|||
#endif
|
||||
|
||||
}
|
||||
/* Emulate termios tcset() */
|
||||
case ULTRIX_TCSETS:
|
||||
case ULTRIX_TCSETSW:
|
||||
case ULTRIX_TCSETSF:
|
||||
|
@ -555,16 +605,8 @@ ultrix_sys_ioctl(p, v, retval)
|
|||
sizeof (sts))) != 0)
|
||||
return error;
|
||||
stios2btios (&sts, &bts);
|
||||
#ifndef DEBUG
|
||||
return (*ctl)(fp, ULTRIX_TCSETS - SCARG(uap, com) + TIOCSETA,
|
||||
(caddr_t)&bts, p);
|
||||
#else
|
||||
result = (*ctl)(fp, ULTRIX_TCSETS - SCARG(uap, com) + TIOCSETA,
|
||||
(caddr_t)&bts, p);
|
||||
printf("ultrix TCSETS %x returns %d\n",
|
||||
ULTRIX_TCSETS - SCARG(uap, com), result);
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
* Pseudo-tty ioctl translations.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: ultrix_tty.h,v 1.1 1995/12/27 19:57:25 jonathan Exp $ */
|
||||
/* $NetBSD: ultrix_tty.h,v 1.2 1996/01/04 19:03:36 jonathan Exp $ */
|
||||
|
||||
/* From: NetBSD sunos.h,v 1.4 1995/03/04 09:50:00 pk Exp */
|
||||
|
||||
|
@ -8,6 +8,11 @@ struct ultrix_ttysize {
|
|||
int ts_col;
|
||||
};
|
||||
|
||||
/*
|
||||
* Ultrix includes (BRL-derived?) SysV compatibile termio
|
||||
* as well as termios. This is the termio structure.
|
||||
*/
|
||||
|
||||
struct ultrix_termio {
|
||||
u_short c_iflag;
|
||||
u_short c_oflag;
|
||||
|
@ -21,6 +26,10 @@ struct ultrix_termio {
|
|||
#define ULTRIX_TCSETAW _IOW('t', 89, struct ultrix_termio)
|
||||
#define ULTRIX_TCSETAF _IOW('t', 88, struct ultrix_termio)
|
||||
|
||||
/*
|
||||
* Ultrix POSIX-compatible termios.
|
||||
* Very similar to SunOS but with more c_cc entries (gag)
|
||||
*/
|
||||
struct ultrix_termios {
|
||||
u_long c_iflag;
|
||||
u_long c_oflag;
|
||||
|
@ -29,11 +38,12 @@ struct ultrix_termios {
|
|||
u_char c_cc[19]; /* 17 for Sun */
|
||||
u_char c_line;
|
||||
};
|
||||
|
||||
#define ULTRIX_TCXONC _IO('T', 6)
|
||||
#define ULTRIX_TCFLSH _IO('T', 7)
|
||||
#define ULTRIX_TCGETS _IOR('t', 85, struct ultrix_termios)
|
||||
#define ULTRIX_TCSETS _IOW('t', 84, struct ultrix_termios) /*NOW*/
|
||||
#define ULTRIX_TCSETSW _IOW('t', 83, struct ultrix_termios) /* Drain&set*/
|
||||
#define ULTRIX_TCSETS _IOW('t', 84, struct ultrix_termios) /* set termios */
|
||||
#define ULTRIX_TCSETSW _IOW('t', 83, struct ultrix_termios) /* Drain&set,*/
|
||||
#define ULTRIX_TCSETSF _IOW('t', 82, struct ultrix_termios) /*Drainflush,set*/
|
||||
#define ULTRIX_TCSNDBRK _IO('T', 12)
|
||||
#define ULTRIX_TCDRAIN _IO('T', 13)
|
||||
|
|
Loading…
Reference in New Issue