⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 termstat.c

📁 这是关于远程登陆TELNET 的源代码 已经测试过的。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1989 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. *//* * From: @(#)termstat.c	5.10 (Berkeley) 3/22/91 */char termstat_rcsid[] =   "$Id: termstat.c,v 1.6 1999/12/12 14:59:45 dholland Exp $";#include "telnetd.h"/* * local variables */int def_tspeed = -1, def_rspeed = -1;#ifdef	TIOCSWINSZint def_row = 0, def_col = 0;#endif#ifdef	LINEMODEstatic int _terminit = 0;#endif	/* LINEMODE */#ifdef	LINEMODE/* * localstat * * This function handles all management of linemode. * * Linemode allows the client to do the local editing of data * and send only complete lines to the server.  Linemode state is * based on the state of the pty driver.  If the pty is set for * external processing, then we can use linemode.  Further, if we * can use real linemode, then we can look at the edit control bits * in the pty to determine what editing the client should do. * * Linemode support uses the following state flags to keep track of * current and desired linemode state. *	alwayslinemode : true if -l was specified on the telnetd * 	command line.  It means to have linemode on as much as *	possible. * * 	lmodetype: signifies whether the client can *	handle real linemode, or if use of kludgeomatic linemode *	is preferred.  It will be set to one of the following: *		REAL_LINEMODE : use linemode option *		KLUDGE_LINEMODE : use kludge linemode *		NO_LINEMODE : client is ignorant of linemode * *	linemode, uselinemode : linemode is true if linemode *	is currently on, uselinemode is the state that we wish *	to be in.  If another function wishes to turn linemode *	on or off, it sets or clears uselinemode. * *	editmode, useeditmode : like linemode/uselinemode, but *	these contain the edit mode states (edit and trapsig). * * The state variables correspond to some of the state information * in the pty. *	linemode: *		In real linemode, this corresponds to whether the pty *		expects external processing of incoming data. *		In kludge linemode, this more closely corresponds to the *		whether normal processing is on or not.  (ICANON in *		system V, or COOKED mode in BSD.) *		If the -l option was specified (alwayslinemode), then *		an attempt is made to force external processing on at *		all times. * * The following heuristics are applied to determine linemode * handling within the server. *	1) Early on in starting up the server, an attempt is made *	   to negotiate the linemode option.  If this succeeds *	   then lmodetype is set to REAL_LINEMODE and all linemode *	   processing occurs in the context of the linemode option. *	2) If the attempt to negotiate the linemode option failed, *	   then we try to use kludge linemode.  We test for this *	   capability by sending "do Timing Mark".  If a positive *	   response comes back, then we assume that the client *	   understands kludge linemode (ech!) and the *	   lmodetype flag is set to KLUDGE_LINEMODE. *	3) Otherwise, linemode is not supported at all and *	   lmodetype remains set to NO_LINEMODE (which happens *	   to be 0 for convenience). *	4) At any time a command arrives that implies a higher *	   state of linemode support in the client, we move to that *	   linemode support. * * A short explanation of kludge linemode is in order here. *	1) The heuristic to determine support for kludge linemode *	   is to send a do timing mark.  We assume that a client *	   that supports timing marks also supports kludge linemode. *	   A risky proposition at best. *	2) Further negotiation of linemode is done by changing the *	   the server's state regarding SGA.  If server will SGA, *	   then linemode is off, if server won't SGA, then linemode *	   is on. */	voidlocalstat(){	void netflush();	int need_will_echo = 0;	/*	 * Check for state of BINARY options.	 */	if (tty_isbinaryin()) {		if (his_want_state_is_wont(TELOPT_BINARY))			send_do(TELOPT_BINARY, 1);	} else {		if (his_want_state_is_will(TELOPT_BINARY))			send_dont(TELOPT_BINARY, 1);	}	if (tty_isbinaryout()) {		if (my_want_state_is_wont(TELOPT_BINARY))			send_will(TELOPT_BINARY, 1);	} else {		if (my_want_state_is_will(TELOPT_BINARY))			send_wont(TELOPT_BINARY, 1);	}	/*	 * Check for changes to flow control if client supports it.	 */	if (his_state_is_will(TELOPT_LFLOW)) {		if (tty_flowmode() != flowmode) {			flowmode = tty_flowmode();			(void) netoprintf("%c%c%c%c%c%c", IAC, SB,					  TELOPT_LFLOW, flowmode, IAC, SE);		}	}	/*	 * Check linemode on/off state	 */	uselinemode = tty_linemode();	/*	 * If alwayslinemode is on, and pty is changing to turn it off, then	 * force linemode back on.	 */	if (alwayslinemode && linemode && !uselinemode) {		uselinemode = 1;		tty_setlinemode(uselinemode);	}#if	defined(ENCRYPT)	/*	 * If the terminal is not echoing, but editing is enabled,	 * something like password input is going to happen, so	 * if we the other side is not currently sending encrypted	 * data, ask the other side to start encrypting.	 */	if (his_state_is_will(TELOPT_ENCRYPT)) {		static int enc_passwd = 0;		if (uselinemode && !tty_isecho() && tty_isediting()		    && (enc_passwd == 0) && !decrypt_input) {			encrypt_send_request_start();			enc_passwd = 1;		} else if (enc_passwd) {			encrypt_send_request_end();			enc_passwd = 0;		}	}#endif	/*	 * Do echo mode handling as soon as we know what the	 * linemode is going to be.	 * If the pty has echo turned off, then tell the client that	 * the server will echo.  If echo is on, then the server	 * will echo if in character mode, but in linemode the	 * client should do local echoing.  The state machine will	 * not send anything if it is unnecessary, so don't worry	 * about that here.	 *	 * If we need to send the WILL ECHO (because echo is off),	 * then delay that until after we have changed the MODE.	 * This way, when the user is turning off both editing	 * and echo, the client will get editing turned off first.	 * This keeps the client from going into encryption mode	 * and then right back out if it is doing auto-encryption	 * when passwords are being typed.	 */	if (uselinemode) {		if (tty_isecho())			send_wont(TELOPT_ECHO, 1);		else			need_will_echo = 1;	}	/*	 * If linemode is being turned off, send appropriate	 * command and then we're all done.	 */	 if (!uselinemode && linemode) {# ifdef	KLUDGELINEMODE		if (lmodetype == REAL_LINEMODE) {# endif	/* KLUDGELINEMODE */			send_dont(TELOPT_LINEMODE, 1);# ifdef	KLUDGELINEMODE		} else if (lmodetype == KLUDGE_LINEMODE)			send_will(TELOPT_SGA, 1);# endif	/* KLUDGELINEMODE */		send_will(TELOPT_ECHO, 1);		linemode = uselinemode;		goto done;	}# ifdef	KLUDGELINEMODE	/*	 * If using real linemode check edit modes for possible later use.	 * If we are in kludge linemode, do the SGA negotiation.	 */	if (lmodetype == REAL_LINEMODE) {# endif	/* KLUDGELINEMODE */		useeditmode = 0;		if (tty_isediting())			useeditmode |= MODE_EDIT;		if (tty_istrapsig())			useeditmode |= MODE_TRAPSIG;		if (tty_issofttab())			useeditmode |= MODE_SOFT_TAB;		if (tty_islitecho())			useeditmode |= MODE_LIT_ECHO;# ifdef	KLUDGELINEMODE	} else if (lmodetype == KLUDGE_LINEMODE) {		if (tty_isediting() && uselinemode)			send_wont(TELOPT_SGA, 1);		else			send_will(TELOPT_SGA, 1);	}# endif	/* KLUDGELINEMODE */	/*	 * Negotiate linemode on if pty state has changed to turn it on.	 * Send appropriate command and send along edit mode, then all done.	 */	if (uselinemode && !linemode) {# ifdef	KLUDGELINEMODE		if (lmodetype == KLUDGE_LINEMODE) {			send_wont(TELOPT_SGA, 1);		} else if (lmodetype == REAL_LINEMODE) {# endif	/* KLUDGELINEMODE */			send_do(TELOPT_LINEMODE, 1);			/* send along edit modes */			(void) netoprintf("%c%c%c%c%c%c%c", IAC, SB,				TELOPT_LINEMODE, LM_MODE, useeditmode,				IAC, SE);			editmode = useeditmode;# ifdef	KLUDGELINEMODE		}# endif	/* KLUDGELINEMODE */		linemode = uselinemode;		goto done;	}# ifdef	KLUDGELINEMODE	/*	 * None of what follows is of any value if not using	 * real linemode.	 */	if (lmodetype < REAL_LINEMODE)		goto done;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -