#include "db.h"
#include "walletdb.h"
#include "net.h"
+#include "ntp.h"
using namespace json_spirit;
using namespace std;
LOCK(cs_vNodes);
vstats.reserve(vNodes.size());
- BOOST_FOREACH(CNode* pnode, vNodes) {
+ for (CNode* pnode : vNodes) {
CNodeStats stats;
pnode->copyStats(stats);
vstats.push_back(stats);
}
}
+struct addrManItemSort {
+ bool operator()(const CAddrInfo &leftItem, const CAddrInfo &rightItem) {
+ int64_t nTime = GetTime();
+ return leftItem.GetChance(nTime) > rightItem.GetChance(nTime);
+ }
+};
+
Value getaddrmaninfo(const Array& params, bool fHelp)
{
- if (fHelp || params.size() != 0)
+ if (fHelp || params.size() > 1)
throw runtime_error(
- "getaddrmaninfo\n"
+ "getaddrmaninfo [networkType]\n"
"Returns a dump of addrman data.");
- vector<CAddress> vAddr = addrman.GetAddr();
+ // Get a full list of "online" address items
+ vector<CAddrInfo> vAddr = addrman.GetOnlineAddr();
- Array ret;
+ // Sort by the GetChance result backwardly
+ sort(vAddr.begin(), vAddr.end(), addrManItemSort());
- BOOST_FOREACH(const CAddress &addr, vAddr) {
- // Don't return addresses older than nCutOff timestamp
- int64_t nCutOff = GetTime() - (nNodeLifespan * 24 * 60 * 60);
+ string strFilterNetType = "";
+ if (params.size() == 1)
+ strFilterNetType = params[0].get_str();
- if (!addr.IsRoutable() || addr.IsLocal() || addr.nTime > nCutOff)
+ Array ret;
+ for (const CAddrInfo &addr : vAddr) {
+ if (!addr.IsRoutable() || addr.IsLocal())
continue;
Object addrManItem;
case NET_TOR:
strNetType = "tor";
break;
- case NET_I2P:
- strNetType = "i2p";
- case NET_IPV4:
- strNetType = "ipv4";
- break;
- default:
+// case NET_I2P:
+// strNetType = "i2p";
+// break;
case NET_IPV6:
strNetType = "ipv6";
+ break;
+ default:
+ case NET_IPV4:
+ strNetType = "ipv4";
}
+
+ if (strFilterNetType.size() != 0 && strNetType != strFilterNetType)
+ continue;
+
+ addrManItem.push_back(Pair("chance", addr.GetChance(GetTime())));
addrManItem.push_back(Pair("type", strNetType));
addrManItem.push_back(Pair("time", (int64_t)addr.nTime));
Array ret;
- BOOST_FOREACH(const CNodeStats& stats, vstats) {
+ for (const CNodeStats& stats : vstats) {
Object obj;
obj.push_back(Pair("addr", stats.addrName));
obj.push_back(Pair("services", strprintf("%08" PRIx64, stats.nServices)));
- obj.push_back(Pair("lastsend", (boost::int64_t)stats.nLastSend));
- obj.push_back(Pair("lastrecv", (boost::int64_t)stats.nLastRecv));
- obj.push_back(Pair("bytessent", (boost::int64_t)stats.nSendBytes));
- obj.push_back(Pair("bytesrecv", (boost::int64_t)stats.nRecvBytes));
- obj.push_back(Pair("conntime", (boost::int64_t)stats.nTimeConnected));
+ obj.push_back(Pair("lastsend", (int64_t)stats.nLastSend));
+ obj.push_back(Pair("lastrecv", (int64_t)stats.nLastRecv));
+ obj.push_back(Pair("bytessent", (int64_t)stats.nSendBytes));
+ obj.push_back(Pair("bytesrecv", (int64_t)stats.nRecvBytes));
+ obj.push_back(Pair("conntime", (int64_t)stats.nTimeConnected));
obj.push_back(Pair("version", stats.nVersion));
obj.push_back(Pair("subver", stats.strSubVer));
obj.push_back(Pair("inbound", stats.fInbound));
- obj.push_back(Pair("releasetime", (boost::int64_t)stats.nReleaseTime));
+ obj.push_back(Pair("releasetime", (int64_t)stats.nReleaseTime));
obj.push_back(Pair("startingheight", stats.nStartingHeight));
obj.push_back(Pair("banscore", stats.nMisbehavior));
if (stats.fSyncNode)
if (params.size() == 1)
{
LOCK(cs_vAddedNodes);
- BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ for (string& strAddNode : vAddedNodes)
laddedNodes.push_back(strAddNode);
}
else
{
string strNode = params[1].get_str();
LOCK(cs_vAddedNodes);
- BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ for (string& strAddNode : vAddedNodes)
if (strAddNode == strNode)
{
laddedNodes.push_back(strAddNode);
if (!fDns)
{
Object ret;
- BOOST_FOREACH(string& strAddNode, laddedNodes)
+ for (string& strAddNode : laddedNodes)
ret.push_back(Pair("addednode", strAddNode));
return ret;
}
Array ret;
list<pair<string, vector<CService> > > laddedAddreses(0);
- BOOST_FOREACH(string& strAddNode, laddedNodes)
+ for (string& strAddNode : laddedNodes)
{
vector<CService> vservNode(0);
if(Lookup(strAddNode.c_str(), vservNode, GetDefaultPort(), fNameLookup, 0))
Array addresses;
bool fConnected = false;
- BOOST_FOREACH(CService& addrNode, it->second)
+ for (CService& addrNode : it->second)
{
bool fFound = false;
Object node;
node.push_back(Pair("address", addrNode.ToString()));
- BOOST_FOREACH(CNode* pnode, vNodes)
+ for (CNode* pnode : vNodes)
if (pnode->addr == addrNode)
{
fFound = true;
return ret;
}
-extern CCriticalSection cs_mapAlerts;
-extern map<uint256, CAlert> mapAlerts;
-
-// ppcoin: send alert.
// There is a known deadlock situation with ThreadMessageHandler
// ThreadMessageHandler: holds cs_vSend and acquiring cs_main in SendMessages()
// ThreadRPCServer: holds cs_main and acquiring cs_vSend in alert.RelayTo()/PushMessage()/BeginMessage()
// Relay alert
{
LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
+ for (CNode* pnode : vNodes)
alert.RelayTo(pnode);
}
"and current time.");
Object obj;
- obj.push_back(Pair("totalbytesrecv", static_cast< boost::uint64_t>(CNode::GetTotalBytesRecv())));
- obj.push_back(Pair("totalbytessent", static_cast<boost::uint64_t>(CNode::GetTotalBytesSent())));
- obj.push_back(Pair("timemillis", static_cast<boost::int64_t>(GetTimeMillis())));
+ obj.push_back(Pair("totalbytesrecv", static_cast<uint64_t>(CNode::GetTotalBytesRecv())));
+ obj.push_back(Pair("totalbytessent", static_cast<uint64_t>(CNode::GetTotalBytesSent())));
+ obj.push_back(Pair("timemillis", static_cast<int64_t>(GetTimeMillis())));
return obj;
-}
\ No newline at end of file
+}
+
+/*
+05:53:45 ntptime
+05:53:48
+{
+"epoch" : 1442494427,
+"time" : "2015-09-17 12:53:47 UTC"
+}
+
+05:53:56 ntptime time.windows.com
+05:53:57
+{
+"epoch" : 1442494436,
+"time" : "2015-09-17 12:53:56 UTC"
+}
+
+05:54:33 ntptime time-a.nist.gov
+05:54:34
+{
+"epoch" : 1442494473,
+"time" : "2015-09-17 12:54:33 UTC"
+}*/
+
+Value ntptime(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "ntptime [ntpserver]\n"
+ "Returns current time from specific or random NTP server.");
+
+ int64_t nTime;
+ if (params.size() > 0) {
+ string strHostName = params[0].get_str();
+ nTime = NtpGetTime(strHostName);
+ }
+ else {
+ CNetAddr ip;
+ nTime = NtpGetTime(ip);
+ }
+
+ Object obj;
+ switch (nTime) {
+ case -1:
+ throw runtime_error("Socket initialization error");
+ case -2:
+ throw runtime_error("Switching socket mode to non-blocking failed");
+ case -3:
+ throw runtime_error("Unable to send data");
+ case -4:
+ throw runtime_error("Receive timed out");
+ default:
+ if (nTime > 0 && nTime != 2085978496) {
+ obj.push_back(Pair("epoch", nTime));
+ obj.push_back(Pair("time", DateTimeStrFormat(nTime)));
+ }
+ else throw runtime_error("Unexpected response");
+ }
+
+ return obj;
+}