Browse Source

retry IRC if name in use,

resize to fit ubuntu's giant default font, 
scroll debug.log, 
pause gen during initial block download
miguelfreitas
s_nakamoto 15 years ago
parent
commit
0bbbee96b7
  1. 6
      build-msw.txt
  2. 13
      build-unix.txt
  3. 21
      db.cpp
  4. 23
      irc.cpp
  5. 21
      main.cpp
  6. 2
      makefile
  7. 9
      makefile.unix
  8. 25
      net.cpp
  9. 1
      net.h
  10. 2
      serialize.h
  11. 46
      ui.cpp
  12. 55
      util.cpp
  13. 2
      util.h

6
build-msw.txt

@ -9,7 +9,7 @@ cryptographic software written by Eric Young (eay@cryptsoft.com). @@ -9,7 +9,7 @@ cryptographic software written by Eric Young (eay@cryptsoft.com).
WINDOWS BUILD NOTES
===================
Compilers Supported
-------------------
@ -19,7 +19,7 @@ Microsoft Visual C++ 6.0 SP6 @@ -19,7 +19,7 @@ Microsoft Visual C++ 6.0 SP6
Dependencies
------------
Libraries you need to obtain separately to build:
Libraries you need to download separately and build:
default path download
wxWidgets \wxwidgets http://www.wxwidgets.org/downloads/
@ -44,7 +44,7 @@ Boost 1.34.1 @@ -44,7 +44,7 @@ Boost 1.34.1
Notes
-----
The UI layout is edited with wxFormBuilder. Open the project file
The UI layout is edited with wxFormBuilder. The project file is
uiproject.fbp. It generates uibase.cpp and uibase.h, which define base
classes that do the rote work of constructing all the UI elements.

13
build-unix.txt

@ -9,7 +9,7 @@ cryptographic software written by Eric Young (eay@cryptsoft.com). @@ -9,7 +9,7 @@ cryptographic software written by Eric Young (eay@cryptsoft.com).
UNIX BUILD NOTES
================
Dependencies
------------
@ -20,11 +20,10 @@ apt-get install libdb4.7-dev @@ -20,11 +20,10 @@ apt-get install libdb4.7-dev
apt-get install libdb4.7++-dev
apt-get install libboost-dev
Libraries you need to obtain separately and build:
default path download
wxWidgets \wxwidgets http://www.wxwidgets.org/downloads/
You need to download wxWidgets from http://www.wxwidgets.org/downloads/
and build it yourself.
Licenses:
Licenses of statically linked libraries:
wxWidgets LGPL 2.1 with very liberal exceptions
Berkeley DB New BSD license with additional requirement that linked software must be free open source
Boost MIT-like license
@ -39,7 +38,7 @@ Boost 1.40.0 @@ -39,7 +38,7 @@ Boost 1.40.0
Notes
-----
The UI layout is edited with wxFormBuilder. Open the project file
The UI layout is edited with wxFormBuilder. The project file is
uiproject.fbp. It generates uibase.cpp and uibase.h, which define base
classes that do the rote work of constructing all the UI elements.
@ -61,7 +60,7 @@ ldconfig @@ -61,7 +60,7 @@ ldconfig
Boost
-----
If you download and build Boost yourself
If you want to build Boost yourself,
cd /usr/local/boost_1_40_0
su
./bootstrap.sh

21
db.cpp

