summary |
tags |
clone url |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
6b726d4)
SCCS-vsn: sys/kern/tty.c 4.38
wflushtty(tp)
register struct tty *tp;
{
wflushtty(tp)
register struct tty *tp;
{
while (tp->t_outq.c_cc && tp->t_state&TS_CARR_ON
&& tp->t_oproc) { /* kludge for pty */
(*tp->t_oproc)(tp);
while (tp->t_outq.c_cc && tp->t_state&TS_CARR_ON
&& tp->t_oproc) { /* kludge for pty */
(*tp->t_oproc)(tp);
sleep((caddr_t)&tp->t_outq, TTOPRI);
}
flushtty(tp, FREAD);
sleep((caddr_t)&tp->t_outq, TTOPRI);
}
flushtty(tp, FREAD);
}
if (x >= TTYHOG/2 && putc(tp->t_stopc, &tp->t_outq) == 0) {
tp->t_state |= TS_TBLOCK;
}
if (x >= TTYHOG/2 && putc(tp->t_stopc, &tp->t_outq) == 0) {
tp->t_state |= TS_TBLOCK;
{
register struct clist *qp;
register c, t_flags;
{
register struct clist *qp;
register c, t_flags;
+ int s, first, error = 0;
if ((tp->t_state&TS_CARR_ON)==0)
return (EIO);
if ((tp->t_state&TS_CARR_ON)==0)
return (EIO);
/*
* Take any pending input first.
*/
/*
* Take any pending input first.
*/
if (tp->t_flags&PENDIN)
ttypend(tp);
if (tp->t_flags&PENDIN)
ttypend(tp);
/*
* Hang process if it's in the background.
/*
* Hang process if it's in the background.
* device interrupts when interrogating rawq.
*/
if (t_flags&RAW) {
* device interrupts when interrogating rawq.
*/
if (t_flags&RAW) {
if (tp->t_rawq.c_cc <= 0) {
if ((tp->t_state&TS_CARR_ON) == 0 ||
(tp->t_state&TS_NBIO)) {
if (tp->t_rawq.c_cc <= 0) {
if ((tp->t_state&TS_CARR_ON) == 0 ||
(tp->t_state&TS_NBIO)) {
return (0);
}
sleep((caddr_t)&tp->t_rawq, TTIPRI);
return (0);
}
sleep((caddr_t)&tp->t_rawq, TTIPRI);
- (void) spl0();
- while (tp->t_rawq.c_cc && uio->uio_iovcnt) {
+ splx(s);
+ while (!error && tp->t_rawq.c_cc && uio->uio_iovcnt)
error = passuc(getc(&tp->t_rawq), uio);
error = passuc(getc(&tp->t_rawq), uio);
- if (error)
- break;
- }
- return (error);
* No input, sleep on rawq awaiting hardware
* receipt and notification.
*/
* No input, sleep on rawq awaiting hardware
* receipt and notification.
*/
if (qp->c_cc <= 0) {
if ((tp->t_state&TS_CARR_ON) == 0 ||
(tp->t_state&TS_NBIO)) {
if (qp->c_cc <= 0) {
if ((tp->t_state&TS_CARR_ON) == 0 ||
(tp->t_state&TS_NBIO)) {
return (EWOULDBLOCK);
}
sleep((caddr_t)&tp->t_rawq, TTIPRI);
return (EWOULDBLOCK);
}
sleep((caddr_t)&tp->t_rawq, TTIPRI);
/*
* Input present, perform input mapping
/*
* Input present, perform input mapping
}
tp->t_state &= ~TS_BKSL;
}
tp->t_state &= ~TS_BKSL;
/*
* Look to unblock output now that (presumably)
* the input queue has gone down.
*/
/*
* Look to unblock output now that (presumably)
* the input queue has gone down.
*/
- if (tp->t_state&TS_TBLOCK && tp->t_rawq.c_cc < TTYHOG/5) {
+ if (tp->t_state&TS_TBLOCK && tp->t_rawq.c_cc < TTYHOG/5)
if (putc(tp->t_startc, &tp->t_outq) == 0) {
tp->t_state &= ~TS_TBLOCK;
ttstart(tp);
}
if (putc(tp->t_startc, &tp->t_outq) == 0) {
tp->t_state &= ~TS_TBLOCK;
ttstart(tp);
}