]> Git Repo - VerusCoin.git/blob - src/bitcoind.cpp
Incorporate all Zcash updates through 2.0.7-3 in addition to PBaaS, reserves, etc.
[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 https://www.opensource.org/licenses/mit-license.php .
5
6 #include "clientversion.h"
7 #include "rpc/server.h"
8 #include "init.h"
9 #include "main.h"
10 #include "noui.h"
11 #include "scheduler.h"
12 #include "util.h"
13 #include "httpserver.h"
14 #include "httprpc.h"
15
16 #include <boost/algorithm/string/predicate.hpp>
17 #include <boost/filesystem.hpp>
18 #include <boost/thread.hpp>
19
20 #include <stdio.h>
21
22 #ifdef _WIN32
23 #define frpintf(...)
24 #define printf(...)
25 #endif
26
27 /* Introduction text for doxygen: */
28
29 /*! \mainpage Developer documentation
30  *
31  * \section intro_sec Introduction
32  *
33  * This is the developer documentation of the reference client for an experimental new digital currency called Bitcoin (https://www.bitcoin.org/),
34  * which enables instant payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer technology to operate
35  * with no central authority: managing transactions and issuing money are carried out collectively by the network.
36  *
37  * The software is a community-driven open source project, released under the MIT license.
38  *
39  * \section Navigation
40  * Use the buttons <code>Namespaces</code>, <code>Classes</code> or <code>Files</code> at the top of the page to start navigating the code.
41  */
42
43 static bool fDaemon;
44 #define KOMODO_ASSETCHAIN_MAXLEN 65
45 extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN];
46 void komodo_passport_iteration();
47 uint64_t komodo_interestsum();
48 int32_t komodo_longestchain();
49
50 void WaitForShutdown(boost::thread_group* threadGroup)
51 {
52     bool fShutdown = ShutdownRequested();
53     // Tell the main threads to shutdown.
54     while (!fShutdown)
55     {
56         //fprintf(stderr,"call passport iteration\n");
57         if ( ASSETCHAINS_SYMBOL[0] == 0 )
58         {
59             komodo_passport_iteration();
60             MilliSleep(10000);
61         }
62         else
63         {
64             komodo_interestsum();
65             komodo_longestchain();
66             MilliSleep(20000);
67         }
68         fShutdown = ShutdownRequested();
69     }
70     if (threadGroup)
71     {
72         Interrupt(*threadGroup);
73         threadGroup->join_all();
74     }
75 }
76
77 //////////////////////////////////////////////////////////////////////////////
78 //
79 // Start
80 //
81 extern int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,ASSETCHAIN_INIT;
82 extern std::string NOTARY_PUBKEY;
83 int32_t komodo_is_issuer();
84 void komodo_passport_iteration();
85
86 bool AppInit(int argc, char* argv[])
87 {
88     boost::thread_group threadGroup;
89     CScheduler scheduler;
90
91     bool fRet = false;
92
93     //
94     // Parameters
95     //
96     // If Qt is used, parameters/komodo.conf are parsed in qt/bitcoin.cpp's main()
97     ParseParameters(argc, argv);
98
99     // Process help and version before taking care about datadir
100     if (mapArgs.count("-?") || mapArgs.count("-h") ||  mapArgs.count("-help") || mapArgs.count("-version"))
101     {
102         std::string strUsage = _("Komodo Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n" + PrivacyInfo();
103
104         if (mapArgs.count("-version"))
105         {
106             strUsage += LicenseInfo();
107         }
108         else
109         {
110             strUsage += "\n" + _("Usage:") + "\n" +
111                   "  komodod [options]                     " + _("Start Komodo Daemon") + "\n";
112
113             strUsage += "\n" + HelpMessage(HMM_BITCOIND);
114         }
115
116         fprintf(stdout, "%s", strUsage.c_str());
117         return true;
118     }
119
120     try
121     {
122         if (!AppInitNetworking())
123             return false;
124
125         void komodo_args(char *argv0);
126         komodo_args(argv[0]);
127         fprintf(stderr,"call komodo_args.(%s) NOTARY_PUBKEY.(%s)\n",argv[0],NOTARY_PUBKEY.c_str());
128         while ( ASSETCHAIN_INIT == 0 )
129         {
130             //if ( komodo_is_issuer() != 0 )
131             //    komodo_passport_iteration();
132             #ifdef _WIN32
133             boost::this_thread::sleep_for(boost::chrono::seconds(1));
134             #else
135             sleep(1);
136             #endif
137         }
138         printf("initialized %s at %u\n",ASSETCHAINS_SYMBOL,(uint32_t)time(NULL));
139         if (!boost::filesystem::is_directory(GetDataDir(false)))
140         {
141             fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", mapArgs["-datadir"].c_str());
142             return false;
143         }
144         try
145         {
146             ReadConfigFile(mapArgs, mapMultiArgs);
147         } catch (const missing_zcash_conf& e) {
148             fprintf(stderr,
149                 (_("Before starting komodod, you need to create a configuration file:\n"
150                    "%s\n"
151                    "It can be completely empty! That indicates you are happy with the default\n"
152                    "configuration of komodod. But requiring a configuration file to start ensures\n"
153                    "that komodod won't accidentally compromise your privacy if there was a default\n"
154                    "option you needed to change.\n"
155                    "\n"
156                    "You can look at the example configuration file for suggestions of default\n"
157                    "options that you may want to change. It should be in one of these locations,\n"
158                    "depending on how you installed Komodo:\n") +
159                  _("- Source code:  %s\n"
160                    "- .deb package: %s\n")).c_str(),
161                 GetConfigFile().string().c_str(),
162                 "contrib/debian/examples/komodo.conf",
163                 "/usr/share/doc/komodo/examples/komodo.conf");
164             return false;
165         } catch (const std::exception& e) {
166             fprintf(stderr,"Error reading configuration file: %s\n", e.what());
167             return false;
168         }
169         // Check for -testnet or -regtest parameter (Params() calls are only valid after this clause)
170         if (!SelectParamsFromCommandLine()) {
171             fprintf(stderr, "Error: Invalid combination of -regtest and -testnet.\n");
172             return false;
173         }
174
175         // Command-line RPC
176         bool fCommandLine = false;
177         for (int i = 1; i < argc; i++)
178             if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "komodo:"))
179                 fCommandLine = true;
180
181         if (fCommandLine)
182         {
183             fprintf(stderr, "Error: There is no RPC client functionality in komodod. Use the komodo-cli utility instead.\n");
184             exit(EXIT_FAILURE);
185         }
186
187 #ifndef _WIN32
188         fDaemon = GetBoolArg("-daemon", false);
189         if (fDaemon)
190         {
191             fprintf(stdout, "Komodo %s server starting\n",ASSETCHAINS_SYMBOL);
192
193             // Daemonize
194             pid_t pid = fork();
195             if (pid < 0)
196             {
197                 fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno);
198                 return false;
199             }
200             if (pid > 0) // Parent process, pid is child process id
201             {
202                 return true;
203             }
204             // Child process falls through to rest of initialization
205
206             pid_t sid = setsid();
207             if (sid < 0)
208                 fprintf(stderr, "Error: setsid() returned %d errno %d\n", sid, errno);
209         }
210 #endif
211         SoftSetBoolArg("-server", true);
212
213         fRet = AppInit2(threadGroup, scheduler);
214     }
215     catch (const std::exception& e) {
216         PrintExceptionContinue(&e, "AppInit()");
217     } catch (...) {
218         PrintExceptionContinue(NULL, "AppInit()");
219     }
220     if (!fRet)
221     {
222         Interrupt(threadGroup);
223         // threadGroup.join_all(); was left out intentionally here, because we didn't re-test all of
224         // the startup-failure cases to make sure they don't result in a hang due to some
225         // thread-blocking-waiting-for-another-thread-during-startup case
226     } else {
227         WaitForShutdown(&threadGroup);
228     }
229     Shutdown();
230
231     return fRet;
232 }
233
234 int main(int argc, char* argv[])
235 {
236     SetupEnvironment();
237
238     // Connect bitcoind signal handlers
239     noui_connect();
240
241     return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);
242 }
This page took 0.034019 seconds and 4 git commands to generate.