aboutsummaryrefslogtreecommitdiff
path: root/src/init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/init.cpp')
-rw-r--r--src/init.cpp78
1 files changed, 59 insertions, 19 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 83870f9f8..7ed2613f7 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -14,6 +14,7 @@
#include <boost/filesystem/convenience.hpp>
#include <boost/interprocess/sync/file_lock.hpp>
#include <boost/algorithm/string/predicate.hpp>
+#include <openssl/crypto.h>
#ifndef WIN32
#include <signal.h>
@@ -45,7 +46,7 @@ void StartShutdown()
uiInterface.QueueShutdown();
#else
// Without UI, Shutdown() can simply be started in a new thread
- CreateThread(Shutdown, NULL);
+ NewThread(Shutdown, NULL);
#endif
}
@@ -77,12 +78,12 @@ void Shutdown(void* parg)
boost::filesystem::remove(GetPidFile());
UnregisterWallet(pwalletMain);
delete pwalletMain;
- CreateThread(ExitTimeout, NULL);
+ NewThread(ExitTimeout, NULL);
Sleep(50);
printf("Bitcoin exited\n\n");
fExit = true;
#ifndef QT_GUI
- // ensure non UI client get's exited here, but let Bitcoin-Qt reach return 0; in bitcoin.cpp
+ // ensure non-UI client gets exited here, but let Bitcoin-Qt reach 'return 0;' in bitcoin.cpp
exit(0);
#endif
}
@@ -216,6 +217,7 @@ bool static Bind(const CService &addr, bool fError = true) {
std::string HelpMessage()
{
string strUsage = _("Options:") + "\n" +
+ " -? " + _("This help message") + "\n" +
" -conf=<file> " + _("Specify configuration file (default: bitcoin.conf)") + "\n" +
" -pid=<file> " + _("Specify pid file (default: bitcoind.pid)") + "\n" +
" -gen " + _("Generate coins") + "\n" +
@@ -223,7 +225,7 @@ std::string HelpMessage()
" -datadir=<dir> " + _("Specify data directory") + "\n" +
" -dbcache=<n> " + _("Set database cache size in megabytes (default: 25)") + "\n" +
" -dblogsize=<n> " + _("Set database disk log size in megabytes (default: 100)") + "\n" +
- " -timeout=<n> " + _("Specify connection timeout (in milliseconds)") + "\n" +
+ " -timeout=<n> " + _("Specify connection timeout in milliseconds (default: 5000)") + "\n" +
" -proxy=<ip:port> " + _("Connect through socks proxy") + "\n" +
" -socks=<n> " + _("Select the version of socks proxy to use (4-5, default: 5)") + "\n" +
" -tor=<ip:port> " + _("Use proxy to reach tor hidden services (default: same as -proxy)") + "\n"
@@ -263,13 +265,14 @@ std::string HelpMessage()
" -debug " + _("Output extra debugging information. Implies all other -debug* options") + "\n" +
" -debugnet " + _("Output extra network debugging information") + "\n" +
" -logtimestamps " + _("Prepend debug output with timestamp") + "\n" +
+ " -shrinkdebugfile " + _("Shrink debug.log file on client startup (default: 1 when no -debug)") + "\n" +
" -printtoconsole " + _("Send trace/debug info to console instead of debug.log file") + "\n" +
#ifdef WIN32
" -printtodebugger " + _("Send trace/debug info to debugger") + "\n" +
#endif
" -rpcuser=<user> " + _("Username for JSON-RPC connections") + "\n" +
" -rpcpassword=<pw> " + _("Password for JSON-RPC connections") + "\n" +
- " -rpcport=<port> " + _("Listen for JSON-RPC connections on <port> (default: 8332)") + "\n" +
+ " -rpcport=<port> " + _("Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)") + "\n" +
" -rpcallowip=<ip> " + _("Allow JSON-RPC connections from specified IP address") + "\n" +
" -rpcconnect=<ip> " + _("Send commands to node running on <ip> (default: 127.0.0.1)") + "\n" +
" -blocknotify=<cmd> " + _("Execute command when the best block changes (%s in cmd is replaced by block hash)") + "\n" +
@@ -279,10 +282,13 @@ std::string HelpMessage()
" -checkblocks=<n> " + _("How many blocks to check at startup (default: 2500, 0 = all)") + "\n" +
" -checklevel=<n> " + _("How thorough the block verification is (0-6, default: 1)") + "\n" +
" -loadblock=<file> " + _("Imports blocks from external blk000?.dat file") + "\n" +
- " -? " + _("This help message") + "\n";
- strUsage += string() +
- _("\nSSL options: (see the Bitcoin Wiki for SSL setup instructions)") + "\n" +
+ "\n" + _("Block creation options:") + "\n" +
+ " -blockminsize=<n> " + _("Set minimum block size in bytes (default: 0)") + "\n" +
+ " -blockmaxsize=<n> " + _("Set maximum block size in bytes (default: 250000)") + "\n" +
+ " -blockprioritysize=<n> " + _("Set maximum size of high-priority/low-fee transactions in bytes (default: 27000)") + "\n" +
+
+ "\n" + _("SSL options: (see the Bitcoin Wiki for SSL setup instructions)") + "\n" +
" -rpcssl " + _("Use OpenSSL (https) for JSON-RPC connections") + "\n" +
" -rpcsslcertificatechainfile=<file.cert> " + _("Server certificate file (default: server.cert)") + "\n" +
" -rpcsslprivatekeyfile=<file.pem> " + _("Server private key (default: server.pem)") + "\n" +
@@ -298,18 +304,30 @@ bool AppInit2()
{
// ********************************************************* Step 1: setup
#ifdef _MSC_VER
- // Turn off microsoft heap dump noise
+ // Turn off Microsoft heap dump noise
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
#endif
#if _MSC_VER >= 1400
- // Disable confusing "helpful" text message on abort, ctrl-c
+ // Disable confusing "helpful" text message on abort, Ctrl-C
_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
#endif
-#ifndef WIN32
- umask(077);
+#ifdef WIN32
+ // Enable Data Execution Prevention (DEP)
+ // Minimum supported OS versions: WinXP SP3, WinVista >= SP1, Win Server 2008
+ // A failure is non-critical and needs no further attention!
+#ifndef PROCESS_DEP_ENABLE
+// We define this here, because GCCs winbase.h limits this to _WIN32_WINNT >= 0x0601 (Windows 7),
+// which is not correct. Can be removed, when GCCs winbase.h is fixed!
+#define PROCESS_DEP_ENABLE 0x00000001
+#endif
+ typedef BOOL (WINAPI *PSETPROCDEPPOL)(DWORD);
+ PSETPROCDEPPOL setProcDEPPol = (PSETPROCDEPPOL)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "SetProcessDEPPolicy");
+ if (setProcDEPPol != NULL) setProcDEPPol(PROCESS_DEP_ENABLE);
#endif
#ifndef WIN32
+ umask(077);
+
// Clean shutdown on SIGTERM
struct sigaction sa;
sa.sa_handler = HandleSIGTERM;
@@ -339,7 +357,7 @@ bool AppInit2()
SoftSetBoolArg("-listen", true);
}
- if (mapArgs.count("-connect")) {
+ if (mapArgs.count("-connect") && mapMultiArgs["-connect"].size() > 0) {
// when only connecting to trusted nodes, do not seed via DNS, or listen by default
SoftSetBoolArg("-dnsseed", false);
SoftSetBoolArg("-listen", false);
@@ -411,7 +429,7 @@ bool AppInit2()
if (!ParseMoney(mapArgs["-paytxfee"], nTransactionFee))
return InitError(strprintf(_("Invalid amount for -paytxfee=<amount>: '%s'"), mapArgs["-paytxfee"].c_str()));
if (nTransactionFee > 0.25 * COIN)
- InitWarning(_("Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction."));
+ InitWarning(_("Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction."));
}
// ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log
@@ -446,11 +464,13 @@ bool AppInit2()
}
#endif
- if (!fDebug)
+ if (GetBoolArg("-shrinkdebugfile", !fDebug))
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 (%s)\n", FormatFullVersion().c_str(), CLIENT_DATE.c_str());
- printf("Startup time: %s\n", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str());
+ printf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
+ if (!fLogTimestamps)
+ printf("Startup time: %s\n", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str());
printf("Default data directory %s\n", GetDefaultDataDir().string().c_str());
printf("Used data directory %s\n", GetDataDir().string().c_str());
std::ostringstream strErrors;
@@ -481,6 +501,12 @@ bool AppInit2()
SetLimited(net);
}
}
+#if defined(USE_IPV6)
+#if ! USE_IPV6
+ else
+ SetLimited(NET_IPV6);
+#endif
+#endif
CService addrProxy;
bool fProxy = false;
@@ -620,7 +646,7 @@ bool AppInit2()
uiInterface.InitMessage(_("Loading wallet..."));
printf("Loading wallet...\n");
nStart = GetTimeMillis();
- bool fFirstRun;
+ bool fFirstRun = true;
pwalletMain = new CWallet("wallet.dat");
int nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
if (nLoadWalletRet != DB_LOAD_OK)
@@ -696,6 +722,8 @@ bool AppInit2()
if (mapArgs.count("-loadblock"))
{
+ uiInterface.InitMessage(_("Importing blockchain data file."));
+
BOOST_FOREACH(string strFile, mapMultiArgs["-loadblock"])
{
FILE *file = fopen(strFile.c_str(), "rb");
@@ -704,6 +732,18 @@ bool AppInit2()
}
}
+ filesystem::path pathBootstrap = GetDataDir() / "bootstrap.dat";
+ if (filesystem::exists(pathBootstrap)) {
+ uiInterface.InitMessage(_("Importing bootstrap blockchain data file."));
+
+ FILE *file = fopen(pathBootstrap.string().c_str(), "rb");
+ if (file) {
+ filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old";
+ LoadExternalBlockFile(file);
+ RenameOver(pathBootstrap, pathBootstrapOld);
+ }
+ }
+
// ********************************************************* Step 9: load peers
uiInterface.InitMessage(_("Loading addresses..."));
@@ -733,11 +773,11 @@ bool AppInit2()
printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size());
printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size());
- if (!CreateThread(StartNode, NULL))
+ if (!NewThread(StartNode, NULL))
InitError(_("Error: could not start node"));
if (fServer)
- CreateThread(ThreadRPCServer, NULL);
+ NewThread(ThreadRPCServer, NULL);
// ********************************************************* Step 11: finished