]> Git Repo - VerusCoin.git/blob - src/bitcoind.cpp
test
[VerusCoin.git] / src / bitcoind.cpp
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2013 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6 #include "clientversion.h"
7 #include "rpcserver.h"
8 #include "init.h"
9 #include "main.h"
10 #include "noui.h"
11 #include "scheduler.h"
12 #include "util.h"
13
14 #include <boost/algorithm/string/predicate.hpp>
15 #include <boost/filesystem.hpp>
16 #include <boost/thread.hpp>
17
18 /* Introduction text for doxygen: */
19
20 /*! \mainpage Developer documentation
21  *
22  * \section intro_sec Introduction
23  *
24  * This is the developer documentation of the reference client for an experimental new digital currency called Bitcoin (https://www.bitcoin.org/),
25  * which enables instant payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer technology to operate
26  * with no central authority: managing transactions and issuing money are carried out collectively by the network.
27  *
28  * The software is a community-driven open source project, released under the MIT license.
29  *
30  * \section Navigation
31  * Use the buttons <code>Namespaces</code>, <code>Classes</code> or <code>Files</code> at the top of the page to start navigating the code.
32  */
33
34 static bool fDaemon;
35 extern char ASSETCHAINS_SYMBOL[16];
36 void komodo_gateway_iteration(char *symbol);
37 void komodo_iteration(char *symbol);
38 int32_t komodo_is_issuer();
39
40 void WaitForShutdown(boost::thread_group* threadGroup)
41 {
42     bool fShutdown = ShutdownRequested();
43     // Tell the main threads to shutdown.
44     while (!fShutdown)
45     {
46         MilliSleep(10000);
47         if ( komodo_is_issuer() != 0 )
48             komodo_gateway_iteration(ASSETCHAINS_SYMBOL);
49         else komodo_iteration((char *)"EUR");
50             
51         fShutdown = ShutdownRequested();
52     }
53     if (threadGroup)
54     {
55         threadGroup->interrupt_all();
56         threadGroup->join_all();
57     }
58 }
59
60 //////////////////////////////////////////////////////////////////////////////
61 //
62 // Start
63 //
64 extern int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,ASSETCHAIN_INIT;
65 extern std::string NOTARY_PUBKEY;
66 int32_t komodo_is_issuer();
67
68 bool AppInit(int argc, char* argv[])
69 {
70     boost::thread_group threadGroup;
71     CScheduler scheduler;
72
73     bool fRet = false;
74
75     //
76     // Parameters
77     //
78     // If Qt is used, parameters/komodo.conf are parsed in qt/bitcoin.cpp's main()
79     ParseParameters(argc, argv);
80
81     // Process help and version before taking care about datadir
82     if (mapArgs.count("-?") || mapArgs.count("-h") ||  mapArgs.count("-help") || mapArgs.count("-version"))
83     {
84         std::string strUsage = _("Komodo Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n";
85
86         if (mapArgs.count("-version"))
87         {
88             strUsage += LicenseInfo();
89         }
90         else
91         {
92             strUsage += "\n" + _("Usage:") + "\n" +
93                   "  komodod [options]                     " + _("Start Komodo Daemon") + "\n";
94
95             strUsage += "\n" + HelpMessage(HMM_BITCOIND);
96         }
97
98         fprintf(stdout, "%s", strUsage.c_str());
99         return false;
100     }
101
102     try
103     {
104         void komodo_args();
105         komodo_args();
106         fprintf(stderr,"call komodo_args NOTARY_PUBKEY.(%s)\n",NOTARY_PUBKEY.c_str());
107         while ( ASSETCHAIN_INIT == 0 )
108         {
109             if ( komodo_is_issuer() != 0 )
110                 komodo_gateway_iteration(ASSETCHAINS_SYMBOL);
111             sleep(1);
112         }
113         if (!boost::filesystem::is_directory(GetDataDir(false)))
114         {
115             fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", mapArgs["-datadir"].c_str());
116             return false;
117         }
118         try
119         {
120             ReadConfigFile(mapArgs, mapMultiArgs);
121         } catch (const std::exception& e) {
122             fprintf(stderr,"Error reading configuration file: %s\n", e.what());
123             return false;
124         }
125         // Check for -testnet or -regtest parameter (Params() calls are only valid after this clause)
126         if (!SelectParamsFromCommandLine()) {
127             fprintf(stderr, "Error: Invalid combination of -regtest and -testnet.\n");
128             return false;
129         }
130
131         // Command-line RPC
132         bool fCommandLine = false;
133         for (int i = 1; i < argc; i++)
134             if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "komodo:"))
135                 fCommandLine = true;
136
137         if (fCommandLine)
138         {
139             fprintf(stderr, "Error: There is no RPC client functionality in komodod. Use the komodo-cli utility instead.\n");
140             exit(1);
141         }
142
143 #ifndef WIN32
144         fDaemon = GetBoolArg("-daemon", false);
145         if (fDaemon)
146         {
147             extern char ASSETCHAINS_SYMBOL[16];
148             fprintf(stdout, "Komodo %s server starting\n",ASSETCHAINS_SYMBOL);
149
150             // Daemonize
151             pid_t pid = fork();
152             if (pid < 0)
153             {
154                 fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
155                 return false;
156             }
157             if (pid > 0) // Parent process, pid is child process id
158             {
159                 return true;
160             }
161             // Child process falls through to rest of initialization
162
163             pid_t sid = setsid();
164             if (sid < 0)
165                 fprintf(stderr, "Error: setsid() returned %d errno %d\n", sid, errno);
166         }
167 #endif
168         SoftSetBoolArg("-server", true);
169
170         fRet = AppInit2(threadGroup, scheduler);
171     }
172     catch (const std::exception& e) {
173         PrintExceptionContinue(&e, "AppInit()");
174     } catch (...) {
175         PrintExceptionContinue(NULL, "AppInit()");
176     }
177
178     if (!fRet)
179     {
180         threadGroup.interrupt_all();
181         // threadGroup.join_all(); was left out intentionally here, because we didn't re-test all of
182         // the startup-failure cases to make sure they don't result in a hang due to some
183         // thread-blocking-waiting-for-another-thread-during-startup case
184     } else {
185         WaitForShutdown(&threadGroup);
186     }
187     Shutdown();
188
189     return fRet;
190 }
191
192 int main(int argc, char* argv[])
193 {
194     SetupEnvironment();
195
196     // Connect bitcoind signal handlers
197     noui_connect();
198
199     return (AppInit(argc, argv) ? 0 : 1);
200 }
This page took 0.035862 seconds and 4 git commands to generate.