/* tty_pty.c 4.10 81/11/18 */
* (Actually two drivers, requiring two entries in 'cdevsw')
#define BUFSIZ 100 /* Chunk size iomoved from user */
struct clist pti_ioctl
, pti_ioans
;
if (minor(dev
) >= NPTY
) {
tp
= &pt_tty
[minor(dev
)];
if ((tp
->t_state
& ISOPEN
) == 0) {
ttychars(tp
); /* Set up default chars */
tp
->t_flags
= 0; /* No features (nor raw mode) */
} else if (tp
->t_state
&XCLUDE
&& u
.u_uid
!= 0) {
if (tp
->t_oproc
) /* Ctrlr still around. */
while ((tp
->t_state
& CARR_ON
) == 0) {
sleep((caddr_t
)&tp
->t_rawq
, TTIPRI
);
(*linesw
[tp
->t_line
].l_open
)(dev
, tp
);
{ /* Close slave part of PTY */
tp
= &pt_tty
[minor(dev
)];
(*linesw
[tp
->t_line
].l_close
)(tp
);
tp
= &pt_tty
[minor(dev
)];
(*linesw
[tp
->t_line
].l_read
)(tp
);
wakeup((caddr_t
)&tp
->t_rawq
.c_cf
);
tp
= &pt_tty
[minor(dev
)];
(*linesw
[tp
->t_line
].l_write
)(tp
);
struct pt_ioctl
*pti
= &pt_ioctl
[minor(tp
->t_dev
)];
if (tp
->t_state
& TTSTOP
)
selwakeup(pti
->pti_selr
, pti
->pti_flags
& PTCRCOLL
);
pti
->pti_flags
&= ~PTCRCOLL
;
wakeup((caddr_t
)&tp
->t_outq
.c_cf
);
if (minor(dev
) >= NPTY
) {
tp
= &pt_tty
[minor(dev
)];
wakeup((caddr_t
)&tp
->t_rawq
);
tp
= &pt_tty
[minor(dev
)];
if (tp
->t_state
& ISOPEN
)
gsignal(tp
->t_pgrp
, SIGHUP
);
tp
->t_state
&= ~CARR_ON
; /* virtual carrier gone */
flushtty(tp
, FREAD
|FWRITE
);
tp
->t_oproc
= 0; /* mark closed */
tp
= &pt_tty
[minor(dev
)];
if ((tp
->t_state
&(CARR_ON
|ISOPEN
)) == 0)
while (tp
->t_outq
.c_cc
== 0 || (tp
->t_state
&TTSTOP
))
sleep((caddr_t
)&tp
->t_outq
.c_cf
, TTIPRI
);
while (tp
->t_outq
.c_cc
&& passc(getc(&tp
->t_outq
)) >= 0);
if (tp
->t_outq
.c_cc
<= TTLOWAT(tp
) && (tp
->t_state
&ASLEEP
)) {
wakeup((caddr_t
)&tp
->t_outq
);
register struct tty
*tp
= &pt_tty
[minor(dev
)];
if ((tp
->t_state
&(CARR_ON
|ISOPEN
)) == 0)
pti
= &pt_ioctl
[minor(dev
)];
if ((p
= pti
->pti_selr
) && p
->p_wchan
== (caddr_t
)&selwait
)
pti
->pti_flags
|= PTCRCOLL
;
pti
->pti_selr
= u
.u_procp
;
tp
= &pt_tty
[minor(dev
)];
if ((tp
->t_state
&(CARR_ON
|ISOPEN
)) == 0)
cc
= MIN(u
.u_count
, BUFSIZ
);
iomove(cp
, (unsigned)cc
, B_WRITE
);
while (tp
->t_delct
&& tp
->t_rawq
.c_cc
>= TTYHOG
- 2) {
wakeup((caddr_t
)&tp
->t_rawq
);
/* Better than just flushing it! */
/* Wait for something to be read */
sleep((caddr_t
)&tp
->t_rawq
.c_cf
, TTOPRI
);
(*linesw
[tp
->t_line
].l_rint
)(*cp
++, tp
);
ptyioctl(dev
, cmd
, addr
, flag
)
tp
= &pt_tty
[minor(dev
)];
/* IF CONTROLLER STTY THEN MUST FLUSH TO PREVENT A HANG ??? */
if (cdevsw
[major(dev
)].d_open
== ptcopen
&& cmd
== TIOCSETP
)
while (getc(&tp
->t_outq
) >= 0);
if (ttioctl(tp
, cmd
, addr
, dev
) == 0)