date and time created 87/10/06 00:36:06 by edward
[unix-history] / usr / src / usr.bin / telnet / tn3270.c
CommitLineData
b6a8714b
GM
1void
2tn3270_init()
3{
4#if defined(TN3270)
5 Sent3270TerminalType = 0;
6 Ifrontp = Ibackp = Ibuf;
7 init_ctlr(); /* Initialize some things */
8 init_keyboard();
9 init_screen();
10 init_system();
11#endif /* defined(TN3270) */
12}
13
14#if defined(TN3270)
15
16/*
17 * DataToNetwork - queue up some data to go to network. If "done" is set,
18 * then when last byte is queued, we add on an IAC EOR sequence (so,
19 * don't call us with "done" until you want that done...)
20 *
21 * We actually do send all the data to the network buffer, since our
22 * only client needs for us to do that.
23 */
24
25int
26DataToNetwork(buffer, count, done)
27register char *buffer; /* where the data is */
28register int count; /* how much to send */
29int done; /* is this the last of a logical block */
30{
31 register int c;
32 int origCount;
33 fd_set o;
34
35 origCount = count;
36 FD_ZERO(&o);
37
38 while (count) {
39 if ((netobuf+sizeof netobuf - nfrontp) < 6) {
40 netflush();
41 while ((netobuf+sizeof netobuf - nfrontp) < 6) {
42 FD_SET(net, &o);
43 (void) select(net+1, (fd_set *) 0, &o, (fd_set *) 0,
44 (struct timeval *) 0);
45 netflush();
46 }
47 }
48 c = *buffer++;
49 count--;
50 if (c == IAC) {
51 *nfrontp++ = IAC;
52 *nfrontp++ = IAC;
53 } else {
54 *nfrontp++ = c;
55 }
56 }
57
58 if (done && !count) {
59 *nfrontp++ = IAC;
60 *nfrontp++ = EOR;
61 netflush(); /* try to move along as quickly as ... */
62 }
63 return(origCount - count);
64}
65
66
67#if defined(unix)
68static void
69inputAvailable()
70{
71 HaveInput = 1;
72}
73#endif /* defined(unix) */
74
75void
76outputPurge()
77{
d732be39 78 ttyflush(1);
b6a8714b
GM
79}
80
81
82/*
83 * The following routines are places where the various tn3270
84 * routines make calls into telnet.c.
85 */
86
87/* TtyChars() - returns the number of characters in the TTY buffer */
88TtyChars()
89{
90 return(tfrontp-tbackp);
91}
92
93/* DataToTerminal - queue up some data to go to terminal. */
94
95int
96DataToTerminal(buffer, count)
97register char *buffer; /* where the data is */
98register int count; /* how much to send */
99{
100 int origCount;
101#if defined(unix)
102 fd_set o;
103
104 FD_ZERO(&o);
105#endif /* defined(unix) */
106 origCount = count;
107
108 while (count) {
109 if (tfrontp >= ttyobuf+sizeof ttyobuf) {
d732be39 110 ttyflush(0);
b6a8714b
GM
111 while (tfrontp >= ttyobuf+sizeof ttyobuf) {
112#if defined(unix)
113 FD_SET(tout, &o);
114 (void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0,
115 (struct timeval *) 0);
116#endif /* defined(unix) */
d732be39 117 ttyflush(0);
b6a8714b
GM
118 }
119 }
120 *tfrontp++ = *buffer++;
121 count--;
122 }
123 return(origCount - count);
124}
125
126/* EmptyTerminal - called to make sure that the terminal buffer is empty.
127 * Note that we consider the buffer to run all the
128 * way to the kernel (thus the select).
129 */
130
131void
132EmptyTerminal()
133{
134#if defined(unix)
135 fd_set o;
136
137 FD_ZERO(&o);
138#endif /* defined(unix) */
139
140 if (tfrontp == tbackp) {
141#if defined(unix)
142 FD_SET(tout, &o);
143 (void) select(tout+1, (int *) 0, &o, (int *) 0,
144 (struct timeval *) 0); /* wait for TTLOWAT */
145#endif /* defined(unix) */
146 } else {
147 while (tfrontp != tbackp) {
d732be39 148 ttyflush(0);
b6a8714b
GM
149#if defined(unix)
150 FD_SET(tout, &o);
151 (void) select(tout+1, (int *) 0, &o, (int *) 0,
152 (struct timeval *) 0); /* wait for TTLOWAT */
153#endif /* defined(unix) */
154 }
155 }
156}
157\f
158
159/*
160 * Push3270 - Try to send data along the 3270 output (to screen) direction.
161 */
162
163static int
164Push3270()
165{
166 int save = scc;
167
168 if (scc) {
169 if (Ifrontp+scc > Ibuf+sizeof Ibuf) {
170 if (Ibackp != Ibuf) {
171 memcpy(Ibuf, Ibackp, Ifrontp-Ibackp);
172 Ifrontp -= (Ibackp-Ibuf);
173 Ibackp = Ibuf;
174 }
175 }
176 if (Ifrontp+scc < Ibuf+sizeof Ibuf) {
177 telrcv();
178 }
179 }
180 return save != scc;
181}
182
183
184/*
185 * Finish3270 - get the last dregs of 3270 data out to the terminal
186 * before quitting.
187 */
188
189static void
190Finish3270()
191{
192 while (Push3270() || !DoTerminalOutput()) {
193#if defined(unix)
194 HaveInput = 0;
195#endif /* defined(unix) */
196 ;
197 }
198}
199
200
201/* StringToTerminal - output a null terminated string to the terminal */
202
203void
204StringToTerminal(s)
205char *s;
206{
207 int count;
208
209 count = strlen(s);
210 if (count) {
211 (void) DataToTerminal(s, count); /* we know it always goes... */
212 }
213}
214
215
216#if ((!defined(NOT43)) || defined(PUTCHAR))
217/* _putchar - output a single character to the terminal. This name is so that
218 * curses(3x) can call us to send out data.
219 */
220
221void
222_putchar(c)
223char c;
224{
225 if (tfrontp >= ttyobuf+sizeof ttyobuf) {
226 (void) DataToTerminal(&c, 1);
227 } else {
228 *tfrontp++ = c; /* optimize if possible. */
229 }
230}
231#endif /* ((!defined(NOT43)) || defined(PUTCHAR)) */
232
233#endif /* defined(TN3270) */