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

📄 sys_bsd.cc

📁 这是关于远程登陆TELNET 的源代码 已经测试过的。
💻 CC
字号:
/* * Copyright (c) 1988, 1990 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: @(#)sys_bsd.c	5.2 (Berkeley) 3/1/91 */char bsd_rcsid[] =   "$Id: sys_bsd.cc,v 1.24 1999/09/28 16:29:24 dholland Exp $";/* * The following routines try to encapsulate what is system dependent * (at least between 4.x and dos) which is used in telnet.c. */#include <fcntl.h>#include <sys/types.h>#include <sys/time.h>#include <sys/socket.h>#include <signal.h>#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <sys/ioctl.h>#include <arpa/telnet.h>#include "ring.h"#include "defines.h"#include "externs.h"#include "types.h"#include "proto.h"#include "netlink.h"#include "terminal.h"static fd_set ibits, obits, xbits;void init_sys(void){    tlink_init();    FD_ZERO(&ibits);    FD_ZERO(&obits);    FD_ZERO(&xbits);    errno = 0;}#ifdef	KLUDGELINEMODEextern int kludgelinemode;#endif/* * TerminalSpecialChars() * * Look at an input character to see if it is a special character * and decide what to do. * * Output: * *	0	Don't add this character. *	1	Do add this character */void intp(), sendbrk(), sendabort();intTerminalSpecialChars(int c){    void xmitAO(), xmitEL(), xmitEC();    if (c == termIntChar) {	intp();	return 0;    } else if (c == termQuitChar) {#ifdef	KLUDGELINEMODE	if (kludgelinemode)	    sendbrk();	else#endif	    sendabort();	return 0;    } else if (c == termEofChar) {	if (my_want_state_is_will(TELOPT_LINEMODE)) {	    sendeof();	    return 0;	}	return 1;    } else if (c == termSuspChar) {	sendsusp();	return(0);    } else if (c == termFlushChar) {	xmitAO();		/* Transmit Abort Output */	return 0;    } else if (!MODE_LOCAL_CHARS(globalmode)) {	if (c == termKillChar) {	    xmitEL();	    return 0;	} else if (c == termEraseChar) {	    xmitEC();		/* Transmit Erase Character */	    return 0;	}    }    return 1;}cc_t *tcval(int func) {    switch(func) {    case SLC_IP:	return(&termIntChar);    case SLC_ABORT:	return(&termQuitChar);    case SLC_EOF:	return(&termEofChar);    case SLC_EC:	return(&termEraseChar);    case SLC_EL:	return(&termKillChar);    case SLC_XON:	return(&termStartChar);    case SLC_XOFF:	return(&termStopChar);    case SLC_FORW1:	return(&termForw1Char);    case SLC_FORW2:	return(&termForw2Char);#ifdef	VDISCARD    case SLC_AO:	return(&termFlushChar);#endif#ifdef	VSUSP    case SLC_SUSP:	return(&termSuspChar);#endif#ifdef	VWERASE    case SLC_EW:	return(&termWerasChar);#endif#ifdef	VREPRINT    case SLC_RP:	return(&termRprntChar);#endif#ifdef	VLNEXT    case SLC_LNEXT:	return(&termLiteralNextChar);#endif#ifdef	VSTATUS    case SLC_AYT:	return(&termAytChar);#endif    case SLC_SYNCH:    case SLC_BRK:    case SLC_EOR:    default:	return NULL;    }}#if defined(TN3270)void NetSigIO(int fd, int onoff) {    ioctl(fd, FIOASYNC, (char *)&onoff);	/* hear about input */}void NetSetPgrp(int fd) {    int myPid;    myPid = getpid();    fcntl(fd, F_SETOWN, myPid);}#endif	/*defined(TN3270)*//* * Various signal handling routines. */static void deadpeer(int /*sig*/) {    setcommandmode();    siglongjmp(peerdied, -1);}static void intr(int /*sig*/) {    if (localchars) {	intp();    }    else {        setcommandmode();	siglongjmp(toplevel, -1);    }}static void intr2(int /*sig*/) {    if (localchars) {#ifdef	KLUDGELINEMODE	if (kludgelinemode)	    sendbrk();	else#endif	    sendabort();	return;    }}#ifdef	SIGWINCHstatic void sendwin(int /*sig*/) {    if (connected) {	sendnaws();    }}#endif#ifdef	SIGINFOvoid ayt(int sig) {    (void)sig;    if (connected)	sendayt();    else	ayt_status(0);}#endifvoid sys_telnet_init(void) {    signal(SIGINT, intr);    signal(SIGQUIT, intr2);    signal(SIGPIPE, deadpeer);#ifdef	SIGWINCH    signal(SIGWINCH, sendwin);#endif#ifdef	SIGINFO    signal(SIGINFO, ayt);#endif    setconnmode(0);    nlink.nonblock(1);#if defined(TN3270)    if (noasynchnet == 0) {			/* DBX can't handle! */	NetSigIO(net, 1);	NetSetPgrp(net);    }#endif	/* defined(TN3270) */    nlink.oobinline();}/* * Process rings - * *	This routine tries to fill up/empty our various rings. * *	The parameter specifies whether this is a poll operation, *	or a block-until-something-happens operation. * *	The return value is 1 if something happened, 0 if not. */int process_rings(int netin, int netout, int netex, int ttyin, int ttyout, 		  int poll /* If 0, then block until something to do */){    register int c, maxfd;		/* One wants to be a bit careful about setting returnValue		 * to one, since a one implies we did some useful work,		 * and therefore probably won't be called to block next		 * time (TN3270 mode only).		 */    int returnValue = 0;    static struct timeval TimeValue = { 0, 0 };        int net = nlink.getfd();    int tin = tlink_getifd();    int tout = tlink_getofd();    if (netout) {	FD_SET(net, &obits);    }     if (ttyout) {	FD_SET(tout, &obits);    }    if (ttyin) {	FD_SET(tin, &ibits);    }    if (netin) {	FD_SET(net, &ibits);    }    if (netex) {	FD_SET(net, &xbits);    }    maxfd = net;    if (maxfd < tin) maxfd=tin;    if (maxfd < tout) maxfd=tout;    if ((c = select(maxfd+1, &ibits, &obits, &xbits,			(poll == 0)? (struct timeval *)0 : &TimeValue)) < 0) {	if (c == -1) {		    /*		     * we can get EINTR if we are in line mode,		     * and the user does an escape (TSTP), or		     * some other signal generator.		     */	    if (errno == EINTR) {		return 0;	    }#if defined(TN3270)		    /*		     * we can get EBADF if we were in transparent		     * mode, and the transcom process died.		    */	    if (errno == EBADF) {			/*			 * zero the bits (even though kernel does it)			 * to make sure we are selecting on the right			 * ones.			*/		FD_ZERO(&ibits);		FD_ZERO(&obits);		FD_ZERO(&xbits);		return 0;	    }#endif /* TN3270 */		    /* I don't like this, does it ever happen? */	    printf("sleep(5) from telnet, after select\r\n");	    sleep(5);	}	return 0;    }    /*     * Any urgent data?     */    if (FD_ISSET(net, &xbits)) {	FD_CLR(net, &xbits);	SYNCHing = 1;	(void) ttyflush(1);	/* flush already enqueued data */    }    /*     * Should flush output buffers first to make room for new input. --okir     */    if (FD_ISSET(net, &obits)) {	FD_CLR(net, &obits);	returnValue |= netflush();    }    if (FD_ISSET(tout, &obits)) {	FD_CLR(tout, &obits);	returnValue |= (ttyflush(SYNCHing|flushout) > 0);    }    /*     * Something to read from the network...     */    if (FD_ISSET(net, &ibits)) {	/* hacks for systems without SO_OOBINLINE removed */	FD_CLR(net, &ibits);	/* Only call network input routine if there is room. Otherwise	 * we will try a 0 byte read, which we happily interpret as the	 * server having dropped the connection...	 * NB the input routine reserves 1 byte for ungetc.	 *                              12.3.97 --okir */	returnValue = 1;	if (netiring.empty_count() > 1) {		c = netiring.read_source();		if (c <= 0)		    return -1;		else if (c == 0)		    returnValue = 0;	}    }    /*     * Something to read from the tty...     */    if (FD_ISSET(tin, &ibits)) {	FD_CLR(tin, &ibits);	c = ttyiring.read_source();	if (c < 0) {	    return -1;	}	else if (c==0) returnValue = 0;	else returnValue = 1;		/* did something useful */    }    return returnValue;}

⌨️ 快捷键说明

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