X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fcommand_client.cpp;fp=src%2Fcommand_client.cpp;h=376d3f965fd1d44e36c3bd7817a55285505db74b;hp=77daf0dd47afd1e9e5c3339285de603e1bcd2da9;hb=b2ba092858a40fc42afba6b529d5b97bcba363e2;hpb=45a2ebc9695c4d7be6548b7e0f800d117ae56a0b diff --git a/src/command_client.cpp b/src/command_client.cpp index 77daf0d..376d3f9 100644 --- a/src/command_client.cpp +++ b/src/command_client.cpp @@ -67,30 +67,97 @@ std::string command_client::read_packet(const long long &usec_timeout) void command_client::read_hello() { - istringstream hello(read_packet(hello_timeout_usec)); + string resultpacket; + bool got_packet=false; + long long my_timeout=hello_timeout_usec; + while(!(got_packet=c.get_packet(resultpacket)) && my_timeout > 0 && !c.is_closed()) + { + c.fill_buffer(my_timeout,&my_timeout); + + c.peek_packet(resultpacket); + check_hello(resultpacket); // will throw before timeout if wrong data received + } + + if (!got_packet) + throw t2n_transfer_error("timeout exceeded"); + + if (!check_hello(resultpacket)) + throw t2n_version_mismatch("illegal hello received (incomplete): "+resultpacket); +} + +bool command_client::check_hello(const string& hellostr) +{ + istringstream hello(hellostr); - char chk[5]; - hello.read(chk,4); - chk[4]=0; - if (hello.fail() || hello.eof() || string("T2Nv") != chk) - throw t2n_version_mismatch("illegal hello received (T2N)"); + char chk; + + if (hello.read(&chk,1)) + { + if (chk != 'T') + throw t2n_version_mismatch("illegal hello received (T2N)"); + } + else + return false; + + if (hello.read(&chk,1)) + { + if (chk != '2') + throw t2n_version_mismatch("illegal hello received (T2N)"); + } + else + return false; + + if (hello.read(&chk,1)) + { + if (chk != 'N') + throw t2n_version_mismatch("illegal hello received (T2N)"); + } + else + return false; + + if (hello.read(&chk,1)) + { + if (chk != 'v') + throw t2n_version_mismatch("illegal hello received (T2N)"); + } + else + return false; int prot_version; - hello >> prot_version; - if (hello.fail() || hello.eof() || prot_version != PROTOCOL_VERSION) - throw t2n_version_mismatch("not compatible with the server protocol version"); + if (hello >> prot_version) + { + if (prot_version != PROTOCOL_VERSION) + throw t2n_version_mismatch("not compatible with the server protocol version"); + } + else + return false; + + if (hello.read(&chk,1)) + { + if (chk != ';') + throw t2n_version_mismatch("illegal hello received (1. ;)"); + } + else + return false; - hello.read(chk,1); - if (hello.fail() || hello.eof() || chk[0] != ';') - throw t2n_version_mismatch("illegal hello received (1. ;)"); + unsigned int hbo; + if (hello.read((char*)&hbo,sizeof(hbo))) + { + if (hbo != 1) + throw t2n_version_mismatch("host byte order not matching"); + } + else + return false; - hello.read(chk,4); - if (hello.fail() || hello.eof() || *((int*)chk) != 1) - throw t2n_version_mismatch("host byte order not matching"); + if (hello.read(&chk,1)) + { + if (chk != ';') + throw t2n_version_mismatch("illegal hello received (2. ;)"); + } + else + return false; - hello.read(chk,1); - if (hello.fail() || hello.eof() || chk[0] != ';') - throw t2n_version_mismatch("illegal hello received (2. ;)"); + return true; } void command_client::send_command(command* cmd, result_container &res)