@ -445,7 +445,7 @@ bool CAddrDB::LoadAddresses() @@ -445,7 +445,7 @@ bool CAddrDB::LoadAddresses()
CRITICAL_BLOCK(cs_mapAddresses)
{
// Load user provided addresses
CAutoFile filein = fopen("addr.txt", "rt");
CAutoFile filein = fopen((GetDataDir() + "/addr.txt").c_str(), "rt");
if (filein)
{
try
@ -536,10 +536,11 @@ bool CReviewDB::WriteReviews(uint256 hash, const vector<CReview>& vReviews) @@ -536,10 +536,11 @@ bool CReviewDB::WriteReviews(uint256 hash, const vector<CReview>& vReviews)
bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet)
{
vchDefaultKeyRet.clear();
int nFileVersion = 0;
// Modify defaults
#ifndef __WXMSW__
// Reports that tray icon can disappear on gnome, leaving no way to access the program
// Tray icon sometimes disappears on 9.10 karmic koala 64-bit, leaving no way to access the program
fMinimizeToTray = false;
fMinimizeOnClose = false;
#endif
@ -607,6 +608,10 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet) @@ -607,6 +608,10 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet)
{
ssValue >> vchDefaultKeyRet;
}
else if (strType == "version")
{
ssValue >> nFileVersion;
}
else if (strType == "setting")
{
string strKey;
@ -649,6 +654,16 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet) @@ -649,6 +654,16 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet)
WriteSetting("nTransactionFee", nTransactionFee);
}
// Upgrade
if (nFileVersion < VERSION)
{
// Get rid of old debug.log file in current directory
if (nFileVersion <= 105 && !pszSetDataDir[0])
unlink("debug.log");
WriteVersion(VERSION);
}
return true;
}
@ -656,7 +671,7 @@ bool LoadWallet(bool& fFirstRunRet) @@ -656,7 +671,7 @@ bool LoadWallet(bool& fFirstRunRet)
{
fFirstRunRet = false;
vector<unsigned char> vchDefaultKey;
if (!CWalletDB("cr").LoadWallet(vchDefaultKey))
if (!CWalletDB("cr+").LoadWallet(vchDefaultKey))
return false;
fFirstRunRet = vchDefaultKey.empty();

23
irc.cpp

@ -121,20 +121,20 @@ bool RecvLineIRC(SOCKET hSocket, string& strLine) @@ -121,20 +121,20 @@ bool RecvLineIRC(SOCKET hSocket, string& strLine)
}
}
bool RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL)
int RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL)
{
loop
{
string strLine;
if (!RecvLineIRC(hSocket, strLine))
return false;
return 0;
printf("IRC %s\n", strLine.c_str());
if (psz1 && strLine.find(psz1) != -1)
return true;
return 1;
if (psz2 && strLine.find(psz2) != -1)
return true;
return 2;
if (psz3 && strLine.find(psz3) != -1)
return true;
return 3;
}
}
@ -159,6 +159,7 @@ void ThreadIRCSeed(void* parg) @@ -159,6 +159,7 @@ void ThreadIRCSeed(void* parg)
SetThreadPriority(THREAD_PRIORITY_NORMAL);
int nErrorWait = 10;
int nRetryWait = 10;
bool fNameInUse = false;
bool fTOR = (fUseProxy && addrProxy.port == htons(9050));
while (!fShutdown)
@ -194,7 +195,7 @@ void ThreadIRCSeed(void* parg) @@ -194,7 +195,7 @@ void ThreadIRCSeed(void* parg)
}
string strMyName;
if (addrLocalHost.IsRoutable() && !fUseProxy)
if (addrLocalHost.IsRoutable() && !fUseProxy && !fNameInUse)
strMyName = EncodeAddress(addrLocalHost);
else
strMyName = strprintf("x%u", GetRand(1000000000));
@ -203,10 +204,18 @@ void ThreadIRCSeed(void* parg) @@ -203,10 +204,18 @@ void ThreadIRCSeed(void* parg)
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 (!RecvUntil(hSocket, " 004 "))
int nRet = RecvUntil(hSocket, " 004 ", " 433 ");
if (nRet != 1)
{
closesocket(hSocket);
hSocket = INVALID_SOCKET;
if (nRet == 2)
{
printf("IRC name already in use\n");
fNameInUse = true;
Wait(10);
continue;
}
nErrorWait = nErrorWait * 11 / 10;
if (Wait(nErrorWait += 60))
continue;

21
main.cpp

@ -2530,7 +2530,7 @@ void BitcoinMiner() @@ -2530,7 +2530,7 @@ void BitcoinMiner()
//
// Search
//
unsigned int nStart = GetTime();
int64 nStart = GetTime();
uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256();
uint256 hash;
loop
@ -2582,14 +2582,27 @@ void BitcoinMiner() @@ -2582,14 +2582,27 @@ void BitcoinMiner()
return;
if (fLimitProcessors && vnThreadsRunning[3] > nLimitProcessors)
return;
if (tmp.block.nNonce == 0)
if (vNodes.empty())
break;
if (pindexPrev != pindexBest)
if (tmp.block.nNonce == 0)
break;
if (nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60)
break;
if (vNodes.empty())
if (pindexPrev != pindexBest)
{
// Pause generating during initial download
if (GetTime() - nStart < 20)
{
CBlockIndex* pindexTmp;
do
{
pindexTmp = pindexBest;
Sleep(10000);
}
while (pindexTmp != pindexBest);
}
break;
}
tmp.block.nTime = pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
}
}

