1 /*
2  * Copyright (c) 1989, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. 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 RCSID("$Id$");
37 
38 /*
39  * local variables
40  */
41 int def_tspeed = -1, def_rspeed = -1;
42 #ifdef	TIOCSWINSZ
43 int def_row = 0, def_col = 0;
44 #endif
45 
46 /*
47  * flowstat
48  *
49  * Check for changes to flow control
50  */
51 void
52 flowstat(void)
53 {
54     if (his_state_is_will(TELOPT_LFLOW)) {
55 	if (tty_flowmode() != flowmode) {
56 	    flowmode = tty_flowmode();
57 	    output_data("%c%c%c%c%c%c",
58 			IAC, SB, TELOPT_LFLOW,
59 			flowmode ? LFLOW_ON : LFLOW_OFF,
60 			IAC, SE);
61 	}
62 	if (tty_restartany() != restartany) {
63 	    restartany = tty_restartany();
64 	    output_data("%c%c%c%c%c%c",
65 			IAC, SB, TELOPT_LFLOW,
66 			restartany ? LFLOW_RESTART_ANY
67 			: LFLOW_RESTART_XON,
68 			IAC, SE);
69 	}
70     }
71 }
72 
73 /*
74  * clientstat
75  *
76  * Process linemode related requests from the client.
77  * Client can request a change to only one of linemode, editmode or slc's
78  * at a time, and if using kludge linemode, then only linemode may be
79  * affected.
80  */
81 void
82 clientstat(int code, int parm1, int parm2)
83 {
84     /*
85      * Get a copy of terminal characteristics.
86      */
87     init_termbuf();
88 
89     /*
90      * Process request from client. code tells what it is.
91      */
92     switch (code) {
93     case TELOPT_NAWS:
94 #ifdef	TIOCSWINSZ
95 	{
96 	    struct winsize ws;
97 
98 	    def_col = parm1;
99 	    def_row = parm2;
100 
101 	    /*
102 	     * Change window size as requested by client.
103 	     */
104 
105 	    ws.ws_col = parm1;
106 	    ws.ws_row = parm2;
107 	    ioctl(ourpty, TIOCSWINSZ, (char *)&ws);
108 	}
109 #endif	/* TIOCSWINSZ */
110 
111     break;
112 
113     case TELOPT_TSPEED:
114 	{
115 	    def_tspeed = parm1;
116 	    def_rspeed = parm2;
117 	    /*
118 	     * Change terminal speed as requested by client.
119 	     * We set the receive speed first, so that if we can't
120 	     * store seperate receive and transmit speeds, the transmit
121 	     * speed will take precedence.
122 	     */
123 	    tty_rspeed(parm2);
124 	    tty_tspeed(parm1);
125 	    set_termbuf();
126 
127 	    break;
128 
129 	}  /* end of case TELOPT_TSPEED */
130 
131     default:
132 	/* What? */
133 	break;
134     }  /* end of switch */
135 
136     netflush();
137 
138 }
139