Extract "set" family functions to separate module, needed for
locking in sio f.e.
This commit is contained in:
parent
bc9685528a
commit
0a247e7d30
@ -31,7 +31,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* @(#)tty_compat.c 8.1 (Berkeley) 6/10/93
|
* @(#)tty_compat.c 8.1 (Berkeley) 6/10/93
|
||||||
* $Id: tty_compat.c,v 1.10 1995/04/02 04:15:08 ache Exp $
|
* $Id: tty_compat.c,v 1.11 1995/04/02 19:26:50 ache Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -83,6 +83,83 @@ static int compatspcodes[] = {
|
|||||||
1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200,
|
1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int ttsetcompat(tp, com, data, term)
|
||||||
|
register struct tty *tp;
|
||||||
|
int *com;
|
||||||
|
caddr_t data;
|
||||||
|
struct termios *term;
|
||||||
|
{
|
||||||
|
switch (*com) {
|
||||||
|
case TIOCSETP:
|
||||||
|
case TIOCSETN: {
|
||||||
|
register struct sgttyb *sg = (struct sgttyb *)data;
|
||||||
|
int speed;
|
||||||
|
|
||||||
|
if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
|
||||||
|
return(EINVAL);
|
||||||
|
else
|
||||||
|
term->c_ispeed = compatspcodes[speed];
|
||||||
|
if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
|
||||||
|
return(EINVAL);
|
||||||
|
else
|
||||||
|
term->c_ospeed = compatspcodes[speed];
|
||||||
|
term->c_cc[VERASE] = sg->sg_erase;
|
||||||
|
term->c_cc[VKILL] = sg->sg_kill;
|
||||||
|
tp->t_flags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
|
||||||
|
ttcompatsetflags(tp, term);
|
||||||
|
*com = (*com == TIOCSETP) ? TIOCSETAF : TIOCSETA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TIOCSETC: {
|
||||||
|
struct tchars *tc = (struct tchars *)data;
|
||||||
|
register cc_t *cc;
|
||||||
|
|
||||||
|
cc = term->c_cc;
|
||||||
|
cc[VINTR] = tc->t_intrc;
|
||||||
|
cc[VQUIT] = tc->t_quitc;
|
||||||
|
cc[VSTART] = tc->t_startc;
|
||||||
|
cc[VSTOP] = tc->t_stopc;
|
||||||
|
cc[VEOF] = tc->t_eofc;
|
||||||
|
cc[VEOL] = tc->t_brkc;
|
||||||
|
if (tc->t_brkc == -1)
|
||||||
|
cc[VEOL2] = _POSIX_VDISABLE;
|
||||||
|
*com = TIOCSETA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TIOCSLTC: {
|
||||||
|
struct ltchars *ltc = (struct ltchars *)data;
|
||||||
|
register cc_t *cc;
|
||||||
|
|
||||||
|
cc = term->c_cc;
|
||||||
|
cc[VSUSP] = ltc->t_suspc;
|
||||||
|
cc[VDSUSP] = ltc->t_dsuspc;
|
||||||
|
cc[VREPRINT] = ltc->t_rprntc;
|
||||||
|
cc[VDISCARD] = ltc->t_flushc;
|
||||||
|
cc[VWERASE] = ltc->t_werasc;
|
||||||
|
cc[VLNEXT] = ltc->t_lnextc;
|
||||||
|
*com = TIOCSETA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TIOCLBIS:
|
||||||
|
case TIOCLBIC:
|
||||||
|
case TIOCLSET:
|
||||||
|
if (*com == TIOCLSET)
|
||||||
|
tp->t_flags = (tp->t_flags&0xffff) | *(int *)data<<16;
|
||||||
|
else {
|
||||||
|
tp->t_flags =
|
||||||
|
(ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff);
|
||||||
|
if (*com == TIOCLBIS)
|
||||||
|
tp->t_flags |= *(int *)data<<16;
|
||||||
|
else
|
||||||
|
tp->t_flags &= ~(*(int *)data<<16);
|
||||||
|
}
|
||||||
|
ttcompatsetlflags(tp, term);
|
||||||
|
*com = TIOCSETA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
int
|
int
|
||||||
ttcompat(tp, com, data, flag)
|
ttcompat(tp, com, data, flag)
|
||||||
@ -91,9 +168,22 @@ ttcompat(tp, com, data, flag)
|
|||||||
caddr_t data;
|
caddr_t data;
|
||||||
int flag;
|
int flag;
|
||||||
{
|
{
|
||||||
struct termios term;
|
|
||||||
|
|
||||||
switch (com) {
|
switch (com) {
|
||||||
|
case TIOCSETP:
|
||||||
|
case TIOCSETN:
|
||||||
|
case TIOCSETC:
|
||||||
|
case TIOCSLTC:
|
||||||
|
case TIOCLBIS:
|
||||||
|
case TIOCLBIC:
|
||||||
|
case TIOCLSET: {
|
||||||
|
struct termios term;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
term = tp->t_termios;
|
||||||
|
if ((error = ttsetcompat(tp, &com, data, &term)) != 0)
|
||||||
|
return error;
|
||||||
|
return ttioctl(tp, com, &term, flag);
|
||||||
|
}
|
||||||
case TIOCGETP: {
|
case TIOCGETP: {
|
||||||
register struct sgttyb *sg = (struct sgttyb *)data;
|
register struct sgttyb *sg = (struct sgttyb *)data;
|
||||||
register cc_t *cc = tp->t_cc;
|
register cc_t *cc = tp->t_cc;
|
||||||
@ -112,29 +202,6 @@ ttcompat(tp, com, data, flag)
|
|||||||
sg->sg_flags = tp->t_flags = ttcompatgetflags(tp);
|
sg->sg_flags = tp->t_flags = ttcompatgetflags(tp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TIOCSETP:
|
|
||||||
case TIOCSETN: {
|
|
||||||
register struct sgttyb *sg = (struct sgttyb *)data;
|
|
||||||
int speed;
|
|
||||||
|
|
||||||
term = tp->t_termios;
|
|
||||||
if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
|
|
||||||
return(EINVAL);
|
|
||||||
else
|
|
||||||
term.c_ispeed = compatspcodes[speed];
|
|
||||||
if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
|
|
||||||
return(EINVAL);
|
|
||||||
else
|
|
||||||
term.c_ospeed = compatspcodes[speed];
|
|
||||||
term.c_cc[VERASE] = sg->sg_erase;
|
|
||||||
term.c_cc[VKILL] = sg->sg_kill;
|
|
||||||
tp->t_flags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
|
|
||||||
ttcompatsetflags(tp, &term);
|
|
||||||
return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA,
|
|
||||||
&term, flag));
|
|
||||||
}
|
|
||||||
|
|
||||||
case TIOCGETC: {
|
case TIOCGETC: {
|
||||||
struct tchars *tc = (struct tchars *)data;
|
struct tchars *tc = (struct tchars *)data;
|
||||||
register cc_t *cc = tp->t_cc;
|
register cc_t *cc = tp->t_cc;
|
||||||
@ -147,36 +214,6 @@ ttcompat(tp, com, data, flag)
|
|||||||
tc->t_brkc = cc[VEOL];
|
tc->t_brkc = cc[VEOL];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TIOCSETC: {
|
|
||||||
struct tchars *tc = (struct tchars *)data;
|
|
||||||
register cc_t *cc;
|
|
||||||
|
|
||||||
term = tp->t_termios;
|
|
||||||
cc = term.c_cc;
|
|
||||||
cc[VINTR] = tc->t_intrc;
|
|
||||||
cc[VQUIT] = tc->t_quitc;
|
|
||||||
cc[VSTART] = tc->t_startc;
|
|
||||||
cc[VSTOP] = tc->t_stopc;
|
|
||||||
cc[VEOF] = tc->t_eofc;
|
|
||||||
cc[VEOL] = tc->t_brkc;
|
|
||||||
if (tc->t_brkc == -1)
|
|
||||||
cc[VEOL2] = _POSIX_VDISABLE;
|
|
||||||
return (ttioctl(tp, TIOCSETA, &term, flag));
|
|
||||||
}
|
|
||||||
case TIOCSLTC: {
|
|
||||||
struct ltchars *ltc = (struct ltchars *)data;
|
|
||||||
register cc_t *cc;
|
|
||||||
|
|
||||||
term = tp->t_termios;
|
|
||||||
cc = term.c_cc;
|
|
||||||
cc[VSUSP] = ltc->t_suspc;
|
|
||||||
cc[VDSUSP] = ltc->t_dsuspc;
|
|
||||||
cc[VREPRINT] = ltc->t_rprntc;
|
|
||||||
cc[VDISCARD] = ltc->t_flushc;
|
|
||||||
cc[VWERASE] = ltc->t_werasc;
|
|
||||||
cc[VLNEXT] = ltc->t_lnextc;
|
|
||||||
return (ttioctl(tp, TIOCSETA, &term, flag));
|
|
||||||
}
|
|
||||||
case TIOCGLTC: {
|
case TIOCGLTC: {
|
||||||
struct ltchars *ltc = (struct ltchars *)data;
|
struct ltchars *ltc = (struct ltchars *)data;
|
||||||
register cc_t *cc = tp->t_cc;
|
register cc_t *cc = tp->t_cc;
|
||||||
@ -189,23 +226,6 @@ ttcompat(tp, com, data, flag)
|
|||||||
ltc->t_lnextc = cc[VLNEXT];
|
ltc->t_lnextc = cc[VLNEXT];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TIOCLBIS:
|
|
||||||
case TIOCLBIC:
|
|
||||||
case TIOCLSET:
|
|
||||||
term = tp->t_termios;
|
|
||||||
if (com == TIOCLSET)
|
|
||||||
tp->t_flags = (tp->t_flags&0xffff) | *(int *)data<<16;
|
|
||||||
else {
|
|
||||||
tp->t_flags =
|
|
||||||
(ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff);
|
|
||||||
if (com == TIOCLBIS)
|
|
||||||
tp->t_flags |= *(int *)data<<16;
|
|
||||||
else
|
|
||||||
tp->t_flags &= ~(*(int *)data<<16);
|
|
||||||
}
|
|
||||||
ttcompatsetlflags(tp, &term);
|
|
||||||
return (ttioctl(tp, TIOCSETA, &term, flag));
|
|
||||||
|
|
||||||
case TIOCLGET:
|
case TIOCLGET:
|
||||||
tp->t_flags =
|
tp->t_flags =
|
||||||
(ttcompatgetflags(tp) & 0xffff0000UL)
|
(ttcompatgetflags(tp) & 0xffff0000UL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user