sys_bsd.c

来自「Linux下的socks的程序源程序,用于socks的代理服务」· C语言 代码 · 共 1,208 行 · 第 1/2 页

C
1,208
字号
/* * Copyright (c) 1988, 1990 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement:  ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */#ifndef lintstatic char sccsid[] = "@(#)sys_bsd.c	5.2 (Berkeley) 3/1/91";#endif /* not lint *//* * The following routines try to encapsulate what is system dependent * (at least between 4.x and dos) which is used in telnet.c. *//*#if !defined(hpux) && !defined(AIX) && !defined(SVR3) && !defined(ultrix) && !defined(LINUX) && !defined(__bsdi__) && !defined(__osf__) && !defined(__alpha)*/#if defined(SOLARIS) || defined(__NetBSD__)#include <sys/filio.h>#endif#include <fcntl.h>#include <sys/types.h>#include <sys/time.h>#include <sys/socket.h>#include <signal.h>#include <errno.h>#if defined(ISC)#include <net/errno.h>#endif /* #if defined(ISC) */#include <arpa/telnet.h>#include "ring.h"#include "fdset.h"#include "defines.h"#include "externs.h"#include "types.h"#if defined(SCO) || defined(ISC)#include <sys/stream.h>#include <sys/ptem.h>#endif#ifdef _SEQUENT_#define bcmp(b1, b2, n)		memcmp((b1), (b2), (n))#endif#if defined(CRAY) || (defined(USE_TERMIO) && !defined(SYSV_TERMIO)) || defined(SVR3)#define	SIG_FUNC_RET	void#else#define	SIG_FUNC_RET	int#endifint	tout,			/* Output file descriptor */	tin,			/* Input file descriptor */	net;#if defined(SOLARIS) || defined(_SEQUENT_)extern void intp(), sendbrk();#endif#ifndef	USE_TERMIOstruct	tchars otc = { 0 }, ntc = { 0 };struct	ltchars oltc = { 0 }, nltc = { 0 };struct	sgttyb ottyb = { 0 }, nttyb = { 0 };int	olmode = 0;# define cfgetispeed(ptr)	(ptr)->sg_ispeed# define cfgetospeed(ptr)	(ptr)->sg_ospeed# define old_tc ottyb#else	/* USE_TERMIO */# if defined(SOLARIS) || defined(LINUX) || defined(_SEQUENT_)struct	termios old_tc = { 0 };/* extern	struct	termios new_tc; */# else /* SOLARIS not defined */struct	termio old_tc = { 0 };/* extern struct termio new_tc; */# endif /* SOLARIS */# ifndef	TCSANOW#  ifdef TCSETS#   define	TCSANOW		TCSETS#   define	TCSADRAIN	TCSETSW#   define	tcgetattr(f, t) ioctl(f, TCGETS, (char *)t)#  else#   ifdef TCSETA#    define	TCSANOW		TCSETA#    define	TCSADRAIN	TCSETAW#    define	tcgetattr(f, t) ioctl(f, TCGETA, (char *)t)#   else#    define	TCSANOW		TIOCSETA#    define	TCSADRAIN	TIOCSETAW#    define	tcgetattr(f, t) ioctl(f, TIOCGETA, (char *)t)#   endif#  endif#  define	tcsetattr(f, a, t) ioctl(f, a, (char *)t)#  define	cfgetospeed(ptr)	((ptr)->c_cflag&CBAUD)#  ifdef CIBAUD#   define	cfgetispeed(ptr)	(((ptr)->c_cflag&CIBAUD) >> IBSHIFT)#  else#   define	cfgetispeed(ptr)	cfgetospeed(ptr)#  endif# endif /* TCSANOW */#endif	/* USE_TERMIO */static fd_set ibits, obits, xbits;    voidinit_sys(){    tout = fileno(stdout);    tin = fileno(stdin);    FD_ZERO(&ibits);    FD_ZERO(&obits);    FD_ZERO(&xbits);    errno = 0;}    intTerminalWrite(buf, n)    char *buf;    int  n;{    return write(tout, buf, n);}    intTerminalRead(buf, n)    char *buf;    int  n;{    return read(tin, buf, n);}/* * */    intTerminalAutoFlush(){#if	defined(LNOFLSH)    int flush;    ioctl(0, TIOCLGET, (char *)&flush);    return !(flush&LNOFLSH);	/* if LNOFLSH, no autoflush */#else	/* LNOFLSH */    return 1;#endif	/* LNOFLSH */}#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 */    intTerminalSpecialChars(c)    int	c;{#if defined(SOLARIS) || defined(_SEQUENT_)    void xmitAO(), xmitEL(), xmitEC();#else    void xmitAO(), xmitEL(), xmitEC(), intp(), sendbrk();#endif    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;}/* * Flush output to the terminal */     voidTerminalFlushOutput(){#ifdef	TIOCFLUSH    (void) ioctl(fileno(stdout), TIOCFLUSH, (char *) 0);#else    (void) ioctl(fileno(stdout), TCFLSH, (char *) 0);#endif}    voidTerminalSaveState(){#ifndef	USE_TERMIO    ioctl(0, TIOCGETP, (char *)&ottyb);    ioctl(0, TIOCGETC, (char *)&otc);    ioctl(0, TIOCGLTC, (char *)&oltc);    ioctl(0, TIOCLGET, (char *)&olmode);    ntc = otc;    nltc = oltc;    nttyb = ottyb;#else	/* USE_TERMIO */    tcgetattr(0, &old_tc);    new_tc = old_tc;#ifndef	VDISCARD    termFlushChar = CONTROL('O');#endif#ifndef	VWERASE    termWerasChar = CONTROL('W');#endif#ifndef	VREPRINT    termRprntChar = CONTROL('R');#endif#ifndef	VLNEXT    termLiteralNextChar = CONTROL('V');#endif#ifndef	VSTART    termStartChar = CONTROL('Q');#endif#ifndef	VSTOP    termStopChar = CONTROL('S');#endif#ifndef	VSTATUS    termAytChar = CONTROL('T');#endif#endif	/* USE_TERMIO */}    cc_t *tcval(func)    register 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);#ifdef	USE_TERMIO    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#endif    case SLC_SYNCH:    case SLC_BRK:    case SLC_EOR:    default:	return((cc_t *)0);    }}    voidTerminalDefaultChars(){#ifndef	USE_TERMIO    ntc = otc;    nltc = oltc;    nttyb.sg_kill = ottyb.sg_kill;    nttyb.sg_erase = ottyb.sg_erase;#else	/* USE_TERMIO */    memcpy(new_tc.c_cc, old_tc.c_cc, sizeof(old_tc.c_cc));# ifndef	VDISCARD    termFlushChar = CONTROL('O');# endif# ifndef	VWERASE    termWerasChar = CONTROL('W');# endif# ifndef	VREPRINT    termRprntChar = CONTROL('R');# endif# ifndef	VLNEXT    termLiteralNextChar = CONTROL('V');# endif# ifndef	VSTART    termStartChar = CONTROL('Q');# endif# ifndef	VSTOP    termStopChar = CONTROL('S');# endif# ifndef	VSTATUS    termAytChar = CONTROL('T');# endif#endif	/* USE_TERMIO */}#ifdef notdefvoidTerminalRestoreState(){}#endif/* * TerminalNewMode - set up terminal to a specific mode. *	MODE_ECHO: do local terminal echo *	MODE_FLOW: do local flow control *	MODE_TRAPSIG: do local mapping to TELNET IAC sequences *	MODE_EDIT: do local line editing * *	Command mode: *		MODE_ECHO|MODE_EDIT|MODE_FLOW|MODE_TRAPSIG *		local echo *		local editing *		local xon/xoff *		local signal mapping * *	Linemode: *		local/no editing *	Both Linemode and Single Character mode: *		local/remote echo *		local/no xon/xoff *		local/no signal mapping */    voidTerminalNewMode(f)    register int f;{    static int prevmode = 0;#ifndef	USE_TERMIO    struct tchars tc;    struct ltchars ltc;    struct sgttyb sb;    int lmode;#else	/* USE_TERMIO */# if defined(SOLARIS) || defined(LINUX) || defined(_SEQUENT_)    struct termios tmp_tc;# else    struct termio tmp_tc;# endif /* SOLARIS */#endif	/* USE_TERMIO */    int onoff;    int old;    cc_t esc;    globalmode = f&~MODE_FORCE;    if (prevmode == f)	return;    /*     * Write any outstanding data before switching modes     * ttyflush() returns 0 only when there is no more data     * left to write out, it returns -1 if it couldn't do     * anything at all, otherwise it returns 1 + the number     * of characters left to write.#ifndef	USE_TERMIO     * We would really like ask the kernel to wait for the output     * to drain, like we can do with the TCSADRAIN, but we don't have     * that option.  The only ioctl that waits for the output to     * drain, TIOCSETP, also flushes the input queue, which is NOT     * what we want (TIOCSETP is like TCSADFLUSH).#endif     */    old = ttyflush(SYNCHing|flushout);    if (old < 0 || old > 1) {#ifdef	USE_TERMIO	tcgetattr(tin, &tmp_tc);#endif	/* USE_TERMIO */	do {	    /*	     * Wait for data to drain, then flush again.	     */#ifdef	USE_TERMIO	    tcsetattr(tin, TCSADRAIN, &tmp_tc);#endif	/* USE_TERMIO */	    old = ttyflush(SYNCHing|flushout);	} while (old < 0 || old > 1);    }    old = prevmode;    prevmode = f&~MODE_FORCE;#ifndef	USE_TERMIO    sb = nttyb;    tc = ntc;    ltc = nltc;    lmode = olmode;#else    tmp_tc = new_tc;#endif    if (f&MODE_ECHO) {#ifndef	USE_TERMIO	sb.sg_flags |= ECHO;#else	tmp_tc.c_lflag |= ECHO;	tmp_tc.c_oflag |= ONLCR;	if (crlf)		tmp_tc.c_iflag |= ICRNL;#endif    } else {#ifndef	USE_TERMIO	sb.sg_flags &= ~ECHO;#else	tmp_tc.c_lflag &= ~ECHO;	tmp_tc.c_oflag &= ~ONLCR;# if defined(notdef) || defined(LINUX) || defined(_SEQUENT_)	if (crlf)		tmp_tc.c_iflag &= ~ICRNL;# endif#endif    }    if ((f&MODE_FLOW) == 0) {#ifndef	USE_TERMIO	tc.t_startc = _POSIX_VDISABLE;	tc.t_stopc = _POSIX_VDISABLE;#else	tmp_tc.c_iflag &= ~(IXANY|IXOFF|IXON);    } else {	tmp_tc.c_iflag |= IXANY|IXOFF|IXON;#endif    }    if ((f&MODE_TRAPSIG) == 0) {#ifndef	USE_TERMIO	tc.t_intrc = _POSIX_VDISABLE;	tc.t_quitc = _POSIX_VDISABLE;	tc.t_eofc = _POSIX_VDISABLE;	ltc.t_suspc = _POSIX_VDISABLE;	ltc.t_dsuspc = _POSIX_VDISABLE;#else	tmp_tc.c_lflag &= ~ISIG;#endif	localchars = 0;    } else {#ifdef	USE_TERMIO	tmp_tc.c_lflag |= ISIG;#endif	localchars = 1;    }    if (f&MODE_EDIT) {#ifndef	USE_TERMIO	sb.sg_flags &= ~CBREAK;	sb.sg_flags |= CRMOD;#else	tmp_tc.c_lflag |= ICANON;#endif    } else {#ifndef	USE_TERMIO	sb.sg_flags |= CBREAK;	if (f&MODE_ECHO)	    sb.sg_flags |= CRMOD;	else	    sb.sg_flags &= ~CRMOD;#else	tmp_tc.c_lflag &= ~ICANON;	tmp_tc.c_iflag &= ~ICRNL;	tmp_tc.c_cc[VMIN] = 1;	tmp_tc.c_cc[VTIME] = 0;#endif    }    if ((f&(MODE_EDIT|MODE_TRAPSIG)) == 0) {#ifndef	USE_TERMIO	ltc.t_lnextc = _POSIX_VDISABLE;#else# ifdef VLNEXT	tmp_tc.c_cc[VLNEXT] = (cc_t)(_POSIX_VDISABLE);# endif#endif    }    if (f&MODE_SOFT_TAB) {#ifndef USE_TERMIO	sb.sg_flags |= XTABS;#else# ifdef	OXTABS	tmp_tc.c_oflag |= OXTABS;# endif# ifdef	TABDLY	tmp_tc.c_oflag &= ~TABDLY;	tmp_tc.c_oflag |= TAB3;# endif#endif    } else {#ifndef USE_TERMIO	sb.sg_flags &= ~XTABS;#else# ifdef	OXTABS	tmp_tc.c_oflag &= ~OXTABS;# endif# ifdef	TABDLY	tmp_tc.c_oflag &= ~TABDLY;# endif#endif    }    if (f&MODE_LIT_ECHO) {#ifndef USE_TERMIO	lmode &= ~LCTLECH;#else# ifdef	ECHOCTL	tmp_tc.c_lflag &= ~ECHOCTL;# endif#endif    } else {#ifndef USE_TERMIO	lmode |= LCTLECH;#else# ifdef	ECHOCTL	tmp_tc.c_lflag |= ECHOCTL;# endif#endif    }    if (f == -1) {	onoff = 0;    } else {#ifndef	USE_TERMIO	if (f & MODE_OUTBIN)		lmode |= LLITOUT;	else		lmode &= ~LLITOUT;	if (f & MODE_INBIN)		lmode |= LPASS8;	else		lmode &= ~LPASS8;#else	if (f & MODE_INBIN)		tmp_tc.c_iflag &= ~ISTRIP;	else		tmp_tc.c_iflag |= ISTRIP;

⌨️ 快捷键说明

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