📄 utility.c
字号:
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 + -