4.1cBSD/a/sys/sys/tty_xxx.c
#ifndef NOCOMPAT
/* tty_xxx.c 4.2 82/12/17 */
#include "../machine/reg.h"
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/dir.h"
#include "../h/user.h"
#include "../h/ioctl.h"
#include "../h/tty.h"
#include "../h/proc.h"
#include "../h/inode.h"
#include "../h/file.h"
#include "../h/conf.h"
#include "../h/buf.h"
#include "../h/dk.h"
#include "../h/uio.h"
#include "../h/kernel.h"
ottioctl(tp, com, data, flag)
struct tty *tp;
caddr_t data;
{
int s;
switch (com) {
/* set and fetch special characters */
case TIOCSETC:
bcopy(data, (caddr_t)&tp->t_intrc, sizeof (struct tchars));
break;
case TIOCGETC:
bcopy((caddr_t)&tp->t_intrc, data, sizeof (struct tchars));
break;
/* set new parameters */
case TIOCSETP:
case TIOCSETN: {
register struct sgttyb *sg = (struct sgttyb *)data;
s = spl5();
if (tp->t_flags&RAW || sg->sg_flags&RAW || com == TIOCSETP)
wflushtty(tp);
else if ((tp->t_flags&CBREAK) != (sg->sg_flags&CBREAK)) {
if (sg->sg_flags&CBREAK) {
struct clist tq;
catq(&tp->t_rawq, &tp->t_canq);
tq = tp->t_rawq;
tp->t_rawq = tp->t_canq;
tp->t_canq = tq;
} else {
tp->t_flags |= PENDIN;
ttwakeup(tp);
}
}
tp->t_ispeed = sg->sg_ispeed;
tp->t_ospeed = sg->sg_ospeed;
tp->t_erase = sg->sg_erase;
tp->t_kill = sg->sg_kill;
tp->t_flags &= ~0xffff;
tp->t_flags |= sg->sg_flags;
if (tp->t_flags&RAW) {
tp->t_state &= ~TS_TTSTOP;
ttstart(tp);
}
splx(s);
break;
}
/* send current parameters to user */
case TIOCGETP: {
register struct sgttyb *sg = (struct sgttyb *)data;
sg->sg_ispeed = tp->t_ispeed;
sg->sg_ospeed = tp->t_ospeed;
sg->sg_erase = tp->t_erase;
sg->sg_kill = tp->t_kill;
sg->sg_flags = tp->t_flags;
break;
}
case FIONBIO:
if (*(int *)data)
tp->t_state |= TS_NBIO;
else
tp->t_state &= ~TS_NBIO;
break;
/* set/get local special characters */
case TIOCSLTC:
bcopy(data, (caddr_t)&tp->t_suspc, sizeof (struct ltchars));
break;
case TIOCGLTC:
bcopy((caddr_t)&tp->t_suspc, data, sizeof (struct ltchars));
break;
/*
* Modify local mode word.
*/
case TIOCLBIS:
tp->t_flags |= *(int *)data << 16;
break;
case TIOCLBIC:
tp->t_flags &= ~(*(int *)data << 16);
break;
case TIOCLSET:
tp->t_flags &= 0xffff;
tp->t_flags |= *(int *)data << 16;
break;
case TIOCLGET:
*(int *)data = tp->t_flags >> 16;
break;
/* should allow SPGRP and GPGRP only if tty open for reading */
case TIOCSPGRP:
tp->t_pgrp = *(int *)data;
break;
case TIOCGPGRP:
*(int *)data = tp->t_pgrp;
break;
default:
return (-1);
}
return (0);
}
#endif