From 277a9312e29d4e77282dce8cdd1f914bf034ca57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Fri, 5 Dec 2014 16:06:18 -0500 Subject: [PATCH] listeners: init with local values --- include/opendht/dht.h | 5 ++++- src/dht.cpp | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/opendht/dht.h b/include/opendht/dht.h index c193df30..68b185d1 100644 --- a/include/opendht/dht.h +++ b/include/opendht/dht.h @@ -509,8 +509,11 @@ private: std::vector store {}; std::list searches {}; uint16_t search_id {0}; + + // map a global listen token to IPv4, IPv6 specific listen tokens. + // 0 is the invalid token. std::map> listeners {}; - size_t listener_token {0}; + size_t listener_token {1}; sockaddr_storage blacklist[BLACKLISTED_MAX] {}; unsigned next_blacklisted = 0; diff --git a/src/dht.cpp b/src/dht.cpp index bd25d02b..ba51e17f 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -1000,6 +1000,8 @@ Dht::announce(const InfoHash& id, sa_family_t af, const std::shared_ptr& size_t Dht::listenTo(const InfoHash& id, sa_family_t af, GetCallback cb, Value::Filter f) { + if (!isRunning(af)) + return 0; DHT_WARN("listenTo %s", id.toString().c_str()); auto sri = std::find_if (searches.begin(), searches.end(), [id,af](const Search& s) { return s.id == id && s.af == af; @@ -1037,6 +1039,8 @@ Dht::listen(const InfoHash& id, GetCallback cb, Value::Filter f) return true; }; + gcb(getLocal(id, f)); + auto token4 = Dht::listenTo(id, AF_INET, gcb, f); auto token6 = Dht::listenTo(id, AF_INET6, gcb, f); auto token = ++listener_token; @@ -1053,6 +1057,8 @@ Dht::cancelListen(const InfoHash& id, size_t token) for (auto& s : searches) { if (s.id != id) continue; auto af_token = s.af == AF_INET ? it->second.first : it->second.second; + if (af_token == 0) + continue; auto sit = s.listeners.find(af_token); if (sit == s.listeners.end()) continue;