| 1903 | } |
| 1904 | |
| 1905 | std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo() |
| 1906 | { |
| 1907 | std::vector<AddedNodeInfo> ret; |
| 1908 | |
| 1909 | std::list<std::string> lAddresses(0); |
| 1910 | { |
| 1911 | LOCK(cs_vAddedNodes); |
| 1912 | ret.reserve(vAddedNodes.size()); |
| 1913 | std::copy(vAddedNodes.cbegin(), vAddedNodes.cend(), std::back_inserter(lAddresses)); |
| 1914 | } |
| 1915 | |
| 1916 | |
| 1917 | // Build a map of all already connected addresses (by IP:port and by name) to inbound/outbound and resolved CService |
| 1918 | std::map<CService, bool> mapConnected; |
| 1919 | std::map<std::string, std::pair<bool, CService>> mapConnectedByName; |
| 1920 | { |
| 1921 | LOCK(cs_vNodes); |
| 1922 | for (const CNode* pnode : vNodes) { |
| 1923 | if (pnode->addr.IsValid()) { |
| 1924 | mapConnected[pnode->addr] = pnode->fInbound; |
| 1925 | } |
| 1926 | std::string addrName = pnode->GetAddrName(); |
| 1927 | if (!addrName.empty()) { |
| 1928 | mapConnectedByName[std::move(addrName)] = std::make_pair(pnode->fInbound, static_cast<const CService&>(pnode->addr)); |
| 1929 | } |
| 1930 | } |
| 1931 | } |
| 1932 | |
| 1933 | for (const std::string& strAddNode : lAddresses) { |
| 1934 | CService service(LookupNumeric(strAddNode.c_str(), Params().GetDefaultPort())); |
| 1935 | AddedNodeInfo addedNode{strAddNode, CService(), false, false}; |
| 1936 | if (service.IsValid()) { |
| 1937 | // strAddNode is an IP:port |
| 1938 | auto it = mapConnected.find(service); |
| 1939 | if (it != mapConnected.end()) { |
| 1940 | addedNode.resolvedAddress = service; |
| 1941 | addedNode.fConnected = true; |
| 1942 | addedNode.fInbound = it->second; |
| 1943 | } |
| 1944 | } else { |
| 1945 | // strAddNode is a name |
| 1946 | auto it = mapConnectedByName.find(strAddNode); |
| 1947 | if (it != mapConnectedByName.end()) { |
| 1948 | addedNode.resolvedAddress = it->second.second; |
| 1949 | addedNode.fConnected = true; |
| 1950 | addedNode.fInbound = it->second.first; |
| 1951 | } |
| 1952 | } |
| 1953 | ret.emplace_back(std::move(addedNode)); |
| 1954 | } |
| 1955 | |
| 1956 | return ret; |
| 1957 | } |
| 1958 | |
| 1959 | void CConnman::ThreadOpenAddedConnections() |
| 1960 | { |
no test coverage detected