Merge branch '0.4.x' into 0.5.0.x
authorLuke Dashjr <luke-jr+git@utopios.org>
Wed, 21 Mar 2012 17:19:25 +0000 (13:19 -0400)
committerLuke Dashjr <luke-jr+git@utopios.org>
Wed, 21 Mar 2012 17:19:25 +0000 (13:19 -0400)
1  2 
src/db.cpp
src/init.cpp

diff --combined src/db.cpp
@@@ -629,6 -629,24 +629,6 @@@ bool CAddrDB::LoadAddresses(
  {
      CRITICAL_BLOCK(cs_mapAddresses)
      {
 -        // Load user provided addresses
 -        CAutoFile filein = fopen((GetDataDir() + "/addr.txt").c_str(), "rt");
 -        if (filein)
 -        {
 -            try
 -            {
 -                char psz[1000];
 -                while (fgets(psz, sizeof(psz), filein))
 -                {
 -                    CAddress addr(psz, false, NODE_NETWORK);
 -                    addr.nTime = 0; // so it won't relay unless successfully connected
 -                    if (addr.IsValid())
 -                        AddAddress(addr);
 -                }
 -            }
 -            catch (...) { }
 -        }
 -
          // Get cursor
          Dbc* pcursor = GetCursor();
          if (!pcursor)
@@@ -768,7 -786,7 +768,7 @@@ int CWalletDB::LoadWallet(CWallet* pwal
      bool fIsEncrypted = false;
  
      // Modify defaults
 -#ifndef __WXMSW__
 +#ifndef WIN32
      // Tray icon sometimes disappears on 9.10 karmic koala 64-bit, leaving no way to access the program
      fMinimizeToTray = false;
      fMinimizeOnClose = false;
          // Get cursor
          Dbc* pcursor = GetCursor();
          if (!pcursor)
+         {
+             printf("Error getting wallet database cursor\n");
              return DB_CORRUPT;
+         }
  
          loop
          {
              if (ret == DB_NOTFOUND)
                  break;
              else if (ret != 0)
+             {
+                 printf("Error reading next record from wallet database\n");
                  return DB_CORRUPT;
+             }
  
              // Unserialize
              // Taking advantage of the fact that pair serialization
                      CPrivKey pkey;
                      ssValue >> pkey;
                      key.SetPrivKey(pkey);
-                     if (key.GetPubKey() != vchPubKey || !key.IsValid())
+                     if (key.GetPubKey() != vchPubKey)
+                     {
+                         printf("Error reading wallet database: CPrivKey pubkey inconsistency\n");
                          return DB_CORRUPT;
+                     }
+                     if (!key.IsValid())
+                     {
+                         printf("Error reading wallet database: invalid CPrivKey\n");
+                         return DB_CORRUPT;
+                     }
                  }
                  else
                  {
                      CWalletKey wkey;
                      ssValue >> wkey;
                      key.SetPrivKey(wkey.vchPrivKey);
-                     if (key.GetPubKey() != vchPubKey || !key.IsValid())
+                     if (key.GetPubKey() != vchPubKey)
+                     {
+                         printf("Error reading wallet database: CWalletKey pubkey inconsistency\n");
                          return DB_CORRUPT;
+                     }
+                     if (!key.IsValid())
+                     {
+                         printf("Error reading wallet database: invalid CWalletKey\n");
+                         return DB_CORRUPT;
+                     }
                  }
                  if (!pwallet->LoadKey(key))
+                 {
+                     printf("Error reading wallet database: LoadKey failed\n");
                      return DB_CORRUPT;
+                 }
              }
              else if (strType == "mkey")
              {
                  CMasterKey kMasterKey;
                  ssValue >> kMasterKey;
                  if(pwallet->mapMasterKeys.count(nID) != 0)
+                 {
+                     printf("Error reading wallet database: duplicate CMasterKey id %u\n", nID);
                      return DB_CORRUPT;
+                 }
                  pwallet->mapMasterKeys[nID] = kMasterKey;
                  if (pwallet->nMasterKeyMaxID < nID)
                      pwallet->nMasterKeyMaxID = nID;
                  vector<unsigned char> vchPrivKey;
                  ssValue >> vchPrivKey;
                  if (!pwallet->LoadCryptedKey(vchPubKey, vchPrivKey))
+                 {
+                     printf("Error reading wallet database: LoadCryptedKey failed\n");
                      return DB_CORRUPT;
+                 }
                  fIsEncrypted = true;
              }
              else if (strType == "defaultkey")
                  ssKey >> strKey;
  
                  // Options
 -#ifndef GUI
 +#ifndef QT_GUI
                  if (strKey == "fGenerateBitcoins")  ssValue >> fGenerateBitcoins;
  #endif
                  if (strKey == "nTransactionFee")    ssValue >> nTransactionFee;
diff --combined src/init.cpp
@@@ -4,7 -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"
  #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)
 +Q_IMPORT_PLUGIN(qtaccessiblewidgets)
 +#endif
 +
  using namespace std;
  using namespace boost;
  
@@@ -35,7 -24,7 +35,7 @@@ CWallet* pwalletMain
  
  void ExitTimeout(void* parg)
  {
 -#ifdef __WXMSW__
 +#ifdef WIN32
      Sleep(5000);
      ExitProcess(0);
  #endif
@@@ -91,7 -80,7 +91,7 @@@ void HandleSIGTERM(int
  //
  // Start
  //
 -#ifndef GUI
 +#if !defined(QT_GUI)
  int main(int argc, char* argv[])
  {
      bool fRet = false;
@@@ -132,10 -121,10 +132,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;
              "  -noirc           \t  "   + _("Don't find peers using internet relay chat\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
              "  -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") +
 -#ifdef GUI
 +            "  -paytxfee=<amt>  \t  "   + _("Fee per kB to add to transactions you send\n") +
 +#ifdef QT_GUI
              "  -server          \t\t  " + _("Accept command line and JSON-RPC commands\n") +
  #endif
 -#ifndef __WXMSW__
 +#if !defined(WIN32) && !defined(QT_GUI)
              "  -daemon          \t\t  " + _("Run in the background as a daemon and accept commands\n") +
  #endif
              "  -testnet         \t\t  " + _("Use the test network\n") +
          strUsage += string() +
              "  -?               \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());
 +#if defined(QT_GUI) && defined(WIN32)
 +        // On windows, show a message box, as there is no stderr
 +        wxMessageBox(strUsage, "Usage");
 +#else
          fprintf(stderr, "%s", strUsage.c_str());
  #endif
          return false;
      fTestNet = GetBoolArg("-testnet");
      fDebug = GetBoolArg("-debug");
  
 -#ifndef __WXMSW__
 +#if !defined(WIN32) && !defined(QT_GUI)
      fDaemon = GetBoolArg("-daemon");
  #else
      fDaemon = false;
          fServer = GetBoolArg("-server");
  
      /* force fServer when running without GUI */
 -#ifndef GUI
 +#if !defined(QT_GUI)
      fServer = true;
  #endif
 -
      fPrintToConsole = GetBoolArg("-printtoconsole");
      fPrintToDebugger = GetBoolArg("-printtodebugger");
      fLogTimestamps = GetBoolArg("-logtimestamps");
  
 +#ifndef QT_GUI
      for (int i = 1; i < argc; i++)
          if (!IsSwitchChar(argv[i][0]))
              fCommandLine = true;
          int ret = CommandLineRPC(argc, argv);
          exit(ret);
      }
 +#endif
  
 -#ifndef __WXMSW__
 +#if !defined(WIN32) && !defined(QT_GUI)
      if (fDaemon)
      {
          // Daemonize
          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"))
          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.
      strErrors = "";
      int64 nStart;
  
 +    InitMessage(_("Loading addresses..."));
      printf("Loading addresses...\n");
      nStart = GetTimeMillis();
      if (!LoadAddresses())
          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");
      printf(" block index %15"PRI64d"ms\n", GetTimeMillis() - nStart);
  
 +    InitMessage(_("Loading wallet..."));
      printf("Loading wallet...\n");
      nStart = GetTimeMillis();
      bool fFirstRun;
          else if (nLoadWalletRet == DB_NEED_REWRITE)
          {
              strErrors += _("Wallet needed to be rewritten: restart Bitcoin to complete    \n");
+             printf("%s", strErrors.c_str());
              wxMessageBox(strErrors, "Bitcoin", wxOK | wxICON_ERROR);
              return false;
          }
          else
              strErrors += _("Error loading wallet.dat      \n");
      }
+     printf("%s", strErrors.c_str());
      printf(" wallet      %15"PRI64d"ms\n", GetTimeMillis() - nStart);
  
      RegisterWallet(pwalletMain);
      }
      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
      }
  
      //
 -    // 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