diff options
Diffstat (limited to 'src/windows/wintel/negotiat.c')
-rw-r--r-- | src/windows/wintel/negotiat.c | 1377 |
1 files changed, 725 insertions, 652 deletions
diff --git a/src/windows/wintel/negotiat.c b/src/windows/wintel/negotiat.c index 58bf97d90..685092df5 100644 --- a/src/windows/wintel/negotiat.c +++ b/src/windows/wintel/negotiat.c @@ -1,24 +1,34 @@ /* -* negotiat.c -* -* Telnet option negotiation functions -* + * negotiat.c + * + * Telnet option negotiation functions + * /* -* Includes -*/ + * Includes + */ /* #define USETEK */ /* #define USERAS */ -#if 0 /* define this to print the raw network data to debuging monitor */ -#define NEGOTIATEDEBUG +#ifdef DEBUG /* define this to print the raw network data to debuging monitor */ +#define NEGOTIATEDEBUG +#endif + +#if 0 +#define PRINT_EVERYTHING /* talk a lot */ #endif #include <time.h> #include "telnet.h" -#include "telopts.h" +#include "telnet_arpa.h" #include "auth.h" +#include "encrypt.h" + +#define STNORM 0 +#define NEGOTIATE 1 +#define ESCFOUND 5 +#define IACFOUND 6 unsigned char parsedat[256]; @@ -27,766 +37,829 @@ static void parse_subnegotiat(kstream ks,int end_sub); /* Local variables */ static char *telstates[]={ - "EOF", - "Suspend Process", - "Abort Process", - "Unknown (239)", - "Subnegotiation End", - "NOP", - "Data Mark", - "Break", - "Interrupt Process", - "Abort Output", - "Are You There", - "Erase Character", - "Erase Line", - "Go Ahead", - "Subnegotiate", - "Will", - "Won't", - "Do", - "Don't" + "EOF", + "Suspend Process", + "Abort Process", + "Unknown (239)", + "Subnegotiation End", + "NOP", + "Data Mark", + "Break", + "Interrupt Process", + "Abort Output", + "Are You There", + "Erase Character", + "Erase Line", + "Go Ahead", + "Subnegotiate", + "Will", + "Won't", + "Do", + "Don't" }; static char *teloptions[256]={ /* ascii strings for Telnet options */ - "Binary", /* 0 */ - "Echo", - "Reconnection", - "Supress Go Ahead", - "Message Size Negotiation", - "Status", /* 5 */ - "Timing Mark", - "Remote Controlled Trans and Echo", - "Output Line Width", - "Output Page Size", - "Output Carriage-Return Disposition", /* 10 */ - "Output Horizontal Tab Stops", - "Output Horizontal Tab Disposition", - "Output Formfeed Disposition", - "Output Vertical Tabstops", - "Output Vertical Tab Disposition", /* 15 */ - "Output Linefeed Disposition", - "Extended ASCII", - "Logout", - "Byte Macro", - "Data Entry Terminal", /* 20 */ - "SUPDUP", - "SUPDUP Output", - "Send Location", - "Terminal Type", - "End of Record", /* 25 */ - "TACACS User Identification", - "Output Marking", - "Terminal Location Number", - "3270 Regime", - "X.3 PAD", /* 30 */ - "Negotiate About Window Size", - "Terminal Speed", - "Toggle Flow Control", - "Linemode", - "X Display Location", /* 35 */ - "Environment", - "Authentication", - "Data Encryption", - "39", - "40","41","42","43","44","45","46","47","48","49", - "50","51","52","53","54","55","56","57","58","59", - "60","61","62","63","64","65","66","67","68","69", - "70","71","72","73","74","75","76","77","78","79", - "80","81","82","83","84","85","86","87","88","89", - "90","91","92","93","94","95","96","97","98","99", - "100","101","102","103","104","105","106","107","108","109", - "110","111","112","113","114","115","116","117","118","119", - "120","121","122","123","124","125","126","127","128","129", - "130","131","132","133","134","135","136","137","138","139", - "140","141","142","143","144","145","146","147","148","149", - "150","151","152","153","154","155","156","157","158","159", - "160","161","162","163","164","165","166","167","168","169", - "170","171","172","173","174","175","176","177","178","179", - "180","181","182","183","184","185","186","187","188","189", - "190","191","192","193","194","195","196","197","198","199", - "200","201","202","203","204","205","206","207","208","209", - "210","211","212","213","214","215","216","217","218","219", - "220","221","222","223","224","225","226","227","228","229", - "230","231","232","233","234","235","236","237","238","239", - "240","241","242","243","244","245","246","247","248","249", - "250","251","252","253","254", - "Extended Options List" /* 255 */ + "Binary", /* 0 */ + "Echo", + "Reconnection", + "Supress Go Ahead", + "Message Size Negotiation", + "Status", /* 5 */ + "Timing Mark", + "Remote Controlled Trans and Echo", + "Output Line Width", + "Output Page Size", + "Output Carriage-Return Disposition", /* 10 */ + "Output Horizontal Tab Stops", + "Output Horizontal Tab Disposition", + "Output Formfeed Disposition", + "Output Vertical Tabstops", + "Output Vertical Tab Disposition", /* 15 */ + "Output Linefeed Disposition", + "Extended ASCII", + "Logout", + "Byte Macro", + "Data Entry Terminal", /* 20 */ + "SUPDUP", + "SUPDUP Output", + "Send Location", + "Terminal Type", + "End of Record", /* 25 */ + "TACACS User Identification", + "Output Marking", + "Terminal Location Number", + "3270 Regime", + "X.3 PAD", /* 30 */ + "Negotiate About Window Size", + "Terminal Speed", + "Toggle Flow Control", + "Linemode", + "X Display Location", /* 35 */ + "Environment", + "Authentication", + "Data Encryption", + "39", + "40","41","42","43","44","45","46","47","48","49", + "50","51","52","53","54","55","56","57","58","59", + "60","61","62","63","64","65","66","67","68","69", + "70","71","72","73","74","75","76","77","78","79", + "80","81","82","83","84","85","86","87","88","89", + "90","91","92","93","94","95","96","97","98","99", + "100","101","102","103","104","105","106","107","108","109", + "110","111","112","113","114","115","116","117","118","119", + "120","121","122","123","124","125","126","127","128","129", + "130","131","132","133","134","135","136","137","138","139", + "140","141","142","143","144","145","146","147","148","149", + "150","151","152","153","154","155","156","157","158","159", + "160","161","162","163","164","165","166","167","168","169", + "170","171","172","173","174","175","176","177","178","179", + "180","181","182","183","184","185","186","187","188","189", + "190","191","192","193","194","195","196","197","198","199", + "200","201","202","203","204","205","206","207","208","209", + "210","211","212","213","214","215","216","217","218","219", + "220","221","222","223","224","225","226","227","228","229", + "230","231","232","233","234","235","236","237","238","239", + "240","241","242","243","244","245","246","247","248","249", + "250","251","252","253","254", + "Extended Options List" /* 255 */ }; static char *LMoptions[]={ /* ascii strings for Linemode sub-options */ - "None", "MODE", "FORWARDMASK", "SLC" + "None", "MODE", "FORWARDMASK", "SLC" }; static char *ModeOptions[]={ /* ascii strings for Linemode edit options */ - "None", "EDIT", "TRAPSIG", "ACK", "SOFT TAB", "LIT ECHO" + "None", "EDIT", "TRAPSIG", "ACK", "SOFT TAB", "LIT ECHO" }; static char *SLCoptions[]={ /* ascii strings for Linemode SLC characters */ - "None", "SYNCH", "BREAK", "IP", "ABORT OUTPUT", - "AYT", "EOR", "ABORT", "EOF", "SUSP", - "EC", "EL", "EW", "RP", "LNEXT", - "XON", "XOFF", "FORW1", "FORW2", "MCL", - "MCR", "MCWL", "MCWR", "MCBOL", "MCEOL", - "INSRT", "OVER", "ECR", "EWR", "EBOL", - "EEOL" + "None", "SYNCH", "BREAK", "IP", "ABORT OUTPUT", + "AYT", "EOR", "ABORT", "EOF", "SUSP", + "EC", "EL", "EW", "RP", "LNEXT", + "XON", "XOFF", "FORW1", "FORW2", "MCL", + "MCR", "MCWL", "MCWR", "MCBOL", "MCEOL", + "INSRT", "OVER", "ECR", "EWR", "EBOL", + "EEOL" }; static char *SLCflags[]={ /* ascii strings for Linemode SLC flags */ - "SLC_NOSUPPORT", "SLC_CANTCHANGE", "SLC_VALUE", "SLC_DEFAULT" + "SLC_NOSUPPORT", "SLC_CANTCHANGE", "SLC_VALUE", "SLC_DEFAULT" }; - /* Linemode default character for each function */ -static unsigned char LMdefaults[NUMLMODEOPTIONS+1]={ - (unsigned char)-1, /* zero isn't used */ - (unsigned char)-1, /* we don't support SYNCH */ - 3, /* ^C is default for BRK */ - 3, /* ^C is default for IP */ - 15, /* ^O is default for AO */ - 25, /* ^Y is default for AYT */ /* 5 */ - (unsigned char)-1, /* we don't support EOR */ - 3, /* ^C is default for ABORT */ - 4, /* ^D is default for EOF */ - 26, /* ^Z is default for SUSP */ - 8, /* ^H is default for EC */ /* 10 */ - 21, /* ^U is default for EL */ - 23, /* ^W is default for EW */ - 18, /* ^R is default for RP */ - 22, /* ^V is default for LNEXT */ - 17, /* ^Q is default for XON */ /* 15 */ - 19, /* ^S is default for XOFF */ - 22, /* ^V is default for FORW1 */ - 5, /* ^E is default for FORW2 */ - (unsigned char)-1, /* we don't support MCL */ - (unsigned char)-1, /* we don't support MCR */ /* 20 */ - (unsigned char)-1, /* we don't support MCWL */ - (unsigned char)-1, /* we don't support MCWR */ - (unsigned char)-1, /* we don't support MCBOL */ - (unsigned char)-1, /* we don't support MCEOL */ - (unsigned char)-1, /* we don't support INSRT */ /* 25 */ - (unsigned char)-1, /* we don't support OVER */ - (unsigned char)-1, /* we don't support ECR */ - (unsigned char)-1, /* we don't support EWR */ - (unsigned char)-1, /* we don't support EBOL */ - (unsigned char)-1 /* we don't support EEOL */ /* 30 */ +/* Linemode default character for each function */ +static unsigned char LMdefaults[NTELOPTS + 1]={ + (unsigned char)-1, /* zero isn't used */ + (unsigned char)-1, /* we don't support SYNCH */ + 3, /* ^C is default for BRK */ + 3, /* ^C is default for IP */ + 15, /* ^O is default for AO */ + 25, /* ^Y is default for AYT */ /* 5 */ + (unsigned char)-1, /* we don't support EOR */ + 3, /* ^C is default for ABORT */ + 4, /* ^D is default for EOF */ + 26, /* ^Z is default for SUSP */ + 8, /* ^H is default for EC */ /* 10 */ + 21, /* ^U is default for EL */ + 23, /* ^W is default for EW */ + 18, /* ^R is default for RP */ + 22, /* ^V is default for LNEXT */ + 17, /* ^Q is default for XON */ /* 15 */ + 19, /* ^S is default for XOFF */ + 22, /* ^V is default for FORW1 */ + 5, /* ^E is default for FORW2 */ + (unsigned char)-1, /* we don't support MCL */ + (unsigned char)-1, /* we don't support MCR */ /* 20 */ + (unsigned char)-1, /* we don't support MCWL */ + (unsigned char)-1, /* we don't support MCWR */ + (unsigned char)-1, /* we don't support MCBOL */ + (unsigned char)-1, /* we don't support MCEOL */ + (unsigned char)-1, /* we don't support INSRT */ /* 25 */ + (unsigned char)-1, /* we don't support OVER */ + (unsigned char)-1, /* we don't support ECR */ + (unsigned char)-1, /* we don't support EWR */ + (unsigned char)-1, /* we don't support EBOL */ + (unsigned char)-1 /* we don't support EEOL */ /* 30 */ }; -/*+******************************************************************** -* Function : start_negotiation() -* Purpose : Send the initial negotiations on the network and print -* the negotitations to the console screen. -* Parameters : -* dat - the port number to write to -* cvs - the console's virtual screen -* Returns : none -* Calls : tprintf(), netprintf() -* Called by : dosessions() -**********************************************************************/ +/* + * Function : start_negotiation() + * Purpose : Send the initial negotiations on the network and print + * the negotitations to the console screen. + * Parameters : + * dat - the port number to write to + * cvs - the console's virtual screen + * Returns : none + * Calls : tprintf(), netprintf() + * Called by : dosessions() + */ void start_negotiation(kstream ks) { - char buf[128]; + char buf[128]; - /* Send the initial tlnet negotiations */ - wsprintf(buf,"%c%c%c",IAC,DOTEL,SGA); - TelnetSend(ks,buf,lstrlen(buf),0); - wsprintf(buf,"%c%c%c",IAC,DOTEL,ECHO); - TelnetSend(ks,buf,lstrlen(buf),0); - wsprintf(buf,"%c%c%c",IAC,WILLTEL,NAWS); - TelnetSend(ks,buf,lstrlen(buf),0); + /* Send the initial telnet negotiations */ +#ifdef ENCRYPTION /* XXX */ + if (encrypt_flag) + wsprintf(buf,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", + IAC, WILL, TELOPT_AUTHENTICATION, + IAC, WILL, TELOPT_ENCRYPT, + IAC, DO, TELOPT_SGA, + IAC, DO, TELOPT_ECHO, + IAC, WILL, TELOPT_NAWS + ); + else +#endif + wsprintf(buf,"%c%c%c%c%c%c%c%c%c%c%c%c", + IAC, WILL, TELOPT_AUTHENTICATION, + IAC, DO, TELOPT_SGA, + IAC, DO, TELOPT_ECHO, + IAC, WILL, TELOPT_NAWS + ); + TelnetSend(ks,buf,lstrlen(buf),0); #ifdef NOT - /* check whether we are going to be output mapping */ - if(tw->mapoutput) { - netprintf(tw->pnum,"%c%c%c",IAC,DOTEL,BINARY); + /* check whether we are going to be output mapping */ + if(tw->mapoutput) { + netprintf(tw->pnum,"%c%c%c",IAC,DO,TELOPT_BINARY); /* set the flag indicating we wanted server to start transmitting binary */ - tw->uwantbinary=1; - netprintf(tw->pnum,"%c%c%c",IAC,WILLTEL,BINARY); + tw->uwantbinary=1; + netprintf(tw->pnum,"%c%c%c",IAC,WILL,TELOPT_BINARY); /* set the flag indicating we want to start transmitting binary */ - tw->iwantbinary=1; - } /* end if */ + tw->iwantbinary=1; + } /* end if */ #endif - /* Print to the console what we just did */ + /* Print to the console what we just did */ #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n",telstates[DOTEL-LOW_TEL_OPT], - teloptions[ECHO]); - OutputDebugString(strTmp); - wsprintf(strTmp,"SEND: %ls %ls\r\n",telstates[DOTEL-LOW_TEL_OPT], - teloptions[SGA]); - OutputDebugString(strTmp); - wsprintf(strTmp,"SEND: %ls %ls\r\n",telstates[WILLTEL-LOW_TEL_OPT], - teloptions[NAWS]); - OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n",telstates[DO - TELCMD_FIRST], + teloptions[TELOPT_ECHO]); + OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n",telstates[DO - TELCMD_FIRST], + teloptions[TELOPT_SGA]); + OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n",telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_NAWS]); + OutputDebugString(strTmp); #ifdef NOT - tprintf(cvs,"SEND: %ls %ls\r\n",telstates[DOTEL-LOW_TEL_OPT], - teloptions[BINARY]); - tprintf(cvs,"SEND: %ls %ls\r\n",telstates[WILLTEL-LOW_TEL_OPT], - teloptions[BINARY]); + tprintf(cvs,"SEND: %s %s\r\n",telstates[DO - TELCMD_FIRST], + teloptions[BINARY]); + tprintf(cvs,"SEND: %s %s\r\n",telstates[WILL - TELCMD_FIRST], + teloptions[BINARY]); #endif #endif } /* end start_negotiation() */ -/*+******************************************************************* -* parse -* Do the telnet negotiation parsing. -* -* look at the string which has just come in from outside and -* check for special sequences that we are interested in. -* -* Tries to pass through routine strings immediately, waiting for special -* characters ESC and IAC to change modes. -*/ +/* + * parse + * Do the telnet negotiation parsing. + * + * look at the string which has just come in from outside and + * check for special sequences that we are interested in. + * + * Tries to pass through routine strings immediately, waiting for special + * characters ESC and IAC to change modes. + */ void -parse (CONNECTION *con,unsigned char *st,int cnt) { - static int sub_pos; /* the position we are in the subnegotiation parsing */ - static int end_sub; /* index of last byte in parsedat in a subnegotiation */ - unsigned char *mark, *orig; - char buf[256]; - kstream ks; +parse(CONNECTION *con,unsigned char *st,int cnt) +{ + static int sub_pos; /* the position we are in the subnegotiation parsing */ + static int end_sub; /* index of last byte in parsedat in a subnegotiation */ + unsigned char *mark, *orig; + char buf[256]; + kstream ks; - ks=con->ks; + ks = con->ks; -#ifdef PRINT_EVERYTHING - OutputDebugString("\r\n"); - for(i=0; i<cnt; i++) { - int j; - - for(j=0; (j < 16) && ((i + j) < cnt); j++) { - wsprintf(strTmp,"%2.2X ", *(unsigned char *) (st + i + j)); - OutputDebugString(strTmp); - } - i+=j-1; - OutputDebugString("\r\n"); - } /* end for */ - OutputDebugString("\r\n"); -#endif //PRINT_EVERYTHING +#ifdef PRINT_EVERYTHING + hexdump("Options to process:", st, cnt); +#endif /* PRINT_EVERYTHING */ - orig=st; /* remember beginning point */ - mark=st+cnt; /* set to end of input string */ + orig = st; /* remember beginning point */ + mark = st + cnt; /* set to end of input string */ #ifdef HUH - netpush(tw->pnum); + netpush(tw->pnum); #endif -/* -* traverse string, looking for any special characters which indicate that -* we need to change modes. -*/ - while(st<mark) { - while(con->telstate!=STNORM && st<mark) { - switch(con->telstate) { - case IACFOUND: /* telnet option negotiation */ - if(*st==IAC) { /* real data=255 */ - st++; /* real 255 will get sent */ - con->telstate=STNORM; - break; - } /* end if */ - - if(*st>239) { - con->telstate=*st++; /* by what the option is */ - break; - } /* end if */ + /* + * traverse string, looking for any special characters which indicate that + * we need to change modes. + */ + while(st < mark) { + + while(con->telstate != STNORM && st < mark) { + switch(con->telstate) { + case IACFOUND: /* telnet option negotiation */ + if(*st == IAC) { /* real data=255 */ + st++; /* real 255 will get sent */ + con->telstate = STNORM; + break; + } /* end if */ + + if(*st > 239) { + con->telstate = *st++; /* by what the option is */ + break; + } /* end if */ #ifdef NEGOTIATEDEBUG - wsprintf(buf,"\r\n strange telnet option"); - OutputDebugString(buf); + wsprintf(buf, "\r\n strange telnet option"); + OutputDebugString(buf); #endif - orig=++st; - con->telstate=STNORM; - break; - - case EL: /* received a telnet erase line command */ - case EC: /* received a telnet erase character command */ - case AYT: /* received a telnet Are-You-There command */ - case AO: /* received a telnet Abort Output command */ - case IP: /* received a telnet Interrupt Process command */ - case BREAK: /* received a telnet Break command */ - case DM: /* received a telnet Data Mark command */ - case NOP: /* received a telnet No Operation command */ - case SE: /* received a telnet Subnegotiation End command */ - case ABORT: /* received a telnet Abort Process command */ - case SUSP: /* received a telnet Suspend Process command */ - case TEL_EOF:/* received a telnet EOF command */ + orig=++st; + con->telstate=STNORM; + break; + + case EL: /* received a telnet erase line command */ + case EC: /* received a telnet erase character command */ + case AYT: /* received a telnet Are-You-There command */ + case AO: /* received a telnet Abort Output command */ + case IP: /* received a telnet Interrupt Process command */ + case BREAK: /* received a telnet Break command */ + case DM: /* received a telnet Data Mark command */ + case NOP: /* received a telnet No Operation command */ + case SE: /* received a telnet Subnegotiation End command */ + case ABORT: /* received a telnet Abort Process command */ + case SUSP: /* received a telnet Suspend Process command */ + case xEOF: /* received a telnet EOF command */ #ifdef NEGOTIATEDEBUG - wsprintf(buf,"RECV: %ls\r\n", - telstates[con->telstate-LOW_TEL_OPT]); - OutputDebugString(buf); + wsprintf(buf,"RECV: %s\r\n", + telstates[con->telstate-TELCMD_FIRST]); + OutputDebugString(buf); #endif - con->telstate=STNORM; - orig=++st; - break; + con->telstate=STNORM; + orig=++st; + break; - case GOAHEAD: /* telnet go ahead option*/ + case GA: /* telnet go ahead option*/ #ifdef NEGOTIATEDEBUG - wsprintf(buf,"RECV: %ls\r\n", - telstates[con->telstate-LOW_TEL_OPT]); - OutputDebugString(buf); + wsprintf(buf,"RECV: %s\r\n", + telstates[con->telstate-TELCMD_FIRST]); + OutputDebugString(buf); #endif - con->telstate=STNORM; - orig=++st; - break; + con->telstate=STNORM; + orig=++st; + break; - case DOTEL: /* received a telnet DO negotiation */ + case DO: /* received a telnet DO negotiation */ #ifdef NEGOTIATEDEBUG - wsprintf(buf,"RECV: %ls %ls\r\n", - telstates[con->telstate-LOW_TEL_OPT],teloptions[*st]); - OutputDebugString(buf); + wsprintf(buf,"RECV: %s %s\r\n", + telstates[con->telstate-TELCMD_FIRST],teloptions[*st]); + OutputDebugString(buf); #endif - switch(*st) { + switch(*st) { #ifdef NOT - case BINARY: /* DO: binary transmission */ - if(!tw->ibinary) { /* binary */ - if(!tw->iwantbinary) { - netprintf(tw->pnum,"%c%c%c", - IAC,WILLTEL,BINARY); - if(tw->condebug>0) - tprintf(cv,"SEND: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end if */ - else - tw->iwantbinary=0; /* turn off this now */ - tw->ibinary=1; - } /* end if */ - else { - if(tw->condebug>0) - tprintf(cv,"NO REPLY NEEDED: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end else */ - break; -#endif - - case SGA: /* DO: Suppress go-ahead */ - if(!con->igoahead) { /* suppress go-ahead */ - wsprintf(buf,"%c%c%c",IAC,WILLTEL,SGA); - TelnetSend(ks,buf,lstrlen(buf),0); + case TELOPT_BINARY: /* DO: binary transmission */ + if(!tw->ibinary) { /* binary */ + if(!tw->iwantbinary) { + netprintf(tw->pnum,"%c%c%c", + IAC,WILL,BINARY); + if(tw->condebug>0) + tprintf(cv,"SEND: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[BINARY]); + } /* end if */ + else + tw->iwantbinary=0; /* turn off this now */ + tw->ibinary=1; + } /* end if */ + else { + if(tw->condebug>0) + tprintf(cv,"NO REPLY NEEDED: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[BINARY]); + } /* end else */ + break; +#endif + + case TELOPT_SGA: /* DO: Suppress go-ahead */ + if(!con->igoahead) { /* suppress go-ahead */ + wsprintf(buf,"%c%c%c",IAC,WILL,TELOPT_SGA); + TelnetSend(ks,buf,lstrlen(buf),0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[SGA]); - OutputDebugString(strTmp); - OutputDebugString("igoahead"); -#endif - con->igoahead=1; - } /* end if */ - else { + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_SGA]); + OutputDebugString(strTmp); + OutputDebugString("igoahead"); +#endif + con->igoahead=1; + } /* end if */ + else { #ifdef NEGOTIATEDEBUG - wsprintf(strTmp, - "NO REPLY NEEDED: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[SGA]); - OutputDebugString(strTmp); -#endif - } /* end else */ - break; - - case TERMTYPE: /* DO: terminal type negotiation */ - if(!con->termsent) { - con->termsent=TRUE; - wsprintf(buf,"%c%c%c",IAC,WILLTEL,TERMTYPE); - TelnetSend(ks,buf,lstrlen(buf),0); + wsprintf(strTmp, + "NO REPLY NEEDED: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_SGA]); + OutputDebugString(strTmp); +#endif + } /* end else */ + break; + + case TELOPT_TTYPE: /* DO: terminal type negotiation */ + if(!con->termsent) { + con->termsent=TRUE; + wsprintf(buf,"%c%c%c",IAC,WILL,TELOPT_TTYPE); + TelnetSend(ks,buf,lstrlen(buf),0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[TERMTYPE]); - OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_TTYPE]); + OutputDebugString(strTmp); #endif - } /* end if */ - else { + } /* end if */ + else { #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"NO REPLY NEEDED: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[TERMTYPE]); - OutputDebugString(strTmp); + wsprintf(strTmp,"NO REPLY NEEDED: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_TTYPE]); + OutputDebugString(strTmp); #endif - } /* end else */ - break; + } /* end else */ + break; #ifdef LATER - case LINEMODE: /* DO: linemode negotiation */ - tw->lmflag=1; /* set the linemode flag */ - netprintf(tw->pnum,"%c%c%c",IAC,WILLTEL,LINEMODE); - /* - ** Tell the other side to send us - ** it's default character set - */ - netprintf(tw->pnum,"%c%c%c%c", - IAC,SB,LINEMODE,SLC,0,SLC_DEFAULT,0,IAC,SE); - if(tw->condebug>0) { - tprintf(cv,"SEND: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[LINEMODE]); - tprintf(cv, - "SEND: SB LINEMODE SLC 0 SLC_DEFAULT 0 IAC SE\r\n"); - } /* end if */ - break; -#endif - case NAWS: /* DO: Negotiate About Window Size */ - con->bResizeable=TRUE; - send_naws(con); - break; - - case AUTHENTICATION: /* DO: Authentication requested */ - wsprintf(buf,"%c%c%c",IAC,WILLTEL,AUTHENTICATION); - TelnetSend(ks,buf,lstrlen(buf),0); + case TELOPT_LINEMODE: /* DO: linemode negotiation */ + tw->lmflag=1; /* set the linemode flag */ + netprintf(tw->pnum,"%c%c%c",IAC,WILL,TELOPT_LINEMODE); + /* + * Tell the other side to send us + * its default character set + */ + netprintf(tw->pnum,"%c%c%c%c", + IAC,SB,TELOPT_LINEMODE,SLC,0,SLC_DEFAULT,0,IAC,SE); + if(tw->condebug>0) { + tprintf(cv,"SEND: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_LINEMODE]); + tprintf(cv, + "SEND: SB LINEMODE SLC 0 SLC_DEFAULT 0 IAC SE\r\n"); + } /* end if */ + break; +#endif + case TELOPT_NAWS: /* DO: Negotiate About Window Size */ + con->bResizeable=TRUE; + send_naws(con); + break; + + case TELOPT_AUTHENTICATION: /* DO: Authentication requested */ + wsprintf(buf, "%c%c%c", IAC, WILL, TELOPT_AUTHENTICATION); + TelnetSend(ks, buf, lstrlen(buf), 0); +#ifdef NEGOTIATEDEBUG + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[WILL - TELCMD_FIRST], + teloptions[TELOPT_AUTHENTICATION]); + OutputDebugString(strTmp); +#endif + break; + +#ifdef ENCRYPTION + case TELOPT_ENCRYPT: /* DO: Remote is willing to receive encrypted */ + wsprintf(buf, "%c%c%c", IAC, + (encrypt_flag ? WILL : WONT), TELOPT_ENCRYPT); + TelnetSend(ks, buf, lstrlen(buf), 0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[WILLTEL-LOW_TEL_OPT], - teloptions[AUTHENTICATION]); - OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[(encrypt_flag ? WILL : WONT) + - TELCMD_FIRST], + teloptions[TELOPT_ENCRYPT]); + OutputDebugString(strTmp); #endif - break; + break; +#endif /* ENCRYPTION */ - default: /* DO: */ - wsprintf(buf,"%c%c%c",IAC,WONTTEL,*st); - TelnetSend(ks,buf,lstrlen(buf),0); + default: /* DO: */ + wsprintf(buf, "%c%c%c", IAC, WONT, *st); + TelnetSend(ks, buf, lstrlen(buf), 0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[WONTTEL-LOW_TEL_OPT],teloptions[*st]); - OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[WONT - TELCMD_FIRST], teloptions[*st]); + OutputDebugString(strTmp); #endif - break; + break; - } /* end switch */ - con->telstate=STNORM; - orig=++st; - break; + } /* end switch */ + con->telstate = STNORM; + orig = ++st; + break; - case DONTTEL: /* Received a telnet DONT option */ - if (*st==NAWS) - con->bResizeable=FALSE; + case DONT: /* Received a telnet DONT option */ + switch (*st) { + case TELOPT_NAWS: + con->bResizeable=FALSE; #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"RECV: %ls %ls\r\n", - telstates[con->telstate-LOW_TEL_OPT],teloptions[*st]); - OutputDebugString(strTmp); + wsprintf(strTmp,"RECV: %s %s\r\n", + telstates[con->telstate-TELCMD_FIRST],teloptions[*st]); + OutputDebugString(strTmp); #endif + break; #ifdef NOT - if((*st)==BINARY) { /* DONT: check for binary neg. */ - if(tw->ibinary) { /* binary */ - if(!tw->iwantbinary) { - netprintf(tw->pnum,"%c%c%c",IAC,WONTTEL,BINARY); - if(tw->condebug>0) - tprintf(cv,"SEND: %ls %ls\r\n", - telstates[WONTTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end if */ - else - tw->iwantbinary=0; /* turn off this now */ - tw->ibinary=0; - tw->mapoutput=0; /* turn output mapping off */ - } /* end if */ + case BINARY: /* DONT: check for binary neg. */ + if(tw->ibinary) { /* binary */ + if(!tw->iwantbinary) { + netprintf(tw->pnum,"%c%c%c",IAC,WONT,BINARY); + if(tw->condebug>0) + tprintf(cv,"SEND: %s %s\r\n", + telstates[WONT-TELCMD_FIRST], + teloptions[BINARY]); + } /* end if */ + else + tw->iwantbinary=0; /* turn off this now */ + tw->ibinary=0; + tw->mapoutput=0; /* turn output mapping off */ + } /* end if */ #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"NO REPLY NEEDED: %ls %ls\r\n", - telstates[WONTTEL-LOW_TEL_OPT], - teloptions[BINARY]); - OutputDebugString(strTmp); + wsprintf(strTmp,"NO REPLY NEEDED: %s %s\r\n", + telstates[WONT-TELCMD_FIRST], + teloptions[BINARY]); + OutputDebugString(strTmp); #endif - } + break; #endif - con->telstate=STNORM; - orig=++st; - break; - - case WILLTEL: /* received a telnet WILL option */ +#ifdef ENCRYPTION + case ENCRYPTION: + break; +#endif + } + + /* all these just fall through to here... */ + + con->telstate=STNORM; + orig=++st; + break; + + case WILL: /* received a telnet WILL option */ #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"RECV: %ls %ls\r\n", - telstates[con->telstate-LOW_TEL_OPT], - teloptions[*st]); - OutputDebugString(strTmp); + wsprintf(strTmp,"RECV: %s %s\r\n", + telstates[con->telstate-TELCMD_FIRST], + teloptions[*st]); + OutputDebugString(strTmp); #endif - switch(*st) { + switch(*st) { #ifdef NOT - case BINARY: /* WILL: binary */ - if(!tw->ubinary) { /* binary */ - if(!tw->uwantbinary) { - netprintf(tw->pnum,"%c%c%c", - IAC,DOTEL,BINARY); - if(tw->condebug>0) - tprintf(cv,"SEND: %ls %ls\r\n", - telstates[DOTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end if */ - else - tw->uwantbinary=0; /* turn off this now */ - tw->ubinary=1; - } /* end if */ - else { - if(tw->condebug>0) - tprintf(cv,"NO REPLY NEEDED: %ls %ls\r\n", - telstates[DOTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end else */ - break; -#endif - - case SGA: /* WILL: suppress go-ahead */ - if(!con->ugoahead) { - con->ugoahead=1; - wsprintf(buf,"%c%c%c",IAC,DOTEL,SGA); /* ack */ - TelnetSend(ks,buf,lstrlen(buf),0); + case TELOPT_BINARY: /* WILL: binary */ + if(!tw->ubinary) { /* binary */ + if(!tw->uwantbinary) { + netprintf(tw->pnum,"%c%c%c", + IAC,DO,TELOPT_BINARY); + if(tw->condebug>0) + tprintf(cv,"SEND: %s %s\r\n", + telstates[DO - TELCMD_FIRST], + teloptions[TELOPT_BINARY]); + } /* end if */ + else + tw->uwantbinary=0; /* turn off this now */ + tw->ubinary=1; + } /* end if */ + else { + if(tw->condebug>0) + tprintf(cv,"NO REPLY NEEDED: %s %s\r\n", + telstates[DO - TELCMD_FIRST], + teloptions[TELOPT_BINARY]); + } /* end else */ + break; +#endif + + case TELOPT_SGA: /* WILL: suppress go-ahead */ + if(!con->ugoahead) { + con->ugoahead=1; + wsprintf(buf,"%c%c%c",IAC,DO,TELOPT_SGA); /* ack */ + TelnetSend(ks,buf,lstrlen(buf),0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[DOTEL-LOW_TEL_OPT], - teloptions[SGA]); - OutputDebugString(strTmp); -#endif - } /* end if */ - break; - - case ECHO: /* WILL: echo */ - if(!con->echo) { - con->echo=1; - wsprintf(buf,"%c%c%c",IAC,DOTEL,ECHO); /* ack */ - TelnetSend(ks,buf,lstrlen(buf),0); + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[DO - TELCMD_FIRST], + teloptions[TELOPT_SGA]); + OutputDebugString(strTmp); +#endif + } /* end if */ + break; + + case TELOPT_ECHO: /* WILL: echo */ + if(!con->echo) { + con->echo = 1; + wsprintf(buf, "%c%c%c", IAC, DO, TELOPT_ECHO); /* ack */ + TelnetSend(ks, buf, lstrlen(buf), 0); #ifdef NEGOTIATEDEBUG - - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[DOTEL-LOW_TEL_OPT], - teloptions[ECHO]); - OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[DO - TELCMD_FIRST], + teloptions[TELOPT_ECHO]); + OutputDebugString(strTmp); #endif - } /* end if */ - break; - - case TIMING: /* WILL: Timing mark */ - con->timing=0; - break; + } /* end if */ + break; + + case TELOPT_TM: /* WILL: Timing mark */ + con->timing=0; + break; +#ifdef ENCRYPTION + case TELOPT_ENCRYPT: /* WILL: decrypt our input */ + wsprintf(buf, "%c%c%c", IAC, + (encrypt_flag ? DO : DONT), TELOPT_ENCRYPT); + TelnetSend(ks, buf, lstrlen(buf), 0); + if (encrypt_flag) + encrypt_send_support(); - default: - wsprintf(buf,"%c%c%c",IAC,DONTTEL,*st); - TelnetSend(ks,buf,lstrlen(buf),0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[DONTTEL-LOW_TEL_OPT],teloptions[*st]); - OutputDebugString(strTmp); + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[(encrypt_flag ? DO : DONT) - TELCMD_FIRST], + teloptions[TELOPT_ENCRYPT]); + OutputDebugString(strTmp); +#endif + break; +#endif + + default: + wsprintf(buf,"%c%c%c",IAC,DONT,*st); + TelnetSend(ks,buf,lstrlen(buf),0); +#ifdef NEGOTIATEDEBUG + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[DONT-TELCMD_FIRST],teloptions[*st]); + OutputDebugString(strTmp); #endif - break; - } /* end switch */ - con->telstate=STNORM; - orig=++st; - break; + break; + } /* end switch */ + con->telstate=STNORM; + orig=++st; + break; - case WONTTEL: /* Received a telnet WONT option */ + case WONT: /* Received a telnet WONT option */ #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"RECV: %ls %ls\r\n", - telstates[con->telstate-LOW_TEL_OPT],teloptions[*st]); - OutputDebugString((LPSTR)strTmp); + wsprintf(strTmp,"RECV: %s %s\r\n", + telstates[con->telstate-TELCMD_FIRST],teloptions[*st]); + OutputDebugString((LPSTR)strTmp); #endif - con->telstate=STNORM; - switch(*st++) { /* which option? */ + con->telstate=STNORM; + switch(*st++) { /* which option? */ #ifdef NOT - case BINARY: /* WONT: binary */ - if(tw->ubinary) { /* binary */ - if(!tw->uwantbinary) { - netprintf(tw->pnum,"%c%c%c", - IAC,DONTTEL,BINARY); - if(tw->condebug>0) - tprintf(cv,"SEND: %ls %ls\r\n", - telstates[DONTTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end if */ - else - tw->uwantbinary=0; /* turn off this now */ - tw->ubinary=0; - tw->mapoutput=0; /* turn output mapping off */ - } /* end if */ - else { - if(tw->condebug>0) - tprintf(cv,"NO REPLY NEEDED: %ls %ls\r\n", - telstates[DONTTEL-LOW_TEL_OPT], - teloptions[BINARY]); - } /* end else */ - break; - -#endif - case ECHO: /* WONT: echo */ - if(con->echo) { - con->echo=0; - wsprintf(buf,"%c%c%c",IAC,DONTTEL,ECHO); - TelnetSend(ks,buf,lstrlen(buf),0); + case BINARY: /* WONT: binary */ + if(tw->ubinary) { /* binary */ + if(!tw->uwantbinary) { + netprintf(tw->pnum,"%c%c%c", + IAC,DONT,BINARY); + if(tw->condebug>0) + tprintf(cv,"SEND: %s %s\r\n", + telstates[DONT-TELCMD_FIRST], + teloptions[BINARY]); + } /* end if */ + else + tw->uwantbinary=0; /* turn off this now */ + tw->ubinary=0; + tw->mapoutput=0; /* turn output mapping off */ + } /* end if */ + else { + if(tw->condebug>0) + tprintf(cv,"NO REPLY NEEDED: %s %s\r\n", + telstates[DONT-TELCMD_FIRST], + teloptions[BINARY]); + } /* end else */ + break; + +#endif + case TELOPT_ECHO: /* WONT: echo */ + if(con->echo) { + con->echo=0; + wsprintf(buf,"%c%c%c",IAC,DONT,TELOPT_ECHO); + TelnetSend(ks,buf,lstrlen(buf),0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SEND: %ls %ls\r\n", - telstates[DONTTEL-LOW_TEL_OPT], - teloptions[ECHO]); - OutputDebugString(strTmp); - OutputDebugString("Other side won't echo!"); -#endif - } /* end if */ - break; - - case TIMING: /* WONT: Telnet timing mark option */ - con->timing=0; - break; - - default: - break; - } /* end switch */ - orig=st; - break; - - case SB: /* telnet sub-options negotiation */ -// OutputDebugString("[SB]"); - con->telstate=NEGOTIATE; - orig=st; - end_sub=0; - sub_pos=con->substate=0; /* Defined for each */ + wsprintf(strTmp,"SEND: %s %s\r\n", + telstates[DONT-TELCMD_FIRST], + teloptions[TELOPT_ECHO]); + OutputDebugString(strTmp); + OutputDebugString("Other side won't echo!"); +#endif + } /* end if */ + break; + + case TELOPT_TM: /* WONT: Telnet timing mark option */ + con->timing=0; + break; + +#ifdef ENCRYPTION + case TELOPT_ENCRYPT: /* WONT: don't encrypt our input */ + break; +#endif + + default: + break; + } /* end switch */ + orig=st; + break; + + case SB: /* telnet sub-options negotiation */ + con->telstate=NEGOTIATE; + orig=st; + end_sub=0; + sub_pos=con->substate=0; /* Defined for each */ #ifdef OLD_WAY - break; + break; #endif - case NEGOTIATE: -// OutputDebugString("[NEG:"); -// OutputDebugString(st); + case NEGOTIATE: /* until we change sub-negotiation states, accumulate bytes */ - if(con->substate==0) { - if(*st==IAC) { /* check if we found an IAC byte */ - if(*(st+1)==IAC) { /* skip over double IAC's */ - st++; - parsedat[sub_pos++]=*st++; - } /* end if */ - else { - end_sub=sub_pos; - con->substate=*st++; - } /* end else */ - } /* end if */ - else /* otherwise, just stash the byte */ - parsedat[sub_pos++]=*st++; - } /* end if */ - else { - con->substate=*st++; - /* check if we've really ended the sub-negotiations */ - if(con->substate==SE) - parse_subnegotiat(ks,end_sub); - orig=st; - con->telstate=STNORM; - } /* end else */ - break; - - default: - con->telstate=STNORM; - break; - } /* end switch */ - } /* end while */ - -/* -* quick scan of the remaining string, skip chars while they are -* uninteresting -*/ - if(con->telstate==STNORM && st<mark) { -/* -* skip along as fast as possible until an interesting character is found -*/ - while(st<mark && *st!=27 && *st!=IAC) { -// if(!tw->ubinary) -// *st&=127; /* mask off high bit */ - st++; - } /* end while */ -// if(!tw->timing) -// parsewrite(tw,orig,st-orig); - orig=st; /* forget what we have sent already */ - if(st<mark) - switch(*st) { - case IAC: /* telnet IAC */ - con->telstate=IACFOUND; - st++; - break; - - default: -#ifdef NEGOTIATEDEBUG -// wsprintf(buf," strange char>128\r\n"); -// OutputDebugString(buf); + if(con->substate==0) { + if(*st==IAC) { /* check if we found an IAC byte */ + if(*(st+1)==IAC) { /* skip over double IAC's */ + st++; + parsedat[sub_pos++]=*st++; + } /* end if */ + else { + end_sub=sub_pos; + con->substate=*st++; + } /* end else */ + } /* end if */ + else /* otherwise, just stash the byte */ + parsedat[sub_pos++]=*st++; + } /* end if */ + else { + con->substate=*st++; + /* check if we've really ended the sub-negotiations */ + if(con->substate==SE) + parse_subnegotiat(ks,end_sub); + + orig=st; + /* + * XXX hack to decrypt the rest of the buffer + */ + if (encrypt_flag == 2) { + decrypt_ks_hack(orig, mark - orig); + encrypt_flag = 1; + } + + con->telstate=STNORM; + } /* end else */ + break; + + default: + con->telstate=STNORM; + break; + } /* end switch */ + } /* end while */ + + /* + * quick scan of the remaining string, skip chars while they are + * uninteresting + */ + if(con->telstate==STNORM && st<mark) { + /* + * skip along as fast as possible until an interesting character is found + */ + while(st<mark && *st!=27 && *st!=IAC) { +#if 0 + if(!tw->ubinary) + *st&=127; /* mask off high bit */ #endif - st++; - break; - } /* end switch */ - } /* end if */ + st++; } /* end while */ +#if 0 + if(!tw->timing) + parsewrite(tw,orig,st-orig); +#endif + orig=st; /* forget what we have sent already */ + if(st<mark) + switch(*st) { + case IAC: /* telnet IAC */ + con->telstate=IACFOUND; + st++; + break; + + default: +#ifdef NEGOTIATEDEBUG + wsprintf(buf," strange char>128 0x%x\r\n", *st); + OutputDebugString(buf); +#endif + st++; + break; + } /* end switch */ + } /* end if */ + } /* end while */ } /* end parse() */ - -/*+******************************************************************** -* Function : parse_subnegotiat() -* Purpose : Parse the telnet sub-negotiations read into the parsedat -* array. -* Parameters : -* end_sub - index of the character in the 'parsedat' array which -* is the last byte in a sub-negotiation -* Returns : none -* Calls : -* Called by : parse() -**********************************************************************/ +/* + * Function : parse_subnegotiat() + * Purpose : Parse the telnet sub-negotiations read into the parsedat + * array. + * Parameters : + * end_sub - index of the character in the 'parsedat' array which + * is the last byte in a sub-negotiation + * Returns : none + * Calls : + * Called by : parse() + */ static void -parse_subnegotiat(kstream ks,int end_sub) { - char buf[128]; - -// OutputDebugString("INTO SUBNEGOTIATE"); - switch(parsedat[0]) { - case TERMTYPE: -// OutputDebugString(":INTO TERMTYPE"); - if(parsedat[1]==1) { -/* QAK!!! */ wsprintf(buf,"%c%c%c%cvt100%c%c",IAC,SB,TERMTYPE,0,IAC,SE); - TelnetSend(ks,(LPSTR)buf,11,0); +parse_subnegotiat(kstream ks, int end_sub) +{ + char buf[128]; + + switch(parsedat[0]) { + case TELOPT_TTYPE: + if(parsedat[1]==1) { + /* QAK!!! */ wsprintf(buf,"%c%c%c%cvt100%c%c",IAC,SB,TELOPT_TTYPE, + 0,IAC,SE); + TelnetSend(ks,(LPSTR)buf,11,0); #ifdef NEGOTIATEDEBUG - wsprintf(strTmp,"SB TERMINAL-TYPE SEND\r\n" - "SEND: SB TERMINAL-TYPE IS vt100 \r\n len=%d \r\n", - lstrlen((LPSTR)buf)); -// OutputDebugString(strTmp); + wsprintf(strTmp,"SB TERMINAL-TYPE SEND\r\n" + "SEND: SB TERMINAL-TYPE IS vt100 \r\n len=%d \r\n", + lstrlen((LPSTR)buf)); + OutputDebugString(strTmp); #endif - } - break; - - case AUTHENTICATION: - auth_parse(ks, parsedat, end_sub); - break; - default: - break; - } /* end switch */ + } + break; + + case TELOPT_AUTHENTICATION: + auth_parse(ks, parsedat, end_sub); + break; +#ifdef ENCRYPTION + case TELOPT_ENCRYPT: + if (encrypt_flag) + encrypt_parse(ks, parsedat, end_sub); + break; +#endif + default: + break; + } /* end switch */ } /* parse_subnegotiat */ -/*+******************************************************************** -* Function : send_naws -* Purpose : Send a window size sub-negotiation. -* Parameters : -* ks - the kstream to send to. -* Returns : none -**********************************************************************/ +/* + * Function : send_naws + * Purpose : Send a window size sub-negotiation. + * Parameters : + * ks - the kstream to send to. + * Returns : none + */ void send_naws(CONNECTION *con) { - unsigned char buf[40]; - int len; + unsigned char buf[40]; + int len; - wsprintf(buf, "%c%c%c", IAC, SB, NAWS); - len = 3; + wsprintf(buf, "%c%c%c", IAC, SB, TELOPT_NAWS); + len = 3; - buf[len++] = HIBYTE(con->width); - if (buf[len-1] == IAC) buf[len++] = IAC; + buf[len++] = HIBYTE(con->width); + if (buf[len-1] == IAC) buf[len++] = IAC; - buf[len++] = LOBYTE(con->width); - if (buf[len-1] == IAC) buf[len++] = IAC; + buf[len++] = LOBYTE(con->width); + if (buf[len-1] == IAC) buf[len++] = IAC; - buf[len++] = HIBYTE(con->height); - if (buf[len-1] == IAC) buf[len++] = IAC; + buf[len++] = HIBYTE(con->height); + if (buf[len-1] == IAC) buf[len++] = IAC; - buf[len++] = LOBYTE(con->height); - if (buf[len-1] == IAC) buf[len++] = IAC; + buf[len++] = LOBYTE(con->height); + if (buf[len-1] == IAC) buf[len++] = IAC; - buf[len++] = IAC; - buf[len++] = SE; + buf[len++] = IAC; + buf[len++] = SE; - TelnetSend(con->ks, buf, len, 0); + TelnetSend(con->ks, buf, len, 0); - #ifdef NEGOTIATEDEBUG - wsprintf(buf, "SEND: SB NAWS %d %d %d %d IAC SE\r\n", - HIBYTE(con->width), LOBYTE(con->width), - HIBYTE(con->height), LOBYTE(con->height)); - OutputDebugString(buf); - #endif +#ifdef NEGOTIATEDEBUG + wsprintf(buf, "SEND: SB NAWS %d %d %d %d IAC SE\r\n", + HIBYTE(con->width), LOBYTE(con->width), + HIBYTE(con->height), LOBYTE(con->height)); + OutputDebugString(buf); +#endif } /* send_naws */ |