2
makefile

@ -10,8 +10,6 @@ endif @@ -10,8 +10,6 @@ endif
endif
ifeq "$(BUILD)" "debug"
D=d
# note: gcc 3.x profile doesn't work
#DEBUGFLAGS=-O0 -g -pg -D__WXDEBUG__
DEBUGFLAGS=-g -D__WXDEBUG__
endif

9
makefile.unix

@ -22,11 +22,14 @@ INCLUDEPATHS= \ @@ -22,11 +22,14 @@ INCLUDEPATHS= \
LIBPATHS= \
-L"/usr/lib" \
-L"/usr/local/lib" \
-L"/usr/local/lib"
LIBS= \
-Wl,-Bstatic -l boost_system -l boost_filesystem -Wl,-Bdynamic \
-Wl,-Bstatic -l db_cxx -l wx_gtk2$(D)-2.8 -Wl,-Bdynamic \
-Wl,-Bstatic \
-l boost_system -l boost_filesystem \
-l db_cxx \
-l wx_gtk2$(D)-2.8 \
-Wl,-Bdynamic \
-l crypto \
-l gtk-x11-2.0 -l gthread-2.0 -l SM

25
net.cpp

@ -21,7 +21,6 @@ uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK); @@ -21,7 +21,6 @@ uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK);
CAddress addrLocalHost(0, DEFAULT_PORT, nLocalServices);
CNode* pnodeLocalHost = NULL;
uint64 nLocalHostNonce = 0;
bool fShutdown = false;
array<int, 10> vnThreadsRunning;
SOCKET hListenSocket = INVALID_SOCKET;
int64 nThreadSocketHandlerHeartbeat = INT64_MAX;
@ -1324,3 +1323,27 @@ bool StopNode() @@ -1324,3 +1323,27 @@ bool StopNode()
return true;
}
class CNetCleanup
{
public:
CNetCleanup()
{
}
~CNetCleanup()
{
// Close sockets
foreach(CNode* pnode, vNodes)
if (pnode->hSocket != INVALID_SOCKET)
closesocket(pnode->hSocket);
if (hListenSocket != INVALID_SOCKET)
if (closesocket(hListenSocket) == SOCKET_ERROR)
printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
#ifdef __WXMSW__
// Shutdown Windows Sockets
WSACleanup();
#endif
}
}
instance_of_cnetcleanup;

1
net.h

@ -454,7 +454,6 @@ extern uint64 nLocalServices; @@ -454,7 +454,6 @@ extern uint64 nLocalServices;
extern CAddress addrLocalHost;
extern CNode* pnodeLocalHost;
extern uint64 nLocalHostNonce;
extern bool fShutdown;
extern array<int, 10> vnThreadsRunning;
extern SOCKET hListenSocket;
extern int64 nThreadSocketHandlerHeartbeat;

2
serialize.h

@ -20,7 +20,7 @@ class CDataStream; @@ -20,7 +20,7 @@ class CDataStream;
class CAutoFile;
static const int VERSION = 106;
static const char* pszSubVer = " test10";
static const char* pszSubVer = " test11";

46
ui.cpp

