- n = read(w->ww_pty, p, w->ww_obe - p);
- if (n < 0) {
- wwnwreade++;
- (void) close(w->ww_pty);
- w->ww_pty = -1;
- } else if (n == 0) {
- wwnwreadz++;
- (void) close(w->ww_pty);
- w->ww_pty = -1;
- } else if (!w->ww_ispty) {
- wwnwreadd++;
- wwnwreadc += n;
- w->ww_obq += n;
- } else if (*p == TIOCPKT_DATA) {
- n--;
- wwnwreadd++;
- wwnwreadc += n;
- w->ww_obq += n;
- } else {
- wwnwreadp++;
- if (*p & TIOCPKT_STOP)
- w->ww_stopped = 1;
- if (*p & TIOCPKT_START)
- w->ww_stopped = 0;
- if (*p & TIOCPKT_FLUSHWRITE) {
- w->ww_stopped = 0;
+ }
+ wwnselect++;
+ n = select(wwdtablesize, &imask, (fd_set *)0, (fd_set *)0,
+ noblock ? &tv : (struct timeval *)0);
+ wwsetjmp = 0;
+
+ if (n < 0)
+ wwnselecte++;
+ else if (n == 0)
+ wwnselectz++;
+ else
+ for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
+ if (w->ww_pty < 0 ||
+ !FD_ISSET(w->ww_pty, &imask))
+ continue;
+ wwnwread++;
+ p = w->ww_obq;
+ if (w->ww_ispty) {
+ if (p == w->ww_ob) {
+ w->ww_obp++;
+ w->ww_obq++;
+ } else
+ p--;
+ c = *p;
+ }
+ n = read(w->ww_pty, p, w->ww_obe - p);
+ if (n < 0) {
+ wwnwreade++;
+ (void) close(w->ww_pty);
+ w->ww_pty = -1;
+ } else if (n == 0) {
+ wwnwreadz++;
+ (void) close(w->ww_pty);
+ w->ww_pty = -1;
+ } else if (!w->ww_ispty) {
+ wwnwreadd++;
+ wwnwreadc += n;
+ w->ww_obq += n;
+ } else if (*p == TIOCPKT_DATA) {
+ n--;
+ wwnwreadd++;
+ wwnwreadc += n;
+ w->ww_obq += n;
+ } else {
+ wwnwreadp++;
+ if (*p & TIOCPKT_STOP)
+ w->ww_stopped = 1;
+ if (*p & TIOCPKT_START)
+ w->ww_stopped = 0;
+ if (*p & TIOCPKT_FLUSHWRITE) {
+ w->ww_stopped = 0;
+ w->ww_obq = w->ww_obp =
+ w->ww_ob;
+ }
+ }
+ if (w->ww_ispty)
+ *p = c;
+ }
+ for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw)
+ if (w->ww_pty >= 0 && w->ww_obq > w->ww_obp &&
+ !w->ww_stopped) {
+ n = wwwrite(w, w->ww_obp,
+ w->ww_obq - w->ww_obp);
+ if ((w->ww_obp += n) == w->ww_obq)