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

📄 telnet.c

📁 minix软件源代码
💻 C
字号:
/* * TNET		A server program for MINIX which implements the TCP/IP *		suite of networking protocols.  It is based on the *		TCP/IP code written by Phil Karn et al, as found in *		his NET package for Packet Radio communications. * *		This module handles telnet option processing. * * Author:	Michael Temari, <temari@temari.ae.ge.com>  01/13/93 * */#include <sys/types.h>#include <string.h>#include <fcntl.h>#include <unistd.h>#include "telnetd.h"#include "telnet.h"#include <stdio.h>#define	IN_DATA	0#define	IN_CR	1#define	IN_IAC	2#define	IN_IAC2	3_PROTOTYPE(static void dowill, (int c));_PROTOTYPE(static void dowont, (int c));_PROTOTYPE(static void dodo, (int c));_PROTOTYPE(static void dodont, (int c));_PROTOTYPE(static void respond, (int ack, int option));#define	LASTTELOPT	TELOPT_SGAstatic int TelROpts[LASTTELOPT+1];static int TelLOpts[LASTTELOPT+1];static int telfdout;void tel_init(){int i;   for(i = 0; i <= LASTTELOPT; i++) {	TelROpts[i] = 0;	TelLOpts[i] = 0;   }}void telopt(fdout, what, option)int fdout;int what;int option;{char buf[3];int len;   buf[0] = IAC;   buf[1] = what;   buf[2] = option;   len = 0;   switch(what) {	case DO:		if(option <= LASTTELOPT) {			TelROpts[option] = 1;			len = 3;		}		break;	case DONT:		if(option <= LASTTELOPT) {			TelROpts[option] = 1;			len = 3;		}		break;	case WILL:		if(option <= LASTTELOPT) {			TelLOpts[option] = 1;			len = 3;		}		break;	case WONT:		if(option <= LASTTELOPT) {			TelLOpts[option] = 1;			len = 3;		}		break;   }   if(len > 0)	(void) write(fdout, buf, len);}int tel_in(fdout, telout, buffer, len)int fdout;int telout;char *buffer;int len;{static int InState = IN_DATA;static int ThisOpt = 0;char *p;char *p2;int size;int c;   telfdout = telout;   p = p2 = buffer;   size = 0;   while(len > 0) {   	c = (unsigned char)*p++; len--;	switch(InState) {   		case IN_CR:   			InState = IN_DATA;   			if(c == 0 || c == '\n')   				break;   			/* fall through */   		case IN_DATA:   			if(c == IAC) {   				InState = IN_IAC;   				break;   			}   			*p2++ = c; size++;   			if(c == '\r') InState = IN_CR;   			break;   		case IN_IAC:   			switch(c) {   				case IAC:	   				*p2++ = c; size++;   					InState = IN_DATA;   					break;   				case WILL:   				case WONT:   				case DO:   				case DONT:   					InState = IN_IAC2;   					ThisOpt = c;   					break;   				case EOR:   				case SE:   				case NOP:   				case BREAK:   				case IP:   				case AO:   				case AYT:   				case EC:   				case EL:   				case GA:   				case SB:   					break;   				default:   					break;   			}   			break;   		case IN_IAC2:   			if(size > 0) {   				write(fdout, buffer, size);   				p2 = buffer;   				size = 0;   			}   			InState = IN_DATA;   			switch(ThisOpt) {   				case WILL:	dowill(c);	break;   				case WONT:	dowont(c);	break;   				case DO:	dodo(c);	break;   				case DONT:	dodont(c);	break;   			}   			break;   	}   }   if(size > 0)   	write(fdout, buffer, size);}int tel_out(fdout, buf, size)int fdout;char *buf;int size;{char *p;int got_iac, len;   p = buf;   while(size > 0) {	buf = p;	got_iac = 0;	if((p = (char *)memchr(buf, IAC, size)) != (char *)NULL) {		got_iac = 1;		p++;	} else		p = buf + size;	len = p - buf;	if(len > 0)		(void) write(fdout, buf, len);	if(got_iac)		(void) write(fdout, p - 1, 1);	size = size - len;   }}static void dowill(c)int c;{int ack;   switch(c) {	case TELOPT_BINARY:	case TELOPT_ECHO:	case TELOPT_SGA:		if(TelROpts[c] == 1)			return;		TelROpts[c] = 1;		ack = DO;		break;	default:		ack = DONT;   }   respond(ack, c);}static void dowont(c)int c;{   if(c <= LASTTELOPT) {	if(TelROpts[c] == 0)		return;	TelROpts[c] = 0;   }   respond(DONT, c);}static void dodo(c)int c;{int ack;   switch(c) {	default:		ack = WONT;   }   respond(ack, c);}static void dodont(c)int c;{   if(c <= LASTTELOPT) {	if(TelLOpts[c] == 0)		return;	TelLOpts[c] = 0;   }   respond(WONT, c);}static void respond(ack, option)int ack, option;{unsigned char c[3];   c[0] = IAC;   c[1] = ack;   c[2] = option;   /* write(telfdout, c, 3); */}

⌨️ 快捷键说明

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