aboutsummaryrefslogtreecommitdiff
path: root/src/init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/init.cpp')
-rw-r--r--src/init.cpp236
1 files changed, 103 insertions, 133 deletions
diff --git a/src/init.cpp b/src/init.cpp
index dbc2c41332..76317557bc 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -4,7 +4,7 @@
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
#include "headers.h"
#include "db.h"
-#include "rpc.h"
+#include "bitcoinrpc.h"
#include "net.h"
#include "init.h"
#include "strlcpy.h"
@@ -12,6 +12,16 @@
#include <boost/filesystem/fstream.hpp>
#include <boost/interprocess/sync/file_lock.hpp>
+#if defined(BITCOIN_NEED_QT_PLUGINS) && !defined(_BITCOIN_QT_PLUGINS_INCLUDED)
+#define _BITCOIN_QT_PLUGINS_INCLUDED
+#define __INSURE__
+#include <QtPlugin>
+Q_IMPORT_PLUGIN(qcncodecs)
+Q_IMPORT_PLUGIN(qjpcodecs)
+Q_IMPORT_PLUGIN(qtwcodecs)
+Q_IMPORT_PLUGIN(qkrcodecs)
+#endif
+
using namespace std;
using namespace boost;
@@ -24,7 +34,7 @@ CWallet* pwalletMain;
void ExitTimeout(void* parg)
{
-#ifdef __WXMSW__
+#ifdef WIN32
Sleep(5000);
ExitProcess(0);
#endif
@@ -34,8 +44,8 @@ void Shutdown(void* parg)
{
static CCriticalSection cs_Shutdown;
static bool fTaken;
- bool fFirstThread;
- CRITICAL_BLOCK(cs_Shutdown)
+ bool fFirstThread = false;
+ TRY_CRITICAL_BLOCK(cs_Shutdown)
{
fFirstThread = !fTaken;
fTaken = true;
@@ -80,7 +90,7 @@ void HandleSIGTERM(int)
//
// Start
//
-#ifndef GUI
+#if !defined(QT_GUI)
int main(int argc, char* argv[])
{
bool fRet = false;
@@ -121,10 +131,10 @@ bool AppInit2(int argc, char* argv[])
// Disable confusing "helpful" text message on abort, ctrl-c
_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
#endif
-#ifndef __WXMSW__
+#ifndef WIN32
umask(077);
#endif
-#ifndef __WXMSW__
+#ifndef WIN32
// Clean shutdown on SIGTERM
struct sigaction sa;
sa.sa_handler = HandleSIGTERM;
@@ -162,73 +172,81 @@ bool AppInit2(int argc, char* argv[])
string strUsage = string() +
_("Bitcoin version") + " " + FormatFullVersion() + "\n\n" +
_("Usage:") + "\t\t\t\t\t\t\t\t\t\t\n" +
- " bitcoin [options] \t " + "\n" +
- " bitcoin [options] <command> [params]\t " + _("Send command to -server or bitcoind\n") +
- " bitcoin [options] help \t\t " + _("List commands\n") +
- " bitcoin [options] help <command> \t\t " + _("Get help for a command\n") +
- _("Options:\n") +
- " -conf=<file> \t\t " + _("Specify configuration file (default: bitcoin.conf)\n") +
- " -pid=<file> \t\t " + _("Specify pid file (default: bitcoind.pid)\n") +
- " -gen \t\t " + _("Generate coins\n") +
- " -gen=0 \t\t " + _("Don't generate coins\n") +
- " -min \t\t " + _("Start minimized\n") +
- " -datadir=<dir> \t\t " + _("Specify data directory\n") +
- " -timeout=<n> \t " + _("Specify connection timeout (in milliseconds)\n") +
- " -proxy=<ip:port> \t " + _("Connect through socks4 proxy\n") +
- " -dns \t " + _("Allow DNS lookups for addnode and connect\n") +
- " -addnode=<ip> \t " + _("Add a node to connect to\n") +
- " -connect=<ip> \t\t " + _("Connect only to the specified node\n") +
- " -nolisten \t " + _("Don't accept connections from outside\n") +
+ " bitcoind [options] \t " + "\n" +
+ " bitcoind [options] <command> [params]\t " + _("Send command to -server or bitcoind") + "\n" +
+ " bitcoind [options] help \t\t " + _("List commands") + "\n" +
+ " bitcoind [options] help <command> \t\t " + _("Get help for a command") + "\n" +
+ _("Options:") + "\n" +
+ " -conf=<file> \t\t " + _("Specify configuration file (default: bitcoin.conf)") + "\n" +
+ " -pid=<file> \t\t " + _("Specify pid file (default: bitcoind.pid)") + "\n" +
+ " -gen \t\t " + _("Generate coins") + "\n" +
+ " -gen=0 \t\t " + _("Don't generate coins") + "\n" +
+ " -min \t\t " + _("Start minimized") + "\n" +
+ " -datadir=<dir> \t\t " + _("Specify data directory") + "\n" +
+ " -timeout=<n> \t " + _("Specify connection timeout (in milliseconds)") + "\n" +
+ " -proxy=<ip:port> \t " + _("Connect through socks4 proxy") + "\n" +
+ " -dns \t " + _("Allow DNS lookups for addnode and connect") + "\n" +
+ " -port=<port> \t\t " + _("Listen for connections on <port> (default: 8333 or testnet: 18333)") + "\n" +
+ " -maxconnections=<n>\t " + _("Maintain at most <n> connections to peers (default: 125)") + "\n" +
+ " -addnode=<ip> \t " + _("Add a node to connect to") + "\n" +
+ " -connect=<ip> \t\t " + _("Connect only to the specified node") + "\n" +
+ " -nolisten \t " + _("Don't accept connections from outside") + "\n" +
+ " -nodnsseed \t " + _("Don't bootstrap list of peers using DNS") + "\n" +
+ " -banscore=<n> \t " + _("Threshold for disconnecting misbehaving peers (default: 100)") + "\n" +
+ " -bantime=<n> \t " + _("Number of seconds to keep misbehaving peers from reconnecting (default: 86400)") + "\n" +
+ " -maxreceivebuffer=<n>\t " + _("Maximum per-connection receive buffer, <n>*1000 bytes (default: 10000)") + "\n" +
+ " -maxsendbuffer=<n>\t " + _("Maximum per-connection send buffer, <n>*1000 bytes (default: 10000)") + "\n" +
#ifdef USE_UPNP
#if USE_UPNP
- " -noupnp \t " + _("Don't attempt to use UPnP to map the listening port\n") +
+ " -noupnp \t " + _("Don't attempt to use UPnP to map the listening port") + "\n" +
#else
- " -upnp \t " + _("Attempt to use UPnP to map the listening port\n") +
+ " -upnp \t " + _("Attempt to use UPnP to map the listening port") + "\n" +
#endif
#endif
- " -paytxfee=<amt> \t " + _("Fee per KB to add to transactions you send\n") +
+ " -paytxfee=<amt> \t " + _("Fee per KB to add to transactions you send") + "\n" +
#ifdef GUI
- " -server \t\t " + _("Accept command line and JSON-RPC commands\n") +
+ " -server \t\t " + _("Accept command line and JSON-RPC commands") + "\n" +
#endif
-#ifndef __WXMSW__
- " -daemon \t\t " + _("Run in the background as a daemon and accept commands\n") +
+#ifndef WIN32
+ " -daemon \t\t " + _("Run in the background as a daemon and accept commands") + "\n" +
#endif
- " -testnet \t\t " + _("Use the test network\n") +
- " -rpcuser=<user> \t " + _("Username for JSON-RPC connections\n") +
- " -rpcpassword=<pw>\t " + _("Password for JSON-RPC connections\n") +
- " -rpcport=<port> \t\t " + _("Listen for JSON-RPC connections on <port> (default: 8332)\n") +
- " -rpcallowip=<ip> \t\t " + _("Allow JSON-RPC connections from specified IP address\n") +
- " -rpcconnect=<ip> \t " + _("Send commands to node running on <ip> (default: 127.0.0.1)\n") +
- " -keypool=<n> \t " + _("Set key pool size to <n> (default: 100)\n") +
- " -rescan \t " + _("Rescan the block chain for missing wallet transactions\n");
+ " -testnet \t\t " + _("Use the test network") + "\n" +
+ " -debug \t\t " + _("Output extra debugging information") + "\n" +
+ " -logtimestamps \t " + _("Prepend debug output with timestamp") + "\n" +
+ " -printtoconsole \t " + _("Send trace/debug info to console instead of debug.log file") + "\n" +
+#ifdef WIN32
+ " -printtodebugger \t " + _("Send trace/debug info to debugger") + "\n" +
+#endif
+ " -rpcuser=<user> \t " + _("Username for JSON-RPC connections") + "\n" +
+ " -rpcpassword=<pw>\t " + _("Password for JSON-RPC connections") + "\n" +
+ " -rpcport=<port> \t\t " + _("Listen for JSON-RPC connections on <port> (default: 8332)") + "\n" +
+ " -rpcallowip=<ip> \t\t " + _("Allow JSON-RPC connections from specified IP address") + "\n" +
+ " -rpcconnect=<ip> \t " + _("Send commands to node running on <ip> (default: 127.0.0.1)") + "\n" +
+ " -keypool=<n> \t " + _("Set key pool size to <n> (default: 100)") + "\n" +
+ " -rescan \t " + _("Rescan the block chain for missing wallet transactions") + "\n";
#ifdef USE_SSL
strUsage += string() +
- _("\nSSL options: (see the Bitcoin Wiki for SSL setup instructions)\n") +
- " -rpcssl \t " + _("Use OpenSSL (https) for JSON-RPC connections\n") +
- " -rpcsslcertificatechainfile=<file.cert>\t " + _("Server certificate file (default: server.cert)\n") +
- " -rpcsslprivatekeyfile=<file.pem> \t " + _("Server private key (default: server.pem)\n") +
- " -rpcsslciphers=<ciphers> \t " + _("Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)\n");
+ _("\nSSL options: (see the Bitcoin Wiki for SSL setup instructions)") + "\n" +
+ " -rpcssl \t " + _("Use OpenSSL (https) for JSON-RPC connections") + "\n" +
+ " -rpcsslcertificatechainfile=<file.cert>\t " + _("Server certificate file (default: server.cert)") + "\n" +
+ " -rpcsslprivatekeyfile=<file.pem> \t " + _("Server private key (default: server.pem)") + "\n" +
+ " -rpcsslciphers=<ciphers> \t " + _("Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)") + "\n";
#endif
strUsage += string() +
- " -? \t\t " + _("This help message\n");
+ " -? \t\t " + _("This help message") + "\n";
-#if defined(__WXMSW__) && defined(GUI)
- // Tabs make the columns line up in the message box
- wxMessageBox(strUsage, "Bitcoin", wxOK);
-#else
// Remove tabs
strUsage.erase(std::remove(strUsage.begin(), strUsage.end(), '\t'), strUsage.end());
fprintf(stderr, "%s", strUsage.c_str());
-#endif
return false;
}
fDebug = GetBoolArg("-debug");
fAllowDNS = GetBoolArg("-dns");
-#ifndef __WXMSW__
+#ifndef WIN32
fDaemon = GetBoolArg("-daemon");
#else
fDaemon = false;
@@ -240,10 +258,9 @@ bool AppInit2(int argc, char* argv[])
fServer = GetBoolArg("-server");
/* force fServer when running without GUI */
-#ifndef GUI
+#if !defined(QT_GUI)
fServer = true;
#endif
-
fPrintToConsole = GetBoolArg("-printtoconsole");
fPrintToDebugger = GetBoolArg("-printtodebugger");
@@ -252,6 +269,7 @@ bool AppInit2(int argc, char* argv[])
fNoListen = GetBoolArg("-nolisten") || fTOR;
fLogTimestamps = GetBoolArg("-logtimestamps");
+#ifndef QT_GUI
for (int i = 1; i < argc; i++)
if (!IsSwitchChar(argv[i][0]))
fCommandLine = true;
@@ -261,8 +279,9 @@ bool AppInit2(int argc, char* argv[])
int ret = CommandLineRPC(argc, argv);
exit(ret);
}
+#endif
-#ifndef __WXMSW__
+#ifndef WIN32
if (fDaemon)
{
// Daemonize
@@ -288,11 +307,6 @@ bool AppInit2(int argc, char* argv[])
ShrinkDebugFile();
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("Bitcoin version %s\n", FormatFullVersion().c_str());
-#ifdef GUI
- printf("OS version %s\n", ((string)wxGetOsDescription()).c_str());
- printf("System default language is %d %s\n", g_locale.GetSystemLanguage(), ((string)g_locale.GetSysName()).c_str());
- printf("Language file %s (%s)\n", (string("locale/") + (string)g_locale.GetCanonicalName() + "/LC_MESSAGES/bitcoin.mo").c_str(), ((string)g_locale.GetLocale()).c_str());
-#endif
printf("Default data directory %s\n", GetDefaultDataDir().c_str());
if (GetBoolArg("-loadblockindextest"))
@@ -303,46 +317,6 @@ bool AppInit2(int argc, char* argv[])
return false;
}
- //
- // Limit to single instance per user
- // Required to protect the database files if we're going to keep deleting log.*
- //
-#if defined(__WXMSW__) && defined(GUI)
- // wxSingleInstanceChecker doesn't work on Linux
- wxString strMutexName = wxString("bitcoin_running.") + getenv("HOMEPATH");
- for (int i = 0; i < strMutexName.size(); i++)
- if (!isalnum(strMutexName[i]))
- strMutexName[i] = '.';
- wxSingleInstanceChecker* psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);
- if (psingleinstancechecker->IsAnotherRunning())
- {
- printf("Existing instance found\n");
- unsigned int nStart = GetTime();
- loop
- {
- // Show the previous instance and exit
- HWND hwndPrev = FindWindowA("wxWindowClassNR", "Bitcoin");
- if (hwndPrev)
- {
- if (IsIconic(hwndPrev))
- ShowWindow(hwndPrev, SW_RESTORE);
- SetForegroundWindow(hwndPrev);
- return false;
- }
-
- if (GetTime() > nStart + 60)
- return false;
-
- // Resume this instance if the other exits
- delete psingleinstancechecker;
- Sleep(1000);
- psingleinstancechecker = new wxSingleInstanceChecker(strMutexName);
- if (!psingleinstancechecker->IsAnotherRunning())
- break;
- }
- }
-#endif
-
// Make sure only a single bitcoin process is using the data directory.
string strLockFile = GetDataDir() + "/.lock";
FILE* file = fopen(strLockFile.c_str(), "a"); // empty lock file; created if it doesn't exist.
@@ -355,36 +329,39 @@ bool AppInit2(int argc, char* argv[])
}
// Bind to the port early so we can tell if another instance is already running.
- string strErrors;
if (!fNoListen)
{
- if (!BindListenPort(strErrors))
+ std::string strError;
+ if (!BindListenPort(strError))
{
- wxMessageBox(strErrors, "Bitcoin");
+ wxMessageBox(strError, "Bitcoin");
return false;
}
}
+ std::ostringstream strErrors;
//
// Load data files
//
if (fDaemon)
fprintf(stdout, "bitcoin server starting\n");
- strErrors = "";
int64 nStart;
+ InitMessage(_("Loading addresses..."));
printf("Loading addresses...\n");
nStart = GetTimeMillis();
if (!LoadAddresses())
- strErrors += _("Error loading addr.dat \n");
+ strErrors << _("Error loading addr.dat") << "\n";
printf(" addresses %15"PRI64d"ms\n", GetTimeMillis() - nStart);
+ InitMessage(_("Loading block index..."));
printf("Loading block index...\n");
nStart = GetTimeMillis();
if (!LoadBlockIndex())
- strErrors += _("Error loading blkindex.dat \n");
+ strErrors << _("Error loading blkindex.dat") << "\n";
printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);
+ InitMessage(_("Loading wallet..."));
printf("Loading wallet...\n");
nStart = GetTimeMillis();
bool fFirstRun;
@@ -393,11 +370,17 @@ bool AppInit2(int argc, char* argv[])
if (nLoadWalletRet != DB_LOAD_OK)
{
if (nLoadWalletRet == DB_CORRUPT)
- strErrors += _("Error loading wallet.dat: Wallet corrupted \n");
+ strErrors << _("Error loading wallet.dat: Wallet corrupted") << "\n";
else if (nLoadWalletRet == DB_TOO_NEW)
- strErrors += _("Error loading wallet.dat: Wallet requires newer version of Bitcoin \n");
+ strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin") << "\n";
+ else if (nLoadWalletRet == DB_NEED_REWRITE)
+ {
+ strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
+ wxMessageBox(strErrors.str(), "Bitcoin", wxOK | wxICON_ERROR);
+ return false;
+ }
else
- strErrors += _("Error loading wallet.dat \n");
+ strErrors << _("Error loading wallet.dat") << "\n";
}
printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart);
@@ -415,24 +398,26 @@ bool AppInit2(int argc, char* argv[])
}
if (pindexBest != pindexRescan)
{
+ InitMessage(_("Rescanning..."));
printf("Rescanning last %i blocks (from block %i)...\n", pindexBest->nHeight - pindexRescan->nHeight, pindexRescan->nHeight);
nStart = GetTimeMillis();
pwalletMain->ScanForWalletTransactions(pindexRescan, true);
printf(" rescan %15"PRI64d"ms\n", GetTimeMillis() - nStart);
}
+ InitMessage(_("Done loading"));
printf("Done loading\n");
- //// debug print
- printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size());
- printf("nBestHeight = %d\n", nBestHeight);
- printf("setKeyPool.size() = %d\n", pwalletMain->setKeyPool.size());
- printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size());
- printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size());
+ //// debug print
+ printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size());
+ printf("nBestHeight = %d\n", nBestHeight);
+ printf("setKeyPool.size() = %d\n", pwalletMain->setKeyPool.size());
+ printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size());
+ printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size());
- if (!strErrors.empty())
+ if (!strErrors.str().empty())
{
- wxMessageBox(strErrors, "Bitcoin", wxOK | wxICON_ERROR);
+ wxMessageBox(strErrors.str(), "Bitcoin", wxOK | wxICON_ERROR);
return false;
}
@@ -502,11 +487,6 @@ bool AppInit2(int argc, char* argv[])
}
}
- if (GetBoolArg("-nodnsseed"))
- printf("DNS seeding disabled\n");
- else
- DNSAddressSeed();
-
if (mapArgs.count("-paytxfee"))
{
if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee))
@@ -530,30 +510,20 @@ bool AppInit2(int argc, char* argv[])
}
//
- // Create the main window and start the node
+ // Start the node
//
-#ifdef GUI
- if (!fDaemon)
- CreateMainWindow();
-#endif
-
if (!CheckDiskSpace())
return false;
RandAddSeedPerfmon();
if (!CreateThread(StartNode, NULL))
- wxMessageBox("Error: CreateThread(StartNode) failed", "Bitcoin");
+ wxMessageBox(_("Error: CreateThread(StartNode) failed"), "Bitcoin");
if (fServer)
CreateThread(ThreadRPCServer, NULL);
-#if defined(__WXMSW__) && defined(GUI)
- if (fFirstRun)
- SetStartOnSystemStartup(true);
-#endif
-
-#ifndef GUI
+#if !defined(QT_GUI)
while (1)
Sleep(5000);
#endif