| 1500 | } |
| 1501 | |
| 1502 | std::vector<AddedNodeInfo> GetAddedNodeInfo() |
| 1503 | { |
| 1504 | std::vector<AddedNodeInfo> ret; |
| 1505 | |
| 1506 | std::list<std::string> lAddresses(0); |
| 1507 | { |
| 1508 | LOCK(cs_vAddedNodes); |
| 1509 | ret.reserve(vAddedNodes.size()); |
| 1510 | for (const std::string& strAddNode : vAddedNodes) |
| 1511 | lAddresses.push_back(strAddNode); |
| 1512 | } |
| 1513 | |
| 1514 | |
| 1515 | // Build a map of all already connected addresses (by IP:port and by name) to inbound/outbound and resolved CService |
| 1516 | std::map<CService, bool> mapConnected; |
| 1517 | std::map<std::string, std::pair<bool, CService>> mapConnectedByName; |
| 1518 | vector<CNode*> vNodesCopy; |
| 1519 | { |
| 1520 | LOCK(cs_vNodes); |
| 1521 | vNodesCopy = vNodes; |
| 1522 | } |
| 1523 | |
| 1524 | for (const CNode* pnode : vNodesCopy) { |
| 1525 | if (!pnode) continue; |
| 1526 | if (pnode->addr.IsValid()) { |
| 1527 | mapConnected[pnode->addr] = pnode->fInbound; |
| 1528 | } |
| 1529 | |
| 1530 | if (!pnode->addrName.empty()) { |
| 1531 | mapConnectedByName[pnode->addrName] = std::make_pair(pnode->fInbound, static_cast<const CService&>(pnode->addr)); |
| 1532 | } |
| 1533 | } |
| 1534 | |
| 1535 | for (const std::string& strAddNode : lAddresses) { |
| 1536 | CService service(strAddNode, Params().GetDefaultPort()); |
| 1537 | if (service.IsValid()) { |
| 1538 | // strAddNode is an IP:port |
| 1539 | auto it = mapConnected.find(service); |
| 1540 | if (it != mapConnected.end()) { |
| 1541 | ret.push_back(AddedNodeInfo{strAddNode, service, true, it->second}); |
| 1542 | } else { |
| 1543 | ret.push_back(AddedNodeInfo{strAddNode, CService(), false, false}); |
| 1544 | } |
| 1545 | } else { |
| 1546 | // strAddNode is a name |
| 1547 | auto it = mapConnectedByName.find(strAddNode); |
| 1548 | if (it != mapConnectedByName.end()) { |
| 1549 | ret.push_back(AddedNodeInfo{strAddNode, it->second.second, true, it->second.first}); |
| 1550 | } else { |
| 1551 | ret.push_back(AddedNodeInfo{strAddNode, CService(), false, false}); |
| 1552 | } |
| 1553 | } |
| 1554 | } |
| 1555 | |
| 1556 | return ret; |
| 1557 | } |
| 1558 | |
| 1559 | void ThreadOpenAddedConnections() |