mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
run as daemon without GUI,
hooked wxApp::Initialize to ignore gtk-init-check failure if no GUI, fork to daemonize, rpc getinfo, getconnectioncount, getbalance, getgenerate, setgenerate, -- version 0.2.6
This commit is contained in:
94
ui.cpp
94
ui.cpp
@@ -26,6 +26,20 @@ int fMinimizeOnClose = true;
|
||||
|
||||
|
||||
|
||||
int MyMessageBox(const wxString& message, const wxString& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1)
|
||||
{
|
||||
if (fDaemon)
|
||||
{
|
||||
printf("wxMessageBox %s: %s\n", string(caption).c_str(), string(message).c_str());
|
||||
fprintf(stderr, "%s: %s\n", string(caption).c_str(), string(message).c_str());
|
||||
return wxOK;
|
||||
}
|
||||
return wxMessageBox(message, caption, style, parent, x, y);
|
||||
}
|
||||
#define wxMessageBox MyMessageBox
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -209,16 +223,10 @@ void CalledMessageBox(const string& message, const string& caption, int style, w
|
||||
|
||||
int ThreadSafeMessageBox(const string& message, const string& caption, int style, wxWindow* parent, int x, int y)
|
||||
{
|
||||
if (fDaemon)
|
||||
{
|
||||
printf("wxMessageBox %s: %s\n", caption.c_str(), message.c_str());
|
||||
return wxOK;
|
||||
}
|
||||
|
||||
#ifdef __WXMSW__
|
||||
return wxMessageBox(message, caption, style, parent, x, y);
|
||||
#else
|
||||
if (wxThread::IsMain())
|
||||
if (wxThread::IsMain() || fDaemon)
|
||||
{
|
||||
return wxMessageBox(message, caption, style, parent, x, y);
|
||||
}
|
||||
@@ -563,7 +571,7 @@ string SingleLine(const string& strIn)
|
||||
bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex)
|
||||
{
|
||||
int64 nTime = wtx.nTimeDisplayed = wtx.GetTxTime();
|
||||
int64 nCredit = wtx.GetCredit();
|
||||
int64 nCredit = wtx.GetCredit(true);
|
||||
int64 nDebit = wtx.GetDebit();
|
||||
int64 nNet = nCredit - nDebit;
|
||||
uint256 hash = wtx.GetHash();
|
||||
@@ -2571,6 +2579,9 @@ public:
|
||||
bool OnInit2();
|
||||
int OnExit();
|
||||
|
||||
// Hook Initialize so we can start without GUI
|
||||
virtual bool Initialize(int& argc, wxChar** argv);
|
||||
|
||||
// 2nd-level exception handling: we get all the exceptions occurring in any
|
||||
// event handler here
|
||||
virtual bool OnExceptionInMainLoop();
|
||||
@@ -2586,6 +2597,64 @@ public:
|
||||
|
||||
IMPLEMENT_APP(CMyApp)
|
||||
|
||||
bool CMyApp::Initialize(int& argc, wxChar** argv)
|
||||
{
|
||||
if (argc > 1 && argv[1][0] != '-' && (!fWindows || argv[1][0] != '/') &&
|
||||
wxString(argv[1]) != "start")
|
||||
{
|
||||
fCommandLine = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// wxApp::Initialize will remove environment-specific parameters,
|
||||
// so it's too early to call ParseParameters yet
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
wxString str = argv[i];
|
||||
#ifdef __WXMSW__
|
||||
if (str.size() >= 1 && str[0] == '/')
|
||||
str[0] = '-';
|
||||
str = str.MakeLower();
|
||||
#endif
|
||||
// haven't decided which argument to use for this yet
|
||||
if (str == "-daemon" || str == "-d" || str == "start")
|
||||
fDaemon = true;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __WXGTK__
|
||||
if (fDaemon || fCommandLine)
|
||||
{
|
||||
// Call the original Initialize while suppressing error messages
|
||||
// and ignoring failure. If unable to initialize GTK, it fails
|
||||
// near the end so hopefully the last few things don't matter.
|
||||
{
|
||||
wxLogNull logNo;
|
||||
wxApp::Initialize(argc, argv);
|
||||
}
|
||||
|
||||
if (fDaemon)
|
||||
{
|
||||
fprintf(stdout, "bitcoin server starting\n");
|
||||
|
||||
// Daemonize
|
||||
pid_t pid = fork();
|
||||
if (pid < 0)
|
||||
{
|
||||
fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
|
||||
return false;
|
||||
}
|
||||
if (pid > 0)
|
||||
pthread_exit((void*)0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return wxApp::Initialize(argc, argv);
|
||||
}
|
||||
|
||||
bool CMyApp::OnInit()
|
||||
{
|
||||
bool fRet = false;
|
||||
@@ -2650,7 +2719,7 @@ bool CMyApp::OnInit2()
|
||||
//
|
||||
// Parameters
|
||||
//
|
||||
if (argc > 1 && argv[1][0] != '-' && argv[1][0] != '/')
|
||||
if (fCommandLine)
|
||||
{
|
||||
int ret = CommandLineRPC(argc, argv);
|
||||
exit(ret);
|
||||
@@ -2696,13 +2765,6 @@ bool CMyApp::OnInit2()
|
||||
if (mapArgs.count("-printtodebugger"))
|
||||
fPrintToDebugger = true;
|
||||
|
||||
if (mapArgs.count("-daemon") || mapArgs.count("-d"))
|
||||
{
|
||||
fDaemon = true;
|
||||
/// todo: need to fork
|
||||
/// should it fork after the bind/single instance stuff?
|
||||
}
|
||||
|
||||
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");
|
||||
|
||||
Reference in New Issue
Block a user