- register struct tty *tp;
- register struct pt_ioctl *pti;
-
- tp = &pt_tty[minor(dev)];
- if (tp->t_oproc) {
- (*linesw[tp->t_line].l_read)(tp);
- wakeup((caddr_t)&tp->t_rawq.c_cf);
- if (tp->t_rawq.c_cc < TTYHOG/2 &&
- (pti = &pt_ioctl[minor(tp->t_dev)])->pt_selw) {
- selwakeup(pti->pt_selw, pti->pt_flags & PF_WCOLL);
- pti->pt_selw = 0;
- pti->pt_flags &= ~PF_WCOLL;
+ register struct tty *tp = &pt_tty[minor(dev)];
+ register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
+ int error = 0;
+
+again:
+ if (pti->pt_flags & PF_REMOTE) {
+ while (tp == u.u_ttyp && u.u_procp->p_pgrp != tp->t_pgrp) {
+ if (u.u_signal[SIGTTIN] == SIG_IGN ||
+ u.u_signal[SIGTTIN] == SIG_HOLD ||
+ /*
+ (u.u_procp->p_flag&SDETACH) ||
+ */
+ u.u_procp->p_flag&SVFORK)
+ return (EIO);
+ gsignal(u.u_procp->p_pgrp, SIGTTIN);
+ sleep((caddr_t)&lbolt, TTIPRI);
+ }
+ if (tp->t_rawq.c_cc == 0) {
+ if (tp->t_state & TS_NBIO)
+ return (EWOULDBLOCK);
+ sleep((caddr_t)&tp->t_rawq, TTIPRI);
+ goto again;