root/crypto/heimdal/appl/telnet/telnetd/termstat.c
/*
 * Copyright (c) 1989, 1993
 *      The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by the University of
 *      California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include "telnetd.h"

RCSID("$Id$");

/*
 * local variables
 */
int def_tspeed = -1, def_rspeed = -1;
#ifdef  TIOCSWINSZ
int def_row = 0, def_col = 0;
#endif

/*
 * flowstat
 *
 * Check for changes to flow control
 */
void
flowstat(void)
{
    if (his_state_is_will(TELOPT_LFLOW)) {
        if (tty_flowmode() != flowmode) {
            flowmode = tty_flowmode();
            output_data("%c%c%c%c%c%c",
                        IAC, SB, TELOPT_LFLOW,
                        flowmode ? LFLOW_ON : LFLOW_OFF,
                        IAC, SE);
        }
        if (tty_restartany() != restartany) {
            restartany = tty_restartany();
            output_data("%c%c%c%c%c%c",
                        IAC, SB, TELOPT_LFLOW,
                        restartany ? LFLOW_RESTART_ANY
                        : LFLOW_RESTART_XON,
                        IAC, SE);
        }
    }
}

/*
 * clientstat
 *
 * Process linemode related requests from the client.
 * Client can request a change to only one of linemode, editmode or slc's
 * at a time, and if using kludge linemode, then only linemode may be
 * affected.
 */
void
clientstat(int code, int parm1, int parm2)
{
    /*
     * Get a copy of terminal characteristics.
     */
    init_termbuf();

    /*
     * Process request from client. code tells what it is.
     */
    switch (code) {
    case TELOPT_NAWS:
#ifdef  TIOCSWINSZ
        {
            struct winsize ws;

            def_col = parm1;
            def_row = parm2;

            /*
             * Change window size as requested by client.
             */

            ws.ws_col = parm1;
            ws.ws_row = parm2;
            ioctl(ourpty, TIOCSWINSZ, (char *)&ws);
        }
#endif  /* TIOCSWINSZ */

    break;

    case TELOPT_TSPEED:
        {
            def_tspeed = parm1;
            def_rspeed = parm2;
            /*
             * Change terminal speed as requested by client.
             * We set the receive speed first, so that if we can't
             * store seperate receive and transmit speeds, the transmit
             * speed will take precedence.
             */
            tty_rspeed(parm2);
            tty_tspeed(parm1);
            set_termbuf();

            break;

        }  /* end of case TELOPT_TSPEED */

    default:
        /* What? */
        break;
    }  /* end of switch */

    netflush();

}