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

📄 utility.c

📁 经典的unix下telnetd代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (length < 1) {	output_data("(Empty suboption??\?)");	return;    }    switch (pointer[0]) {    case TELOPT_TTYPE:	output_data("TERMINAL-TYPE ");	switch (pointer[1]) {	case TELQUAL_IS:	    output_data("IS \"%.*s\"",			length-2,			(char *)pointer+2);	    break;	case TELQUAL_SEND:	    output_data("SEND");	    break;	default:	    output_data("- unknown qualifier %d (0x%x).",			pointer[1], pointer[1]);	}	break;    case TELOPT_TSPEED:	output_data("TERMINAL-SPEED");	if (length < 2) {	    output_data(" (empty suboption??\?)");	    break;	}	switch (pointer[1]) {	case TELQUAL_IS:	    output_data(" IS %.*s", length-2, (char *)pointer+2);	    break;	default:	    if (pointer[1] == 1)		output_data(" SEND");	    else		output_data(" %d (unknown)", pointer[1]);	    for (i = 2; i < length; i++) {		output_data(" ?%d?", pointer[i]);	    }	    break;	}	break;    case TELOPT_LFLOW:	output_data("TOGGLE-FLOW-CONTROL");	if (length < 2) {	    output_data(" (empty suboption??\?)");	    break;	}	switch (pointer[1]) {	case LFLOW_OFF:	    output_data(" OFF");	    break;	case LFLOW_ON:	    output_data(" ON");	    break;	case LFLOW_RESTART_ANY:	    output_data(" RESTART-ANY");	    break;	case LFLOW_RESTART_XON:	    output_data(" RESTART-XON");	    break;	default:	    output_data(" %d (unknown)",			pointer[1]);	}	for (i = 2; i < length; i++) {	    output_data(" ?%d?",			pointer[i]);	}	break;    case TELOPT_NAWS:	output_data("NAWS");	if (length < 2) {	    output_data(" (empty suboption??\?)");	    break;	}	if (length == 2) {	    output_data(" ?%d?",			pointer[1]);	    break;	}	output_data(" %u %u(%u)",		    pointer[1],		    pointer[2],		    (((unsigned int)pointer[1])<<8) + pointer[2]);	if (length == 4) {	    output_data(" ?%d?",			pointer[3]);	    break;	}	output_data(" %u %u(%u)",		    pointer[3],		    pointer[4],		    (((unsigned int)pointer[3])<<8) + pointer[4]);	for (i = 5; i < length; i++) {	    output_data(" ?%d?",			pointer[i]);	}	break;    case TELOPT_LINEMODE:	output_data("LINEMODE ");	if (length < 2) {	    output_data(" (empty suboption??\?)");	    break;	}	switch (pointer[1]) {	case WILL:	    output_data("WILL ");	    goto common;	case WONT:	    output_data("WONT ");	    goto common;	case DO:	    output_data("DO ");	    goto common;	case DONT:	    output_data("DONT ");	common:	    if (length < 3) {		output_data("(no option??\?)");		break;	    }	    switch (pointer[2]) {	    case LM_FORWARDMASK:		output_data("Forward Mask");		for (i = 3; i < length; i++) {		    output_data(" %x", pointer[i]);		}		break;	    default:		output_data("%d (unknown)",			    pointer[2]);		for (i = 3; i < length; i++) {		    output_data(" %d",				pointer[i]);		}		break;	    }	    break;	case LM_SLC:	    output_data("SLC");	    for (i = 2; i < length - 2; i += 3) {		if (SLC_NAME_OK(pointer[i+SLC_FUNC]))		    output_data(" %s",				SLC_NAME(pointer[i+SLC_FUNC]));		else		    output_data(" %d",				pointer[i+SLC_FUNC]);		switch (pointer[i+SLC_FLAGS]&SLC_LEVELBITS) {		case SLC_NOSUPPORT:		    output_data(" NOSUPPORT");		    break;		case SLC_CANTCHANGE:		    output_data(" CANTCHANGE");		    break;		case SLC_VARIABLE:		    output_data(" VARIABLE");		    break;		case SLC_DEFAULT:		    output_data(" DEFAULT");		    break;		}		output_data("%s%s%s",			    pointer[i+SLC_FLAGS]&SLC_ACK ? "|ACK" : "",			    pointer[i+SLC_FLAGS]&SLC_FLUSHIN ? "|FLUSHIN" : "",			    pointer[i+SLC_FLAGS]&SLC_FLUSHOUT ? "|FLUSHOUT" : "");		if (pointer[i+SLC_FLAGS]& ~(SLC_ACK|SLC_FLUSHIN|					    SLC_FLUSHOUT| SLC_LEVELBITS)) {		    output_data("(0x%x)",				pointer[i+SLC_FLAGS]);		}		output_data(" %d;",			    pointer[i+SLC_VALUE]);		if ((pointer[i+SLC_VALUE] == IAC) &&		    (pointer[i+SLC_VALUE+1] == IAC))		    i++;	    }	    for (; i < length; i++) {		output_data(" ?%d?",			    pointer[i]);	    }	    break;	case LM_MODE:	    output_data("MODE ");	    if (length < 3) {		output_data("(no mode??\?)");		break;	    }	    {		char tbuf[32];		snprintf(tbuf,			 sizeof(tbuf),			 "%s%s%s%s%s",			 pointer[2]&MODE_EDIT ? "|EDIT" : "",			 pointer[2]&MODE_TRAPSIG ? "|TRAPSIG" : "",			 pointer[2]&MODE_SOFT_TAB ? "|SOFT_TAB" : "",			 pointer[2]&MODE_LIT_ECHO ? "|LIT_ECHO" : "",			 pointer[2]&MODE_ACK ? "|ACK" : "");		output_data("%s",			    tbuf[1] ? &tbuf[1] : "0");	    }	    if (pointer[2]&~(MODE_EDIT|MODE_TRAPSIG|MODE_ACK)) {		output_data(" (0x%x)",			    pointer[2]);	    }	    for (i = 3; i < length; i++) {		output_data(" ?0x%x?",			 pointer[i]);	    }	    break;	default:	    output_data("%d (unknown)",			pointer[1]);	    for (i = 2; i < length; i++) {		output_data(" %d", pointer[i]);	    }	}	break;    case TELOPT_STATUS: {	char *cp;	int j, k;	output_data("STATUS");	switch (pointer[1]) {	default:	    if (pointer[1] == TELQUAL_SEND)		output_data(" SEND");	    else		output_data(" %d (unknown)",			    pointer[1]);	    for (i = 2; i < length; i++) {		output_data(" ?%d?",			    pointer[i]);	    }	    break;	case TELQUAL_IS:	    output_data(" IS\r\n");	    for (i = 2; i < length; i++) {		switch(pointer[i]) {		case DO:	cp = "DO"; goto common2;		case DONT:	cp = "DONT"; goto common2;		case WILL:	cp = "WILL"; goto common2;		case WONT:	cp = "WONT"; goto common2;		common2:		i++;		if (TELOPT_OK(pointer[i]))		    output_data(" %s %s",				cp,				TELOPT(pointer[i]));		else		    output_data(" %s %d",				cp,				pointer[i]);		output_data("\r\n");		break;		case SB:		    output_data(" SB ");		    i++;		    j = k = i;		    while (j < length) {			if (pointer[j] == SE) {			    if (j+1 == length)				break;			    if (pointer[j+1] == SE)				j++;			    else				break;			}			pointer[k++] = pointer[j++];		    }		    printsub(0, &pointer[i], k - i);		    if (i < length) {			output_data(" SE");			i = j;		    } else			i = j - 1;		    output_data("\r\n");		    break;		default:		    output_data(" %d",				pointer[i]);		    break;		}	    }	    break;	}	break;    }    case TELOPT_XDISPLOC:	output_data("X-DISPLAY-LOCATION ");	switch (pointer[1]) {	case TELQUAL_IS:	    output_data("IS \"%.*s\"",			length-2,			(char *)pointer+2);	    break;	case TELQUAL_SEND:	    output_data("SEND");	    break;	default:	    output_data("- unknown qualifier %d (0x%x).",			pointer[1], pointer[1]);	}	break;    case TELOPT_NEW_ENVIRON:	output_data("NEW-ENVIRON ");	goto env_common1;    case TELOPT_OLD_ENVIRON:	output_data("OLD-ENVIRON");    env_common1:	switch (pointer[1]) {	case TELQUAL_IS:	    output_data("IS ");	    goto env_common;	case TELQUAL_SEND:	    output_data("SEND ");	    goto env_common;	case TELQUAL_INFO:	    output_data("INFO ");	env_common:	    {		int noquote = 2;		for (i = 2; i < length; i++ ) {		    switch (pointer[i]) {		    case NEW_ENV_VAR:			output_data("\" VAR " + noquote);			noquote = 2;			break;		    case NEW_ENV_VALUE:			output_data("\" VALUE " + noquote);			noquote = 2;			break;		    case ENV_ESC:			output_data("\" ESC " + noquote);			noquote = 2;			break;		    case ENV_USERVAR:			output_data("\" USERVAR " + noquote);			noquote = 2;			break;		    default:			if (isprint(pointer[i]) && pointer[i] != '"') {			    if (noquote) {				output_data ("\"");				noquote = 0;			    }			    output_data ("%c", pointer[i]);			} else {			    output_data("\" %03o " + noquote,					pointer[i]);			    noquote = 2;			}			break;		    }		}		if (!noquote)		    output_data ("\"");		break;	    }	}	break;#ifdef AUTHENTICATION    case TELOPT_AUTHENTICATION:	output_data("AUTHENTICATION");	if (length < 2) {	    output_data(" (empty suboption??\?)");	    break;	}	switch (pointer[1]) {	case TELQUAL_REPLY:	case TELQUAL_IS:	    output_data(" %s ",			(pointer[1] == TELQUAL_IS) ?			"IS" : "REPLY");	    if (AUTHTYPE_NAME_OK(pointer[2]))		output_data("%s ",			    AUTHTYPE_NAME(pointer[2]));	    else		output_data("%d ",			    pointer[2]);	    if (length < 3) {		output_data("(partial suboption??\?)");		break;	    }	    output_data("%s|%s",			((pointer[3] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ?			"CLIENT" : "SERVER",			((pointer[3] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ?			"MUTUAL" : "ONE-WAY");	    auth_printsub(&pointer[1], length - 1, buf, sizeof(buf));	    output_data("%s",			buf);	    break;	case TELQUAL_SEND:	    i = 2;	    output_data(" SEND ");	    while (i < length) {		if (AUTHTYPE_NAME_OK(pointer[i]))		    output_data("%s ",				AUTHTYPE_NAME(pointer[i]));		else		    output_data("%d ",				pointer[i]);		if (++i >= length) {		    output_data("(partial suboption??\?)");		    break;		}		output_data("%s|%s ",			    ((pointer[i] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ?			    "CLIENT" : "SERVER",			    ((pointer[i] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ?			    "MUTUAL" : "ONE-WAY");		++i;	    }	    break;	case TELQUAL_NAME:	    i = 2;	    output_data(" NAME \"%.*s\"",			length - 2,			pointer);	    break;	default:	    for (i = 2; i < length; i++) {		output_data(" ?%d?",			    pointer[i]);	    }	    break;	}	break;#endif#ifdef ENCRYPTION    case TELOPT_ENCRYPT:	output_data("ENCRYPT");	if (length < 2) {	    output_data(" (empty suboption?)");	    break;	}	switch (pointer[1]) {	case ENCRYPT_START:	    output_data(" START");	    break;	case ENCRYPT_END:	    output_data(" END");	    break;	case ENCRYPT_REQSTART:	    output_data(" REQUEST-START");	    break;	case ENCRYPT_REQEND:	    output_data(" REQUEST-END");	    break;	case ENCRYPT_IS:	case ENCRYPT_REPLY:	    output_data(" %s ",			(pointer[1] == ENCRYPT_IS) ?			"IS" : "REPLY");	    if (length < 3) {		output_data(" (partial suboption?)");		break;	    }	    if (ENCTYPE_NAME_OK(pointer[2]))		output_data("%s ",			    ENCTYPE_NAME(pointer[2]));	    else		output_data(" %d (unknown)",			    pointer[2]);	    encrypt_printsub(&pointer[1], length - 1, buf, sizeof(buf));	    output_data("%s",			buf);	    break;	case ENCRYPT_SUPPORT:	    i = 2;	    output_data(" SUPPORT ");	    while (i < length) {		if (ENCTYPE_NAME_OK(pointer[i]))		    output_data("%s ",				ENCTYPE_NAME(pointer[i]));		else		    output_data("%d ",				pointer[i]);		i++;	    }	    break;	case ENCRYPT_ENC_KEYID:	    output_data(" ENC_KEYID %d", pointer[1]);	    goto encommon;	case ENCRYPT_DEC_KEYID:	    output_data(" DEC_KEYID %d", pointer[1]);	    goto encommon;	default:	    output_data(" %d (unknown)", pointer[1]);	encommon:	    for (i = 2; i < length; i++) {		output_data(" %d", pointer[i]);	    }	    break;	}	break;#endif    default:	if (TELOPT_OK(pointer[0]))	    output_data("%s (unknown)",			TELOPT(pointer[0]));	else	    output_data("%d (unknown)",			pointer[i]);	for (i = 1; i < length; i++) {	    output_data(" %d", pointer[i]);	}	break;    }    output_data("\r\n");}/* * Dump a data buffer in hex and ascii to the output data stream. */voidprintdata(char *tag, char *ptr, int cnt){    int i;    char xbuf[30];    while (cnt) {	/* flush net output buffer if no room for new data) */	if ((&netobuf[BUFSIZ] - nfrontp) < 80) {	    netflush();	}	/* add a line of output */	output_data("%s: ", tag);	for (i = 0; i < 20 && cnt; i++) {	    output_data("%02x", *ptr);	    if (isprint(*ptr)) {		xbuf[i] = *ptr;	    } else {		xbuf[i] = '.';	    }	    if (i % 2) {		output_data(" ");	    }	    cnt--;	    ptr++;	}	xbuf[i] = '\0';	output_data(" %s\r\n", xbuf);    }}#endif /* DIAGNOSTICS */

⌨️ 快捷键说明

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