/*
* Author :
* Boris Mikhailenko <stg34@stargazer.dp.ua>
-* Maxim Mamontov <faust@stargazer.dp.ua>
+* Maksym Mamontov <stg@madf.info>
* Andrey Rakhmanov <andrey_rakhmanov@yahoo.com> - bugfixes.
*/
}
//---------------------------------------------------------------------------
#endif
+
+namespace
+{
+
+bool HostNameToIP(const std::string & hostName, uint32_t & ip)
+{
+ip = inet_addr(hostName.c_str());
+if (ip == INADDR_NONE)
+ {
+ hostent * phe = gethostbyname(hostName.c_str());
+ if (phe)
+ {
+ ip = *((uint32_t *)phe->h_addr_list[0]);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+return true;
+}
+
+}
+
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
-IA_CLIENT_PROT::IA_CLIENT_PROT(const string & sn, unsigned short p, uint16_t localPort)
+IA_CLIENT_PROT::IA_CLIENT_PROT(const std::string & sn, unsigned short p,
+ const std::string & ln, uint16_t lp)
: action(IA_NONE),
phase(1),
phaseTime(0),
serverName(sn),
port(p),
ip(0),
- localPort(localPort),
+ localName(ln),
+ localPort(lp),
firstConnect(true),
reconnect(0),
sockr(0),
//---------------------------------------------------------------------------
void IA_CLIENT_PROT::PrepareNet()
{
-struct hostent * phe;
+/*struct hostent * phe;
unsigned long ip;
ip = inet_addr(serverName.c_str());
if (pErrorCb != NULL)
pErrorCb(strError, IA_GETHOSTBYNAME_ERROR, errorCbData);
}
+ }*/
+
+if (!HostNameToIP(serverName, ip))
+ {
+ ip = 0;
+ strError = std::string("Unknown host ") + "\'" + serverName + "\'";
+ codeError = IA_GETHOSTBYNAME_ERROR;
+ if (pErrorCb != NULL)
+ pErrorCb(strError, IA_GETHOSTBYNAME_ERROR, errorCbData);
+ return;
}
#ifndef WIN32
localAddrR.sin_port = htons(localPort);
else
localAddrR.sin_port = htons(port);
-localAddrR.sin_addr.s_addr = inet_addr("0.0.0.0");
+
+if (!localName.empty())
+ {
+ if (!HostNameToIP(localName, localIP))
+ {
+ strError = std::string("Unknown host ") + "\'" + serverName + "\'";
+ codeError = IA_GETHOSTBYNAME_ERROR;
+ if (pErrorCb != NULL)
+ pErrorCb(strError, IA_GETHOSTBYNAME_ERROR, errorCbData);
+ localIP = INADDR_ANY;
+ }
+ }
+else
+ {
+ localIP = INADDR_ANY;
+ }
+
+localAddrR.sin_addr.s_addr = localIP;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(port);
#ifdef WIN32
unsigned long arg = 1;
-res = ioctlsocket(sockr, FIONBIO, &arg);
+ioctlsocket(sockr, FIONBIO, &arg);
#else
if (0 != fcntl(sockr, F_SETFL, O_NONBLOCK))
{
//---------------------------------------------------------------------------
int IA_CLIENT_PROT::DeterminatePacketType(const char * buffer)
{
-map<string, int>::iterator pi;
+std::map<std::string, int>::iterator pi;
pi = packetTypes.find(buffer);
if (pi == packetTypes.end())
{
}
int db = sizeof(HDR_8);
-for (int i = 0; i < IA_LOGIN_LEN/8; i++)
- {
- EncodeString(buffer + db + i * 8, buffer + db + i * 8, &ctxHdr);
- }
+EncryptString(buffer + db, buffer + db, IA_LOGIN_LEN, &ctxHdr);
db += IA_LOGIN_LEN;
-int encLen = (len - sizeof(HDR_8) - IA_LOGIN_LEN)/8;
-for (int i = 0; i < encLen; i++)
- {
- EncodeString(buffer + db, buffer + db, &ctxPass);
- db += 8;
- }
+int encLen = (len - sizeof(HDR_8) - IA_LOGIN_LEN);
+EncryptString(buffer + db, buffer + db, encLen, &ctxPass);
return sendto(sockr, buffer, len, 0, (struct sockaddr*)&servAddr, sizeof(servAddr));
}
return res;
if (strcmp(buffer + 4 + sizeof(HDR_8), "ERR"))
- {
- for (int i = 0; i < len / 8; i++)
- DecodeString(buffer + i * 8, buffer + i * 8, &ctxPass);
- }
+ DecryptString(buffer, buffer, len, &ctxPass);
return 0;
}
memcpy(ls, &stat, sizeof(stat));
}
//---------------------------------------------------------------------------
-void IA_CLIENT_PROT::SetServer(const string & sn, unsigned short p)
+void IA_CLIENT_PROT::SetServer(const std::string & sn, unsigned short p)
{
serverName = sn;
port = p;
PrepareNet();
}
//---------------------------------------------------------------------------
-void IA_CLIENT_PROT::SetLogin(const string & l)
+void IA_CLIENT_PROT::SetLogin(const std::string & l)
{
login = l;
}
//---------------------------------------------------------------------------
-void IA_CLIENT_PROT::SetPassword(const string & p)
+void IA_CLIENT_PROT::SetPassword(const std::string & p)
{
password = p;
return 0;
}
//---------------------------------------------------------------------------
-int IA_CLIENT_PROT::GetStrError(string * error) const
+int IA_CLIENT_PROT::GetStrError(std::string * error) const
{
int ret = codeError;
*error = strError;
//---------------------------------------------------------------------------
int IA_CLIENT_PROT::Process_CONN_SYN_ACK_8(const char * buffer)
{
-vector<string> dirNames;
+std::vector<std::string> dirNames;
connSynAck8 = (CONN_SYN_ACK_8*)buffer;
#ifdef ARCH_BE