113923Sedward #ifndef lint 2*18129Sedward static char sccsid[] = "@(#)wwiomux.c 3.12 02/27/85"; 313923Sedward #endif 413923Sedward 513923Sedward #include "ww.h" 615872Sedward #include <sys/time.h> 713923Sedward 815872Sedward /* 916124Sedward * Multiple window output handler. 1016124Sedward * The idea is to copy window outputs to the terminal, via the 1116124Sedward * display package. We try to give the top most window highest 1216124Sedward * priority. The only return condition is when there is keyboard 1316124Sedward * input, which is serviced asynchronously by wwrint(). 1416124Sedward * When there's nothing to do, we sleep in a select(). 1516124Sedward * This can be done better with interrupt driven io. But that's 1616124Sedward * not supported on ptys, yet. 1716124Sedward * The history of this routine is interesting. 1815872Sedward */ 1915872Sedward wwiomux() 2013923Sedward { 2115872Sedward register struct ww *w; 2215872Sedward int imask; 2316124Sedward register n; 2415872Sedward register char *p; 2515872Sedward char c; 2615872Sedward static struct timeval tv = { 0, 0 }; 2716124Sedward char noblock; 2813923Sedward 2915872Sedward loop: 3016124Sedward if (wwinterrupt()) 3116124Sedward return; 3216124Sedward 3316124Sedward imask = 0; 3416124Sedward noblock = 0; 3515872Sedward for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) { 3615872Sedward if (w->ww_pty < 0) 3715872Sedward continue; 3816124Sedward imask |= 1 << w->ww_pty; 3916313Sedward if (w->ww_obq > w->ww_obp && !w->ww_stopped) 4016124Sedward noblock = 1; 4115872Sedward } 4216124Sedward 4316124Sedward if (!noblock) { 4416124Sedward if (wwcurwin != 0) 4516124Sedward wwcurtowin(wwcurwin); 4615872Sedward wwupdate(); 4715872Sedward wwflush(); 4816124Sedward if (setjmp(wwjmpbuf)) 4916124Sedward return; 5016124Sedward wwsetjmp = 1; 5116124Sedward if (wwinterrupt()) { 5216124Sedward wwsetjmp = 0; 5316124Sedward return; 5416124Sedward } 5515872Sedward } 5615872Sedward wwnselect++; 5715872Sedward n = select(wwdtablesize, &imask, (int *)0, (int *)0, 5816124Sedward noblock ? &tv : (struct timeval *)0); 5916124Sedward wwsetjmp = 0; 6016124Sedward 6115872Sedward if (n < 0) 6215872Sedward wwnselecte++; 6316313Sedward else if (n == 0) 6416313Sedward wwnselectz++; 6516313Sedward else 6616313Sedward for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) { 6716313Sedward if (w->ww_pty < 0 || (imask & 1 << w->ww_pty) == 0) 6816313Sedward continue; 6916313Sedward wwnwread++; 7016313Sedward p = w->ww_obq; 7116313Sedward if (w->ww_ispty) { 7216313Sedward if (p == w->ww_ob) { 7315872Sedward w->ww_obp++; 7416313Sedward w->ww_obq++; 7516313Sedward } else 7615872Sedward p--; 7715872Sedward c = *p; 7816313Sedward } 7916313Sedward n = read(w->ww_pty, p, w->ww_obe - p); 8016313Sedward if (n < 0) { 8116313Sedward wwnwreade++; 8216313Sedward (void) close(w->ww_pty); 8316313Sedward w->ww_pty = -1; 8416313Sedward } else if (n == 0) { 8516313Sedward wwnwreadz++; 86*18129Sedward (void) close(w->ww_pty); 87*18129Sedward w->ww_pty = -1; 8816313Sedward } else if (!w->ww_ispty) { 8916313Sedward wwnwreadd++; 9016313Sedward wwnwreadc += n; 9116313Sedward w->ww_obq += n; 9216313Sedward } else if (*p == TIOCPKT_DATA) { 9316313Sedward n--; 9416313Sedward wwnwreadd++; 9516313Sedward wwnwreadc += n; 9616313Sedward w->ww_obq += n; 9716313Sedward } else { 9816313Sedward wwnwreadp++; 9916313Sedward if (*p & TIOCPKT_STOP) 10016313Sedward w->ww_stopped = 1; 10116313Sedward if (*p & TIOCPKT_START) 10216313Sedward w->ww_stopped = 0; 10316313Sedward if (*p & TIOCPKT_FLUSHWRITE) { 10416313Sedward w->ww_stopped = 0; 10516313Sedward w->ww_obq = w->ww_obp = w->ww_ob; 10615872Sedward } 10716313Sedward } 10816313Sedward if (w->ww_ispty) 10915872Sedward *p = c; 11016313Sedward } 11116127Sedward for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) 11216313Sedward if (w->ww_pty >= 0 && w->ww_obq > w->ww_obp && !w->ww_stopped) { 11316313Sedward n = wwwrite(w, w->ww_obp, w->ww_obq - w->ww_obp); 11416313Sedward if ((w->ww_obp += n) == w->ww_obq) 11516313Sedward w->ww_obq = w->ww_obp = w->ww_ob; 11616127Sedward if (wwinterrupt()) 11716127Sedward return; 11816127Sedward break; 11913923Sedward } 12016124Sedward goto loop; 12113923Sedward } 122