// Copyright (c) 2009-2010 Satoshi Nakamoto
// 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.
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include "headers.h"
#include "irc.h"
-#include "net.h"
#include "strlcpy.h"
+#include "base58.h"
+#include "net.h"
using namespace std;
using namespace boost;
int nGotIRCAddresses = 0;
-bool fGotExternalIP = false;
void ThreadIRCSeed2(void* parg);
struct ircaddr
{
struct in_addr ip;
- short port;
+ unsigned short port;
};
#pragma pack(pop)
bool RecvLineIRC(SOCKET hSocket, string& strLine)
{
- loop
+ while (true)
{
bool fRet = RecvLine(hSocket, strLine);
if (fRet)
int RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL, const char* psz4=NULL)
{
- loop
+ while (true)
{
string strLine;
strLine.reserve(10000);
if (!RecvLineIRC(hSocket, strLine))
return 0;
printf("IRC %s\n", strLine.c_str());
- if (psz1 && strLine.find(psz1) != -1)
+ if (psz1 && strLine.find(psz1) != string::npos)
return 1;
- if (psz2 && strLine.find(psz2) != -1)
+ if (psz2 && strLine.find(psz2) != string::npos)
return 2;
- if (psz3 && strLine.find(psz3) != -1)
+ if (psz3 && strLine.find(psz3) != string::npos)
return 3;
- if (psz4 && strLine.find(psz4) != -1)
+ if (psz4 && strLine.find(psz4) != string::npos)
return 4;
}
}
bool RecvCodeLine(SOCKET hSocket, const char* psz1, string& strRet)
{
strRet.clear();
- loop
+ while (true)
{
string strLine;
if (!RecvLineIRC(hSocket, strLine))
// Hybrid IRC used by lfnet always returns IP when you userhost yourself,
// but in case another IRC is ever used this should work.
printf("GetIPFromIRC() got userhost %s\n", strHost.c_str());
- if (fUseProxy)
- return false;
CNetAddr addr(strHost, true);
if (!addr.IsValid())
return false;
void ThreadIRCSeed(void* parg)
{
- IMPLEMENT_RANDOMIZE_STACK(ThreadIRCSeed(parg));
+ // Make this thread recognisable as the IRC seeding thread
+ RenameThread("novacoin-ircseed");
+
try
{
ThreadIRCSeed2(parg);
} catch (...) {
PrintExceptionContinue(NULL, "ThreadIRCSeed()");
}
- printf("ThreadIRCSeed exiting\n");
+ printf("ThreadIRCSeed exited\n");
}
void ThreadIRCSeed2(void* parg)
{
- /* Dont advertise on IRC if we don't allow incoming connections */
- if (mapArgs.count("-connect") || fNoListen)
+ // Don't connect to IRC if we won't use IPv4 connections.
+ if (IsLimited(NET_IPV4))
return;
- if (!GetBoolArg("-irc", false))
+ // ... or if we won't make outbound connections and won't accept inbound ones.
+ if (mapArgs.count("-connect") && fNoListen)
+ return;
+
+ // ... or if IRC is not enabled.
+ if (!GetBoolArg("-irc", true))
return;
printf("ThreadIRCSeed started\n");
int nErrorWait = 10;
int nRetryWait = 10;
- bool fNameInUse = false;
+ int nNameRetry = 0;
while (!fShutdown)
{
return;
}
+ CNetAddr addrIPv4("1.2.3.4"); // arbitrary IPv4 address to make GetLocal prefer IPv4 addresses
+ CService addrLocal;
string strMyName;
- if (addrLocalHost.IsRoutable() && !fUseProxy && !fNameInUse)
- strMyName = EncodeAddress(addrLocalHost);
- else
- strMyName = strprintf("x%u", GetRand(1000000000));
+ // Don't use our IP as our nick if we're not listening
+ // or if it keeps failing because the nick is already in use.
+ if (!fNoListen && GetLocal(addrLocal, &addrIPv4) && nNameRetry<3)
+ strMyName = EncodeAddress(GetLocalAddress(&addrConnect));
+ if (strMyName == "")
+ strMyName = strprintf("x%" PRIu64 "", GetRand(1000000000));
Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
Send(hSocket, strprintf("USER %s 8 * : %s\r", strMyName.c_str(), strMyName.c_str()).c_str());
if (nRet == 2)
{
printf("IRC name already in use\n");
- fNameInUse = true;
+ nNameRetry++;
Wait(10);
continue;
}
else
return;
}
+ nNameRetry = 0;
Sleep(500);
// Get our external IP from the IRC server and re-nick before joining the channel
if (GetIPFromIRC(hSocket, strMyName, addrFromIRC))
{
printf("GetIPFromIRC() returned %s\n", addrFromIRC.ToString().c_str());
- if (!fUseProxy && addrFromIRC.IsRoutable())
+ // Don't use our IP as our nick if we're not listening
+ if (!fNoListen && addrFromIRC.IsRoutable())
{
// IRC lets you to re-nick
- fGotExternalIP = true;
- addrLocalHost.SetIP(addrFromIRC);
- strMyName = EncodeAddress(addrLocalHost);
+ AddLocal(addrFromIRC, LOCAL_IRC);
+ strMyName = EncodeAddress(GetLocalAddress(&addrConnect));
Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
}
}
-
+
if (fTestNet) {
- Send(hSocket, "JOIN #bitcoinTEST\r");
- Send(hSocket, "WHO #bitcoinTEST\r");
+ Send(hSocket, "JOIN #novacoinTEST2\r");
+ Send(hSocket, "WHO #novacoinTEST2\r");
} else {
- // randomly join #bitcoin00-#bitcoin99
- int channel_number = GetRandInt(100);
- Send(hSocket, strprintf("JOIN #bitcoin%02d\r", channel_number).c_str());
- Send(hSocket, strprintf("WHO #bitcoin%02d\r", channel_number).c_str());
+ // randomly join #novacoin00-#novacoin05
+ // int channel_number = GetRandInt(5);
+
+ // Channel number is always 0 for initial release
+ int channel_number = 0;
+ Send(hSocket, strprintf("JOIN #novacoin%02d\r", channel_number).c_str());
+ Send(hSocket, strprintf("WHO #novacoin%02d\r", channel_number).c_str());
}
- int64 nStart = GetTime();
+ int64_t nStart = GetTime();
string strLine;
strLine.reserve(10000);
while (!fShutdown && RecvLineIRC(hSocket, strLine))
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++;
}