@ -317,6 +317,7 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) @@ -317,6 +317,7 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
fOnSetFocusAddress = false;
fRefresh = false;
m_choiceFilter->SetSelection(0);
double dResize = 1.0;
#ifdef __WXMSW__
SetIcon(wxICON(bitcoin));
#else
@ -330,6 +331,10 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) @@ -330,6 +331,10 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
m_toolBar->AddTool(wxID_BUTTONSEND, "Send Coins", wxBitmap(send20_xpm), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);
m_toolBar->AddTool(wxID_BUTTONRECEIVE, "Address Book", wxBitmap(addressbook20_xpm), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);
m_toolBar->Realize();
// resize to fit ubuntu's huge default font
dResize = 1.19;
SetSize(dResize * GetSize().GetWidth(), 1.1 * GetSize().GetHeight());
dResize = 1.20;
#endif
m_staticTextBalance->SetLabel(FormatMoney(GetBalance()) + " ");
m_listCtrl->SetFocus();
@ -339,13 +344,13 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) @@ -339,13 +344,13 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
int nDateWidth = DateTimeStr(1229413914).size() * 6 + 8;
if (!strstr(DateTimeStr(1229413914).c_str(), "2008"))
nDateWidth += 12;
m_listCtrl->InsertColumn(0, "", wxLIST_FORMAT_LEFT, 0);
m_listCtrl->InsertColumn(1, "", wxLIST_FORMAT_LEFT, 0);
m_listCtrl->InsertColumn(2, "Status", wxLIST_FORMAT_LEFT, 90);
m_listCtrl->InsertColumn(3, "Date", wxLIST_FORMAT_LEFT, nDateWidth);
m_listCtrl->InsertColumn(4, "Description", wxLIST_FORMAT_LEFT, 409 - nDateWidth);
m_listCtrl->InsertColumn(5, "Debit", wxLIST_FORMAT_RIGHT, 79);
m_listCtrl->InsertColumn(6, "Credit", wxLIST_FORMAT_RIGHT, 79);
m_listCtrl->InsertColumn(0, "", wxLIST_FORMAT_LEFT, dResize * 0);
m_listCtrl->InsertColumn(1, "", wxLIST_FORMAT_LEFT, dResize * 0);
m_listCtrl->InsertColumn(2, "Status", wxLIST_FORMAT_LEFT, dResize * 90);
m_listCtrl->InsertColumn(3, "Date", wxLIST_FORMAT_LEFT, dResize * nDateWidth);
m_listCtrl->InsertColumn(4, "Description", wxLIST_FORMAT_LEFT, dResize * 409 - nDateWidth);
m_listCtrl->InsertColumn(5, "Debit", wxLIST_FORMAT_RIGHT, dResize * 79);
m_listCtrl->InsertColumn(6, "Credit", wxLIST_FORMAT_RIGHT, dResize * 79);
//m_listCtrlProductsSent->InsertColumn(0, "Category", wxLIST_FORMAT_LEFT, 100);
//m_listCtrlProductsSent->InsertColumn(1, "Title", wxLIST_FORMAT_LEFT, 100);
@ -367,6 +372,10 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) @@ -367,6 +372,10 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
// Init status bar
int pnWidths[3] = { -100, 88, 290 };
#ifndef __WXMSW__
pnWidths[1] = pnWidths[1] * 1.1 * dResize;
pnWidths[2] = pnWidths[2] * 1.1 * dResize;
#endif
m_statusBar->SetFieldsCount(3, pnWidths);
// Fill your address text box
@ -1514,6 +1523,7 @@ COptionsDialog::COptionsDialog(wxWindow* parent) : COptionsDialogBase(parent) @@ -1514,6 +1523,7 @@ COptionsDialog::COptionsDialog(wxWindow* parent) : COptionsDialogBase(parent)
SelectPage(0);
#ifndef __WXMSW__
m_checkBoxMinimizeOnClose->SetLabel("&Minimize on close");
m_checkBoxStartOnSystemStartup->Enable(false); // not implemented yet
#endif
// Init values
@ -1876,6 +1886,9 @@ CSendingDialog::CSendingDialog(wxWindow* parent, const CAddress& addrIn, int64 n @@ -1876,6 +1886,9 @@ CSendingDialog::CSendingDialog(wxWindow* parent, const CAddress& addrIn, int64 n
fSuccess = false;
fUIDone = false;
fWorkDone = false;
#ifndef __WXMSW__
SetSize(1.2 * GetSize().GetWidth(), 1.05 * GetSize().GetHeight());
#endif
SetTitle(strprintf("Sending %s to %s", FormatMoney(nPrice).c_str(), wtx.mapValue["to"].c_str()));
m_textCtrlStatus->SetValue("");
@ -3475,6 +3488,7 @@ bool CMyApp::OnInit2() @@ -3475,6 +3488,7 @@ bool CMyApp::OnInit2()
ParseParameters(argc, argv);
if (mapArgs.count("-?") || mapArgs.count("--help"))
{
#ifdef __WXMSW__
string strUsage =
"Usage: bitcoin [options]\t\t\t\t\t\t\n"
"Options:\n"
@ -3487,6 +3501,20 @@ bool CMyApp::OnInit2() @@ -3487,6 +3501,20 @@ bool CMyApp::OnInit2()
" -connect=<ip>\t Connect only to the specified node\n"
" -?\t\t This help message\n";
wxMessageBox(strUsage, "Bitcoin", wxOK);
#else
string strUsage =
"Usage: bitcoin [options]\n"
"Options:\n"
" -gen Generate coins\n"
" -gen=0 Don't generate coins\n"
" -min Start minimized\n"
" -datadir=<dir> Specify data directory\n"
" -proxy=<ip:port> Connect through socks4 proxy\n"
" -addnode=<ip> Add a node to connect to\n"
" -connect=<ip> Connect only to the specified node\n"
" -? This help message\n";
fprintf(stderr, "%s", strUsage.c_str());
#endif
return false;
}
@ -3495,12 +3523,12 @@ bool CMyApp::OnInit2() @@ -3495,12 +3523,12 @@ bool CMyApp::OnInit2()
if (mapArgs.count("-debug"))
fDebug = true;
if (strstr(pszSubVer, "test"))
fDebug = true;
if (mapArgs.count("-printtodebugger"))
fPrintToDebugger = true;
if (!fDebug && !pszSetDataDir[0])
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 %d%s, OS version %s\n", VERSION, pszSubVer, wxGetOsDescription().mb_str());

55
util.cpp

@ -11,6 +11,7 @@ bool fDebug = false; @@ -11,6 +11,7 @@ bool fDebug = false;
bool fPrintToDebugger = false;
bool fPrintToConsole = false;
char pszSetDataDir[MAX_PATH] = "";
bool fShutdown = false;
@ -53,19 +54,6 @@ public: @@ -53,19 +54,6 @@ public:
for (int i = 0; i < CRYPTO_num_locks(); i++)
delete ppmutexOpenSSL[i];
OPENSSL_free(ppmutexOpenSSL);
// Close sockets
foreach(CNode* pnode, vNodes)
if (pnode->hSocket != INVALID_SOCKET)
closesocket(pnode->hSocket);
if (hListenSocket != INVALID_SOCKET)
if (closesocket(hListenSocket) == SOCKET_ERROR)
printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
#ifdef __WXMSW__
// Shutdown Windows Sockets
WSACleanup();
#endif
}
}
instance_of_cinit;
@ -416,16 +404,6 @@ void PrintException(std::exception* pex, const char* pszThread) @@ -416,16 +404,6 @@ void PrintException(std::exception* pex, const char* pszThread)
int GetFilesize(FILE* file)
{
int nSavePos = ftell(file);
int nFilesize = -1;
if (fseek(file, 0, SEEK_END) == 0)
nFilesize = ftell(file);
fseek(file, nSavePos, SEEK_SET);
return nFilesize;
}
void GetDataDir(char* pszDir)
{
// pszDir must be at least MAX_PATH length.
@ -465,6 +443,37 @@ string GetDataDir() @@ -465,6 +443,37 @@ string GetDataDir()
return pszDir;
}
int GetFilesize(FILE* file)
{
int nSavePos = ftell(file);
int nFilesize = -1;
if (fseek(file, 0, SEEK_END) == 0)
nFilesize = ftell(file);
fseek(file, nSavePos, SEEK_SET);
return nFilesize;
}
void ShrinkDebugFile()
{
// Scroll debug.log if it's getting too big
string strFile = GetDataDir() + "/debug.log";
FILE* file = fopen(strFile.c_str(), "r");
if (file && GetFilesize(file) > 10 * 1000000)
{
// Restart the file with some of the end
char pch[200000];
fseek(file, -sizeof(pch), SEEK_END);
int nBytes = fread(pch, 1, sizeof(pch), file);
fclose(file);
if (file = fopen(strFile.c_str(), "w"))
{
fwrite(pch, 1, nBytes, file);
fclose(file);
}
}
}

2
util.h

@ -111,6 +111,7 @@ extern bool fDebug; @@ -111,6 +111,7 @@ extern bool fDebug;
extern bool fPrintToDebugger;
extern bool fPrintToConsole;
extern char pszSetDataDir[MAX_PATH];
extern bool fShutdown;
void RandAddSeed();
void RandAddSeedPerfmon();
@ -128,6 +129,7 @@ void ParseParameters(int argc, char* argv[]); @@ -128,6 +129,7 @@ void ParseParameters(int argc, char* argv[]);
int GetFilesize(FILE* file);
void GetDataDir(char* pszDirRet);
string GetDataDir();
void ShrinkDebugFile();
uint64 GetRand(uint64 nMax);
int64 GetTime();
int64 GetAdjustedTime();

Loading…
Cancel
Save