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

📄 telnet.c

📁 经典的unix下telnet的c代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	char *name, **as, **ae;{	char **ap;	int n;	n = strlen(name) + 1;	for (ap = as; ap < ae; ap++)		if (strncasecmp(*ap, name, n) == 0)			return(0);	return (1);}int resettermname = 1;	char *gettermname(){	char *tname;	static char **tnamep = 0;	static char **next;	int errret;	if (resettermname) {		resettermname = 0;		if (tnamep && tnamep != unknown)			free(tnamep);		if ((tname = (char *)env_getvalue((unsigned char *)"TERM")) &&				(setupterm(tname, 1, &errret) == OK)) {			tnamep = mklist(ttytype, tname);		} else {			if (tname && ((int)strlen(tname) <= 40)) {				unknown[0] = tname;				upcase(tname);			} else				unknown[0] = name_unknown;			tnamep = unknown;		}		next = tnamep;	}	if (*next == 0)		next = tnamep;	return(*next++);}/* * suboption() * *	Look at the sub-option buffer, and try to be helpful to the other * side. * *	Currently we recognize: * *		Terminal type, send request. *		Terminal speed (send request). *		Local flow control (is request). *		Linemode */    static voidsuboption(){    unsigned char subchar;    printsub('<', subbuffer, SB_LEN()+2);    switch (subchar = SB_GET()) {    case TELOPT_TTYPE:	if (my_want_state_is_wont(TELOPT_TTYPE))	    return;	if (SB_EOF() || SB_GET() != TELQUAL_SEND) {	    return;	} else {	    char *name;	    unsigned char temp[50];	    int len;#if	defined(TN3270)	    if (tn3270_ttype()) {		return;	    }#endif	/* defined(TN3270) */	    name = gettermname();	    len = strlen(name) + 4 + 2;	    if (len < NETROOM()) {		snprintf((char *)temp, sizeof(temp), 			 "%c%c%c%c%s%c%c", IAC, SB, TELOPT_TTYPE,			 TELQUAL_IS, name, IAC, SE);		ring_supply_data(&netoring, temp, len);		printsub('>', &temp[2], len-2);	    } else {		ExitString("No room in buffer for terminal type.\n", 1);		/*NOTREACHED*/	    }	}	break;    case TELOPT_TSPEED:	if (my_want_state_is_wont(TELOPT_TSPEED))	    return;	if (SB_EOF())	    return;	if (SB_GET() == TELQUAL_SEND) {	    long ospeed, ispeed;	    unsigned char temp[50];	    int len;	    TerminalSpeeds(&ispeed, &ospeed);	    snprintf((char *)temp, sizeof(temp), 		     "%c%c%c%c%ld,%ld%c%c", IAC, SB, TELOPT_TSPEED,		     TELQUAL_IS, ospeed, ispeed, IAC, SE);	    len = strlen((char *)temp+4) + 4;	/* temp[3] is 0 ... */	    if (len < NETROOM()) {		ring_supply_data(&netoring, temp, len);		printsub('>', temp+2, len - 2);	    }/*@*/	    else printf("lm_will: not enough room in buffer\n");	}	break;    case TELOPT_LFLOW:	if (my_want_state_is_wont(TELOPT_LFLOW))	    return;	if (SB_EOF())	    return;	switch(SB_GET()) {	case LFLOW_RESTART_ANY:	    restartany = 1;	    break;	case LFLOW_RESTART_XON:	    restartany = 0;	    break;	case LFLOW_ON:	    localflow = 1;	    break;	case LFLOW_OFF:	    localflow = 0;	    break;	default:	    return;	}	setcommandmode();	setconnmode(0);	break;    case TELOPT_LINEMODE:	if (my_want_state_is_wont(TELOPT_LINEMODE))	    return;	if (SB_EOF())	    return;	switch (SB_GET()) {	case WILL:	    lm_will(subpointer, SB_LEN());	    break;	case WONT:	    lm_wont(subpointer, SB_LEN());	    break;	case DO:	    lm_do(subpointer, SB_LEN());	    break;	case DONT:	    lm_dont(subpointer, SB_LEN());	    break;	case LM_SLC:	    slc(subpointer, SB_LEN());	    break;	case LM_MODE:	    lm_mode(subpointer, SB_LEN(), 0);	    break;	default:	    break;	}	break;#ifdef	OLD_ENVIRON    case TELOPT_OLD_ENVIRON:#endif    case TELOPT_NEW_ENVIRON:	if (SB_EOF())	    return;	switch(SB_PEEK()) {	case TELQUAL_IS:	case TELQUAL_INFO:	    if (my_want_state_is_dont(subchar))		return;	    break;	case TELQUAL_SEND:	    if (my_want_state_is_wont(subchar)) {		return;	    }	    break;	default:	    return;	}	env_opt(subpointer, SB_LEN());	break;    case TELOPT_XDISPLOC:	if (my_want_state_is_wont(TELOPT_XDISPLOC))	    return;	if (SB_EOF())	    return;	if (SB_GET() == TELQUAL_SEND) {	    unsigned char temp[50], *dp;	    int len;	    if ((dp = env_getvalue((unsigned char *)"DISPLAY")) == NULL) {		/*		 * Something happened, we no longer have a DISPLAY		 * variable.  So, turn off the option.		 */		send_wont(TELOPT_XDISPLOC, 1);		break;	    }	    snprintf((char *)temp, sizeof(temp),		    "%c%c%c%c%s%c%c", IAC, SB, TELOPT_XDISPLOC,		    TELQUAL_IS, dp, IAC, SE);	    len = strlen((char *)temp+4) + 4;	/* temp[3] is 0 ... */	    if (len < NETROOM()) {		ring_supply_data(&netoring, temp, len);		printsub('>', temp+2, len - 2);	    }/*@*/	    else printf("lm_will: not enough room in buffer\n");	}	break;#if	defined(AUTHENTICATION)	case TELOPT_AUTHENTICATION: {		if (!autologin)			break;		if (SB_EOF())			return;		switch(SB_GET()) {		case TELQUAL_IS:			if (my_want_state_is_dont(TELOPT_AUTHENTICATION))				return;			auth_is(subpointer, SB_LEN());			break;		case TELQUAL_SEND:			if (my_want_state_is_wont(TELOPT_AUTHENTICATION))				return;			auth_send(subpointer, SB_LEN());			break;		case TELQUAL_REPLY:			if (my_want_state_is_wont(TELOPT_AUTHENTICATION))				return;			auth_reply(subpointer, SB_LEN());			break;		case TELQUAL_NAME:			if (my_want_state_is_dont(TELOPT_AUTHENTICATION))				return;			auth_name(subpointer, SB_LEN());			break;		}	}	break;#endif#if    defined(ENCRYPTION)	case TELOPT_ENCRYPT:		if (SB_EOF())			return;		switch(SB_GET()) {		case ENCRYPT_START:			if (my_want_state_is_dont(TELOPT_ENCRYPT))				return;			encrypt_start(subpointer, SB_LEN());			break;               case ENCRYPT_END:			if (my_want_state_is_dont(TELOPT_ENCRYPT))				return;			encrypt_end();			break;               case ENCRYPT_SUPPORT:                        if (my_want_state_is_wont(TELOPT_ENCRYPT))                                return;			encrypt_support(subpointer, SB_LEN());			break;               case ENCRYPT_REQSTART:                        if (my_want_state_is_wont(TELOPT_ENCRYPT))			        return;			encrypt_request_start(subpointer, SB_LEN());			break;               case ENCRYPT_REQEND:                        if (my_want_state_is_wont(TELOPT_ENCRYPT))                                return;			/*			 * We can always send an REQEND so that we cannot			 * get stuck encrypting.  We should only get this			 * if we have been able to get in the correct mode			 * anyhow.			 */			encrypt_request_end();			break;               case ENCRYPT_IS:                        if (my_want_state_is_dont(TELOPT_ENCRYPT))                                return;			encrypt_is(subpointer, SB_LEN());			break;               case ENCRYPT_REPLY:		        if (my_want_state_is_wont(TELOPT_ENCRYPT))                                return;			encrypt_reply(subpointer, SB_LEN());			break;               case ENCRYPT_ENC_KEYID:                        if (my_want_state_is_dont(TELOPT_ENCRYPT))                                return;                        encrypt_enc_keyid(subpointer, SB_LEN());                        break;               case ENCRYPT_DEC_KEYID:                        if (my_want_state_is_wont(TELOPT_ENCRYPT))                                return;                        encrypt_dec_keyid(subpointer, SB_LEN());                        break;               default:                        break;               }               break;#endif    default:	break;    }}static unsigned char str_lm[] = { IAC, SB, TELOPT_LINEMODE, 0, 0, IAC, SE };    voidlm_will(cmd, len)    unsigned char *cmd;    int len;{    if (len < 1) {/*@*/	printf("lm_will: no command!!!\n");	/* Should not happen... */	return;    }    switch(cmd[0]) {    case LM_FORWARDMASK:	/* We shouldn't ever get this... */    default:	str_lm[3] = DONT;	str_lm[4] = cmd[0];	if (NETROOM() > sizeof(str_lm)) {	    ring_supply_data(&netoring, str_lm, sizeof(str_lm));	    printsub('>', &str_lm[2], sizeof(str_lm)-2);	}/*@*/	else printf("lm_will: not enough room in buffer\n");	break;    }}    voidlm_wont(cmd, len)    unsigned char *cmd;    int len;{    if (len < 1) {/*@*/	printf("lm_wont: no command!!!\n");	/* Should not happen... */	return;    }    switch(cmd[0]) {    case LM_FORWARDMASK:	/* We shouldn't ever get this... */    default:	/* We are always DONT, so don't respond */	return;    }}    voidlm_do(cmd, len)    unsigned char *cmd;    int len;{    if (len < 1) {/*@*/	printf("lm_do: no command!!!\n");	/* Should not happen... */	return;    }    switch(cmd[0]) {    case LM_FORWARDMASK:    default:	str_lm[3] = WONT;	str_lm[4] = cmd[0];	if (NETROOM() > sizeof(str_lm)) {	    ring_supply_data(&netoring, str_lm, sizeof(str_lm));	    printsub('>', &str_lm[2], sizeof(str_lm)-2);	}/*@*/	else printf("lm_do: not enough room in buffer\n");	break;    }}    voidlm_dont(cmd, len)    unsigned char *cmd;    int len;{    if (len < 1) {/*@*/	printf("lm_dont: no command!!!\n");	/* Should not happen... */	return;    }    switch(cmd[0]) {    case LM_FORWARDMASK:    default:	/* we are always WONT, so don't respond */	break;    }}static unsigned char str_lm_mode[] = {	IAC, SB, TELOPT_LINEMODE, LM_MODE, 0, IAC, SE};	voidlm_mode(cmd, len, init)	unsigned char *cmd;	int len, init;{	if (len != 1)		return;	if ((linemode&MODE_MASK&~MODE_ACK) == *cmd)		return;	if (*cmd&MODE_ACK)		return;	linemode = *cmd&(MODE_MASK&~MODE_ACK);	str_lm_mode[4] = linemode;	if (!init)	    str_lm_mode[4] |= MODE_ACK;	if (NETROOM() > sizeof(str_lm_mode)) {	    ring_supply_data(&netoring, str_lm_mode, sizeof(str_lm_mode));	    printsub('>', &str_lm_mode[2], sizeof(str_lm_mode)-2);	}/*@*/	else printf("lm_mode: not enough room in buffer\n");	setconnmode(0);	/* set changed mode */}/* * slc() * Handle special character suboption of LINEMODE. */struct spc {	cc_t val;	cc_t *valp;	char flags;	/* Current flags & level */	char mylevel;	/* Maximum level & flags */} spc_data[NSLC+1];#define SLC_IMPORT	0#define	SLC_EXPORT	1#define SLC_RVALUE	2static int slc_mode = SLC_EXPORT;	voidslc_init(){	struct spc *spcp;	localchars = 1;	for (spcp = spc_data; spcp < &spc_data[NSLC+1]; spcp++) {		spcp->val = 0;		spcp->valp = 0;		spcp->flags = spcp->mylevel = SLC_NOSUPPORT;	}#define	initfunc(func, flags) { \					spcp = &spc_data[func]; \					if ((spcp->valp = tcval(func))) { \					    spcp->val = *spcp->valp; \					    spcp->mylevel = SLC_VARIABLE|flags; \					} else { \					    spcp->val = 0; \					    spcp->mylevel = SLC_DEFAULT; \					} \				    }	initfunc(SLC_SYNCH, 0);	/* No BRK */	initfunc(SLC_AO, 0);	initfunc(SLC_AYT, 0);	/* No EOR */	initfunc(SLC_ABORT, SLC_FLUSHIN|SLC_FLUSHOUT);	initfunc(SLC_EOF, 0);#ifndef	SYSV_TERMIO	initfunc(SLC_SUSP, SLC_FLUSHIN);#endif	initfunc(SLC_EC, 0);	initfunc(SLC_EL, 0);#ifndef	SYSV_TERMIO	initfunc(SLC_EW, 0);	initfunc(SLC_RP, 0);	initfunc(SLC_LNEXT, 0);#endif	initfunc(SLC_XON, 0);	initfunc(SLC_XOFF, 0);#ifdef	SYSV_TERMIO	spc_data[SLC_XON].mylevel = SLC_CANTCHANGE;	spc_data[SLC_XOFF].mylevel = SLC_CANTCHANGE;#endif	initfunc(SLC_FORW1, 0);#ifdef	USE_TERMIO	initfunc(SLC_FORW2, 0);	/* No FORW2 */#endif	initfunc(SLC_IP, SLC_FLUSHIN|SLC_FLUSHOUT);#undef	initfunc	if (slc_mode == SLC_EXPORT)		slc_export();	else		slc_import(1);}    voidslcstate(){    printf("Special characters are %s values\n",		slc_mode == SLC_IMPORT ? "remote default" :		slc_mode == SLC_EXPORT ? "local" :					 "remote");}    voidslc_mode_export(){    slc_mode = SLC_EXPORT;    if (my_state_is_will(TELOPT_LINEMODE))	slc_export();}    voidslc_mode_import(def)    int def;{    slc_mode = def ? SLC_IMPORT : SLC_RVALUE;    if (my_state_is_will(TELOPT_LINEMODE))	slc_import(def);}unsigned char slc_import_val[] = {	IAC, SB, TELOPT_LINEMODE, LM_SLC, 0, SLC_VARIABLE, 0, IAC, SE};unsigned char slc_import_def[] = {	IAC, SB, TELOPT_LINEMODE, LM_SLC, 0, SLC_DEFAULT, 0, IAC, SE};    voidslc_import(def)    int def;{    if (NETROOM() > sizeof(slc_import_val)) {	if (def) {	    ring_supply_data(&netoring, slc_import_def, sizeof(slc_import_def));	    printsub('>', &slc_import_def[2], sizeof(slc_import_def)-2);	} else {	    ring_supply_data(&netoring, slc_import_val, sizeof(slc_import_val));	    printsub('>', &slc_import_val[2], sizeof(slc_import_val)-2);	}    }/*@*/ else printf("slc_import: not enough room\n");}    voidslc_export(){    struct spc *spcp;    TerminalDefaultChars();    slc_start_reply();    for (spcp = &spc_data[1]; spcp < &spc_data[NSLC+1]; spcp++) {	if (spcp->mylevel != SLC_NOSUPPORT) {	    if (spcp->val == (cc_t)(_POSIX_VDISABLE))		spcp->flags = SLC_NOSUPPORT;	    else		spcp->flags = spcp->mylevel;	    if (spcp->valp)		spcp->val = *spcp->valp;	    slc_add_reply(spcp - spc_data, spcp->flags, spcp->val);	}    }    slc_end_reply();    (void)slc_update();    setconnmode(1);	/* Make sure the character values are set */}	voidslc(cp, len)	unsigned char *cp;	int len;{	struct spc *spcp;	int func,level;	slc_start_reply();	for (; len >= 3; len -=3, cp +=3) {		func = cp[SLC_FUNC];		if (func == 0) {			/*			 * Client side: always ignore 0 function.			 */			continue;		}		if (func > NSLC) {			if ((cp[SLC_FLAGS] & SLC_LEVELBITS) != SLC_NOSUPPORT)				slc_add_reply(func, SLC_NOSUPPORT, 0);			continue;		}		spcp = &spc_data[func];		level = cp[SLC_FLAGS]&(SLC_LEVELBITS|SLC_ACK);		if ((cp[SLC_VALUE] == (unsigned char)spcp->val) &&		    ((level&SLC_LEVELBITS) == (spcp->flags&SLC_LEVELBITS))) {			continue;		}		if (level == (SLC_DEFAULT|SLC_ACK)) {			/*			 * This is an error condition, the SLC_ACK			 * bit should never be set for the SLC_DEFAULT			 * level.  Our best guess to recover is to			 * ignore the SLC_ACK bit.			 */			cp[SLC_FLAGS] &= ~SLC_ACK;		}		if (level == ((spcp->flags&SLC_LEVELBITS)|SLC_ACK)) {			spcp->val = (cc_t)cp[SLC_VALUE];			spcp->flags = cp[SLC_FLAGS];	/* include SLC_ACK */			continue;		}		level &= ~SLC_ACK;		if (level <= (spcp->mylevel&SLC_LEVELBITS)) {			spcp->flags = cp[SLC_FLAGS]|SLC_ACK;			spcp->val = (cc_t)cp[SLC_VALUE];		}		if (level == SLC_DEFAULT) {			if ((spcp->mylevel&SLC_LEVELBITS) != SLC_DEFAULT)				spcp->flags = spcp->mylevel;			else				spcp->flags = SLC_NOSUPPORT;		}		slc_add_reply(func, spcp->flags, spcp->val);	}	slc_end_reply();	if (slc_update())		setconnmode(1);	/* set the  new character values */}    voidslc_check(){    struct spc *spcp;

⌨️ 快捷键说明

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