1: #ifndef lint
2: static char sccsid[] = "@(#)wwiomux.c 3.15 9/19/85";
3: #endif
4:
5: /*
6: * Copyright (c) 1983 Regents of the University of California,
7: * All rights reserved. Redistribution permitted subject to
8: * the terms of the Berkeley Software License Agreement.
9: */
10:
11: #include "ww.h"
12: #include <sys/time.h>
13: #include <sys/types.h>
14:
15: /*
16: * Multiple window output handler.
17: * The idea is to copy window outputs to the terminal, via the
18: * display package. We try to give the top most window highest
19: * priority. The only return condition is when there is keyboard
20: * input, which is serviced asynchronously by wwrint().
21: * When there's nothing to do, we sleep in a select().
22: * This can be done better with interrupt driven io. But that's
23: * not supported on ptys, yet.
24: * The history of this routine is interesting.
25: */
26: wwiomux()
27: {
28: register struct ww *w;
29: fd_set imask;
30: register n;
31: register char *p;
32: char c;
33: static struct timeval tv = { 0, 0 };
34: char noblock;
35:
36: loop:
37: if (wwinterrupt())
38: return;
39:
40: FD_ZERO(&imask);
41: noblock = 0;
42: for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
43: if (w->ww_pty < 0)
44: continue;
45: if (w->ww_obq < w->ww_obe)
46: FD_SET(w->ww_pty, &imask);
47: if (w->ww_obq > w->ww_obp && !w->ww_stopped)
48: noblock = 1;
49: }
50:
51: if (!noblock) {
52: if (wwcurwin != 0)
53: wwcurtowin(wwcurwin);
54: wwupdate();
55: wwflush();
56: if (setjmp(wwjmpbuf))
57: return;
58: wwsetjmp = 1;
59: if (wwinterrupt()) {
60: wwsetjmp = 0;
61: return;
62: }
63: }
64: wwnselect++;
65: n = select(wwdtablesize, &imask, (fd_set *)0, (fd_set *)0,
66: noblock ? &tv : (struct timeval *)0);
67: wwsetjmp = 0;
68:
69: if (n < 0)
70: wwnselecte++;
71: else if (n == 0)
72: wwnselectz++;
73: else
74: for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
75: if (w->ww_pty < 0 || !FD_ISSET(w->ww_pty, &imask))
76: continue;
77: wwnwread++;
78: p = w->ww_obq;
79: if (w->ww_ispty) {
80: if (p == w->ww_ob) {
81: w->ww_obp++;
82: w->ww_obq++;
83: } else
84: p--;
85: c = *p;
86: }
87: n = read(w->ww_pty, p, w->ww_obe - p);
88: if (n < 0) {
89: wwnwreade++;
90: (void) close(w->ww_pty);
91: w->ww_pty = -1;
92: } else if (n == 0) {
93: wwnwreadz++;
94: (void) close(w->ww_pty);
95: w->ww_pty = -1;
96: } else if (!w->ww_ispty) {
97: wwnwreadd++;
98: wwnwreadc += n;
99: w->ww_obq += n;
100: } else if (*p == TIOCPKT_DATA) {
101: n--;
102: wwnwreadd++;
103: wwnwreadc += n;
104: w->ww_obq += n;
105: } else {
106: wwnwreadp++;
107: if (*p & TIOCPKT_STOP)
108: w->ww_stopped = 1;
109: if (*p & TIOCPKT_START)
110: w->ww_stopped = 0;
111: if (*p & TIOCPKT_FLUSHWRITE) {
112: w->ww_stopped = 0;
113: w->ww_obq = w->ww_obp = w->ww_ob;
114: }
115: }
116: if (w->ww_ispty)
117: *p = c;
118: }
119: for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw)
120: if (w->ww_pty >= 0 && w->ww_obq > w->ww_obp && !w->ww_stopped) {
121: n = wwwrite(w, w->ww_obp, w->ww_obq - w->ww_obp);
122: if ((w->ww_obp += n) == w->ww_obq)
123: w->ww_obq = w->ww_obp = w->ww_ob;
124: if (wwinterrupt())
125: return;
126: break;
127: }
128: goto loop;
129: }
Defined functions
Defined variables
sccsid
defined in line
2;
never used