// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2011 The Bitcoin developers
+// Copyright (c) 2009-2012 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
#pragma pack(push, 1)
struct ircaddr
{
- int ip;
+ struct in_addr ip;
short port;
};
#pragma pack(pop)
-string EncodeAddress(const CAddress& addr)
+string EncodeAddress(const CService& addr)
{
struct ircaddr tmp;
- tmp.ip = addr.ip;
- tmp.port = addr.port;
+ if (addr.GetInAddr(&tmp.ip))
+ {
+ tmp.port = htons(addr.GetPort());
- vector<unsigned char> vch(UBEGIN(tmp), UEND(tmp));
- return string("u") + EncodeBase58Check(vch);
+ vector<unsigned char> vch(UBEGIN(tmp), UEND(tmp));
+ return string("u") + EncodeBase58Check(vch);
+ }
+ return "";
}
-bool DecodeAddress(string str, CAddress& addr)
+bool DecodeAddress(string str, CService& addr)
{
vector<unsigned char> vch;
if (!DecodeBase58Check(str.substr(1), vch))
return false;
memcpy(&tmp, &vch[0], sizeof(tmp));
- addr = CAddress(tmp.ip, ntohs(tmp.port), NODE_NETWORK);
+ addr = CService(tmp.ip, ntohs(tmp.port));
return true;
}
return true;
}
-bool RecvLine(SOCKET hSocket, string& strLine)
-{
- strLine = "";
- loop
- {
- char c;
- int nBytes = recv(hSocket, &c, 1, 0);
- if (nBytes > 0)
- {
- if (c == '\n')
- continue;
- if (c == '\r')
- return true;
- strLine += c;
- if (strLine.size() >= 9000)
- return true;
- }
- else if (nBytes <= 0)
- {
- if (fShutdown)
- return false;
- if (nBytes < 0)
- {
- int nErr = WSAGetLastError();
- if (nErr == WSAEMSGSIZE)
- continue;
- if (nErr == WSAEWOULDBLOCK || nErr == WSAEINTR || nErr == WSAEINPROGRESS)
- {
- Sleep(10);
- continue;
- }
- }
- if (!strLine.empty())
- return true;
- if (nBytes == 0)
- {
- // socket closed
- printf("IRC socket closed\n");
- return false;
- }
- else
- {
- // socket error
- int nErr = WSAGetLastError();
- printf("IRC recv failed: %d\n", nErr);
- return false;
- }
- }
- }
-}
-
bool RecvLineIRC(SOCKET hSocket, string& strLine)
{
loop
}
}
-bool GetIPFromIRC(SOCKET hSocket, string strMyName, unsigned int& ipRet)
+bool GetIPFromIRC(SOCKET hSocket, string strMyName, CNetAddr& ipRet)
{
Send(hSocket, strprintf("USERHOST %s\r", strMyName.c_str()).c_str());
printf("GetIPFromIRC() got userhost %s\n", strHost.c_str());
if (fUseProxy)
return false;
- CAddress addr(strHost, 0, true);
+ CNetAddr addr(strHost, true);
if (!addr.IsValid())
return false;
- ipRet = addr.ip;
+ ipRet = addr;
return true;
}
if (mapArgs.count("-connect") || fNoListen)
return;
- if (GetBoolArg("-noirc"))
+ if (!GetBoolArg("-irc", false))
return;
+
printf("ThreadIRCSeed started\n");
int nErrorWait = 10;
int nRetryWait = 10;
while (!fShutdown)
{
- CAddress addrConnect("92.243.23.21", 6667); // irc.lfnet.org
+ CService addrConnect("92.243.23.21", 6667); // irc.lfnet.org
- CAddress addrIRC("irc.lfnet.org", 6667, true);
+ CService addrIRC("irc.lfnet.org", 6667, true);
if (addrIRC.IsValid())
addrConnect = addrIRC;
Sleep(500);
// Get our external IP from the IRC server and re-nick before joining the channel
- CAddress addrFromIRC;
- if (GetIPFromIRC(hSocket, strMyName, addrFromIRC.ip))
+ CNetAddr addrFromIRC;
+ if (GetIPFromIRC(hSocket, strMyName, addrFromIRC))
{
- printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToStringIP().c_str());
+ printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToString().c_str());
if (!fUseProxy && addrFromIRC.IsRoutable())
{
// IRC lets you to re-nick
fGotExternalIP = true;
- addrLocalHost.ip = addrFromIRC.ip;
+ addrLocalHost.SetIP(addrFromIRC);
strMyName = EncodeAddress(addrLocalHost);
Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
}
if (DecodeAddress(pszName, addr))
{
addr.nTime = GetAdjustedTime();
- if (AddAddress(addr, 51 * 60))
+ if (addrman.Add(addr, addrConnect, 51 * 60))
printf("IRC got new address: %s\n", addr.ToString().c_str());
nGotIRCAddresses++;
}