[Com0com-cvs] com2tcp telnet.cpp,1.1,1.2 telnet.h,1.1,1.2 utils.h,1.2,1.3 com2tcp.cpp,1.5,1.6
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2005-06-10 15:55:20
|
Update of /cvsroot/com0com/com2tcp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29968 Modified Files: telnet.cpp telnet.h utils.h com2tcp.cpp Log Message: Implemented --terminal option Index: com2tcp.cpp =================================================================== RCS file: /cvsroot/com0com/com2tcp/com2tcp.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** com2tcp.cpp 8 Jun 2005 15:48:17 -0000 1.5 --- com2tcp.cpp 10 Jun 2005 15:55:10 -0000 1.6 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2005/06/10 15:55:10 vfrolov + * Implemented --terminal option + * * Revision 1.5 2005/06/08 15:48:17 vfrolov * Implemented --awak-seq option *************** *** 38,47 **** */ ! #include <winsock2.h> ! #include <windows.h> ! ! #include <stdio.h> ! ! #include "utils.h" #include "telnet.h" --- 41,45 ---- */ ! #include "precomp.h" #include "telnet.h" *************** *** 596,599 **** --- 594,598 ---- fprintf(stderr, "Options:\n"); fprintf(stderr, " --telnet - use Telnet protocol.\n"); + fprintf(stderr, " --terminal type - use terminal type.\n"); fprintf(stderr, " --awak-seq sequence - wait awakening sequence from com port.\n"); exit(1); *************** *** 603,606 **** --- 602,606 ---- { enum {prNone, prTelnet} protocol = prNone; + const char *pTermType = NULL; const BYTE *pAwakSeq = NULL; char **pArgs = &argv[1]; *************** *** 615,618 **** --- 615,625 ---- argc--; } else + if (!strcmp(*pArgs, "--terminal")) { + pArgs++; + argc--; + pTermType = *pArgs; + pArgs++; + argc--; + } else if (!strcmp(*pArgs, "--awak-seq")) { pArgs++; *************** *** 651,654 **** --- 658,662 ---- case prTelnet: pProtocol = new TelnetProtocol(10, 10); + ((TelnetProtocol *)pProtocol)->SetTerminalType(pTermType); break; default: Index: telnet.cpp =================================================================== RCS file: /cvsroot/com0com/com2tcp/telnet.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** telnet.cpp 6 Jun 2005 15:19:02 -0000 1.1 --- telnet.cpp 10 Jun 2005 15:55:10 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2005/06/10 15:55:10 vfrolov + * Implemented --terminal option + * * Revision 1.1 2005/06/06 15:19:02 vfrolov * Initial revision *************** *** 26,38 **** */ ! #include <winsock2.h> ! #include <windows.h> ! ! #include <stdio.h> ! ! #include "utils.h" #include "telnet.h" /////////////////////////////////////////////////////////////// enum { cdWILL = 251, cdWONT = 252, --- 29,39 ---- */ ! #include "precomp.h" #include "telnet.h" + /////////////////////////////////////////////////////////////// enum { + cdSE = 240, + cdSB = 250, cdWILL = 251, cdWONT = 252, *************** *** 45,48 **** --- 46,55 ---- { switch (code) { + case cdSE: + return "SE"; + break; + case cdSB: + return "SB"; + break; case cdWILL: return "WILL"; *************** *** 62,66 **** /////////////////////////////////////////////////////////////// enum { ! opEcho = 1, }; /////////////////////////////////////////////////////////////// --- 69,74 ---- /////////////////////////////////////////////////////////////// enum { ! opEcho = 1, ! opTerminalType = 24, }; /////////////////////////////////////////////////////////////// *************** *** 69,72 **** --- 77,82 ---- stCode, stOption, + stSubParams, + stSubCode, }; /////////////////////////////////////////////////////////////// *************** *** 75,79 **** --- 85,103 ---- state(stData) { + SetTerminalType(NULL); + options[opEcho].remoteOptionState = OptionState::osNo; + options[opTerminalType].localOptionState = OptionState::osNo; + } + + void TelnetProtocol::SetTerminalType(const char *pTerminalType) + { + terminalType.clear(); + + if (!pTerminalType) + pTerminalType = "UNKNOWN"; + + while (*pTerminalType) + terminalType.push_back(*pTerminalType++); } *************** *** 95,98 **** --- 119,123 ---- WriteRaw(&ch, 1); break; + case cdSB: case cdWILL: case cdWONT: *************** *** 110,113 **** --- 135,143 ---- printf("RECV: %s %u\n", code2name(code), (unsigned)ch); switch (code) { + case cdSB: + option = ch; + params.clear(); + state = stSubParams; + break; case cdWILL: switch (options[ch].remoteOptionState) { *************** *** 159,166 **** break; default: ! printf("RECV: %u %u (ignore)\n", (unsigned)code, (unsigned)ch); ! }; ! state = stData; ! break; } } --- 189,234 ---- break; default: ! printf(" ignored\n"); ! }; ! if (state == stOption) ! state = stData; ! break; ! case stSubParams: ! if (ch == cdIAC) ! state = stSubCode; ! else ! params.push_back(ch); ! break; ! case stSubCode: ! switch (ch) { ! case cdIAC: ! state = stSubParams; ! break; ! case cdSE: ! printf(" "); ! { ! for (BYTE_vector::const_iterator i = params.begin() ; i != params.end() ; i++) ! printf("%u ", (unsigned)*i); ! } ! printf("SE\n"); ! ! switch (option) { ! case opTerminalType: ! params.clear(); ! params.push_back(0); ! params.insert(params.end(), terminalType.begin(), terminalType.end()); ! SendSubNegotiation(option, params); ! break; ! default: ! printf(" ignored\n"); ! } ! ! state = stData; ! break; ! default: ! printf("RECV: unknown sub code %u\n", (unsigned)ch); ! state = stData; ! }; ! break; } } *************** *** 177,179 **** --- 245,263 ---- SendRaw(buf, sizeof(buf)); } + + void TelnetProtocol::SendSubNegotiation(int option, const BYTE_vector ¶ms) + { + SendOption(cdSB, (BYTE)option); + + printf(" "); + for (BYTE_vector::const_iterator i = params.begin() ; i != params.end() ; i++) { + printf("%u ", (unsigned)*i); + SendRaw(i, 1); + } + printf("SE\n"); + + BYTE buf[2] = {cdIAC, cdSE}; + + SendRaw(buf, sizeof(buf)); + } /////////////////////////////////////////////////////////////// Index: telnet.h =================================================================== RCS file: /cvsroot/com0com/com2tcp/telnet.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** telnet.h 6 Jun 2005 15:19:02 -0000 1.1 --- telnet.h 10 Jun 2005 15:55:10 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2005/06/10 15:55:10 vfrolov + * Implemented --terminal option + * * Revision 1.1 2005/06/06 15:19:02 vfrolov * Initial revision *************** *** 34,46 **** public: TelnetProtocol(int _thresholdSend = 0, int _thresholdWrite = 0); - //virtual int Send(const void *pBuf, int count); virtual int Write(const void *pBuf, int count); - protected: void SendOption(BYTE code, BYTE option); int state; int code; struct OptionState --- 37,51 ---- public: TelnetProtocol(int _thresholdSend = 0, int _thresholdWrite = 0); + void SetTerminalType(const char *pTerminalType); virtual int Write(const void *pBuf, int count); protected: void SendOption(BYTE code, BYTE option); + void SendSubNegotiation(int option, const BYTE_vector ¶ms); int state; int code; + int option; + BYTE_vector params; struct OptionState *************** *** 53,57 **** OptionState options[256]; ! DataStream toTelnet; }; /////////////////////////////////////////////////////////////// --- 58,62 ---- OptionState options[256]; ! BYTE_vector terminalType; }; /////////////////////////////////////////////////////////////// Index: utils.h =================================================================== RCS file: /cvsroot/com0com/com2tcp/utils.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** utils.h 8 Jun 2005 07:40:23 -0000 1.2 --- utils.h 10 Jun 2005 15:55:10 -0000 1.3 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.3 2005/06/10 15:55:10 vfrolov + * Implemented --terminal option + * * Revision 1.2 2005/06/08 07:40:23 vfrolov * Added missing DataStream::busy initialization *************** *** 33,36 **** --- 36,41 ---- /////////////////////////////////////////////////////////////// + typedef vector< BYTE, allocator<BYTE> > BYTE_vector; + /////////////////////////////////////////////////////////////// class ChunkStream { |