}
}
+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() > 1)
+ throw runtime_error(
+ "getaddrmaninfo [networkType]\n"
+ "Returns a dump of addrman data.");
+
+ // Get a full list of "online" address items
+ vector<CAddrInfo> vAddr = addrman.GetOnlineAddr();
+
+ // Sort by the GetChance result backwardly
+ sort(vAddr.begin(), vAddr.end(), addrManItemSort());
+
+ string strFilterNetType = "";
+ if (params.size() == 1)
+ strFilterNetType = params[0].get_str();
+
+ Array ret;
+ BOOST_FOREACH(const CAddrInfo &addr, vAddr) {
+ if (!addr.IsRoutable() || addr.IsLocal())
+ continue;
+
+ Object addrManItem;
+ addrManItem.push_back(Pair("address", addr.ToString()));
+
+ string strNetType;
+ switch(addr.GetNetwork())
+ {
+ case NET_TOR:
+ strNetType = "tor";
+ break;
+// 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));
+
+ ret.push_back(addrManItem);
+ }
+
+ return ret;
+}
+
Value getpeerinfo(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
if (strCommand == "onetry")
{
CAddress addr;
- ConnectNode(addr, strNode.c_str());
+ OpenNetworkConnection(addr, NULL, strNode.c_str());
return Value::null;
}
return Value::null;
}
+Value getaddednodeinfo(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2)
+ throw runtime_error(
+ "getaddednodeinfo <dns> [node]\n"
+ "Returns information about the given added node, or all added nodes\n"
+ "(note that onetry addnodes are not listed here)\n"
+ "If dns is false, only a list of added nodes will be provided,\n"
+ "otherwise connected information will also be available.");
+
+ bool fDns = params[0].get_bool();
+
+ list<string> laddedNodes(0);
+ if (params.size() == 1)
+ {
+ LOCK(cs_vAddedNodes);
+ BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ laddedNodes.push_back(strAddNode);
+ }
+ else
+ {
+ string strNode = params[1].get_str();
+ LOCK(cs_vAddedNodes);
+ BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ if (strAddNode == strNode)
+ {
+ laddedNodes.push_back(strAddNode);
+ break;
+ }
+ if (laddedNodes.size() == 0)
+ throw JSONRPCError(-24, "Error: Node has not been added.");
+ }
+
+ if (!fDns)
+ {
+ Object ret;
+ BOOST_FOREACH(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)
+ {
+ vector<CService> vservNode(0);
+ if(Lookup(strAddNode.c_str(), vservNode, GetDefaultPort(), fNameLookup, 0))
+ laddedAddreses.push_back(make_pair(strAddNode, vservNode));
+ else
+ {
+ Object obj;
+ obj.push_back(Pair("addednode", strAddNode));
+ obj.push_back(Pair("connected", false));
+ Array addresses;
+ obj.push_back(Pair("addresses", addresses));
+ }
+ }
+
+ LOCK(cs_vNodes);
+ for (list<pair<string, vector<CService> > >::iterator it = laddedAddreses.begin(); it != laddedAddreses.end(); it++)
+ {
+ Object obj;
+ obj.push_back(Pair("addednode", it->first));
+
+ Array addresses;
+ bool fConnected = false;
+ BOOST_FOREACH(CService& addrNode, it->second)
+ {
+ bool fFound = false;
+ Object node;
+ node.push_back(Pair("address", addrNode.ToString()));
+ BOOST_FOREACH(CNode* pnode, vNodes)
+ if (pnode->addr == addrNode)
+ {
+ fFound = true;
+ fConnected = true;
+ node.push_back(Pair("connected", pnode->fInbound ? "inbound" : "outbound"));
+ break;
+ }
+ if (!fFound)
+ node.push_back(Pair("connected", "false"));
+ addresses.push_back(node);
+ }
+ obj.push_back(Pair("connected", fConnected));
+ obj.push_back(Pair("addresses", addresses));
+ ret.push_back(obj);
+ }
+
+ 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()