|
1 // termstat.c |
|
2 // |
|
3 // © Portions Copyright (c) Symbian Software Ltd 2007. All rights reserved. |
|
4 // |
|
5 /* |
|
6 * Copyright (c) 1989, 1993 |
|
7 * The Regents of the University of California. All rights reserved. |
|
8 * |
|
9 * Redistribution and use in source and binary forms, with or without |
|
10 * modification, are permitted provided that the following conditions |
|
11 * are met: |
|
12 * 1. Redistributions of source code must retain the above copyright |
|
13 * notice, this list of conditions and the following disclaimer. |
|
14 * 2. Redistributions in binary form must reproduce the above copyright |
|
15 * notice, this list of conditions and the following disclaimer in the |
|
16 * documentation and/or other materials provided with the distribution. |
|
17 * 3. Neither the name of the University nor the names of its contributors |
|
18 * may be used to endorse or promote products derived from this software |
|
19 * without specific prior written permission. |
|
20 * |
|
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
|
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
|
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
31 * SUCH DAMAGE. |
|
32 */ |
|
33 |
|
34 #include "telnetd.h" |
|
35 |
|
36 #ifndef __SYMBIAN32__ |
|
37 __RCSID("$Heimdal: termstat.c,v 1.12 2001/08/29 00:45:23 assar Exp $" |
|
38 "$NetBSD: termstat.c,v 1.2 2003/08/07 09:15:30 agc Exp $"); |
|
39 #endif |
|
40 |
|
41 /* |
|
42 * local variables |
|
43 */ |
|
44 int def_tspeed = -1, def_rspeed = -1; |
|
45 #ifdef TIOCSWINSZ |
|
46 int def_row = 0, def_col = 0; |
|
47 #endif |
|
48 |
|
49 /* |
|
50 * flowstat |
|
51 * |
|
52 * Check for changes to flow control |
|
53 */ |
|
54 void |
|
55 flowstat(void) |
|
56 { |
|
57 if (his_state_is_will(TELOPT_LFLOW)) { |
|
58 if (tty_flowmode() != flowmode) { |
|
59 flowmode = tty_flowmode(); |
|
60 output_data("%c%c%c%c%c%c", |
|
61 IAC, SB, TELOPT_LFLOW, |
|
62 flowmode ? LFLOW_ON : LFLOW_OFF, |
|
63 IAC, SE); |
|
64 } |
|
65 if (tty_restartany() != restartany) { |
|
66 restartany = tty_restartany(); |
|
67 output_data("%c%c%c%c%c%c", |
|
68 IAC, SB, TELOPT_LFLOW, |
|
69 restartany ? LFLOW_RESTART_ANY |
|
70 : LFLOW_RESTART_XON, |
|
71 IAC, SE); |
|
72 } |
|
73 } |
|
74 } |
|
75 |
|
76 /* |
|
77 * clientstat |
|
78 * |
|
79 * Process linemode related requests from the client. |
|
80 * Client can request a change to only one of linemode, editmode or slc's |
|
81 * at a time, and if using kludge linemode, then only linemode may be |
|
82 * affected. |
|
83 */ |
|
84 void |
|
85 clientstat(int code, int parm1, int parm2) |
|
86 { |
|
87 /* |
|
88 * Get a copy of terminal characteristics. |
|
89 */ |
|
90 init_termbuf(); |
|
91 |
|
92 /* |
|
93 * Process request from client. code tells what it is. |
|
94 */ |
|
95 switch (code) { |
|
96 case TELOPT_NAWS: |
|
97 #ifdef TIOCSWINSZ |
|
98 { |
|
99 struct winsize ws; |
|
100 |
|
101 def_col = parm1; |
|
102 def_row = parm2; |
|
103 |
|
104 /* |
|
105 * Change window size as requested by client. |
|
106 */ |
|
107 |
|
108 ws.ws_col = parm1; |
|
109 ws.ws_row = parm2; |
|
110 ioctl(ourpty, TIOCSWINSZ, (char *)&ws); |
|
111 } |
|
112 #endif /* TIOCSWINSZ */ |
|
113 |
|
114 break; |
|
115 |
|
116 case TELOPT_TSPEED: |
|
117 { |
|
118 def_tspeed = parm1; |
|
119 def_rspeed = parm2; |
|
120 /* |
|
121 * Change terminal speed as requested by client. |
|
122 * We set the receive speed first, so that if we can't |
|
123 * store seperate receive and transmit speeds, the transmit |
|
124 * speed will take precedence. |
|
125 */ |
|
126 tty_rspeed(parm2); |
|
127 tty_tspeed(parm1); |
|
128 set_termbuf(); |
|
129 |
|
130 break; |
|
131 |
|
132 } /* end of case TELOPT_TSPEED */ |
|
133 |
|
134 default: |
|
135 /* What? */ |
|
136 break; |
|
137 } /* end of switch */ |
|
138 |
|
139 netflush(); |
|
140 |
|
141 } |