From aaa14d45644415fc486f3f5cc750462ee1986b8b Mon Sep 17 00:00:00 2001 From: cpubug Date: Tue, 1 Apr 2014 23:18:14 +0400 Subject: [PATCH 1/2] split AddressBook header/source --- AddressBook.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ AddressBook.h | 44 +++-------------------------------- Makefile | 2 +- 3 files changed, 66 insertions(+), 42 deletions(-) create mode 100644 AddressBook.cpp diff --git a/AddressBook.cpp b/AddressBook.cpp new file mode 100644 index 00000000..8bd82d42 --- /dev/null +++ b/AddressBook.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include "base64.h" +#include "util.h" +#include "Identity.h" +#include "Log.h" +#include "AddressBook.h" + +namespace i2p +{ +namespace data +{ + +AddressBook::AddressBook (): m_IsLoaded (false) +{ +} + + +const IdentHash * AddressBook::FindAddress (const std::string& address) +{ + if (!m_IsLoaded) + LoadHosts (); + auto it = m_Addresses.find (address); + if (it != m_Addresses.end ()) + return &it->second; + else + return nullptr; +} + + +void AddressBook::LoadHosts () +{ + m_IsLoaded = true; + std::ifstream f (i2p::util::filesystem::GetFullPath ("hosts.txt").c_str (), std::ofstream::in); // in text mode + if (!f.is_open ()) + { + LogPrint ("hosts.txt not found"); + return; + } + int numAddresses = 0; + char str[1024]; + while (!f.eof ()) + { + f.getline (str, 1024); + char * key = strchr (str, '='); + if (key) + { + *key = 0; + key++; + Identity ident; + Base64ToByteStream (key, strlen(key), (uint8_t *)&ident, sizeof (ident)); + m_Addresses[str] = CalculateIdentHash (ident); + numAddresses++; + } + } + LogPrint (numAddresses, " addresses loaded"); +} + +} +} + diff --git a/AddressBook.h b/AddressBook.h index 6d134247..8d255a7a 100644 --- a/AddressBook.h +++ b/AddressBook.h @@ -17,50 +17,12 @@ namespace data { public: - AddressBook (): m_IsLoaded (false) {}; - - const IdentHash * FindAddress (const std::string& address) - { - if (!m_IsLoaded) - LoadHosts (); - auto it = m_Addresses.find (address); - if (it != m_Addresses.end ()) - return &it->second; - else - return nullptr; - } + AddressBook (); + const IdentHash * FindAddress (const std::string& address); private: - void LoadHosts () - { - m_IsLoaded = true; - std::ifstream f (i2p::util::filesystem::GetFullPath ("hosts.txt").c_str (), std::ofstream::in); // in text mode - if (!f.is_open ()) - { - LogPrint ("hosts.txt not found"); - return; - } - int numAddresses = 0; - char str[1024]; - while (!f.eof ()) - { - f.getline (str, 1024); - char * key = strchr (str, '='); - if (key) - { - *key = 0; - key++; - Identity ident; - Base64ToByteStream (key, strlen(key), (uint8_t *)&ident, sizeof (ident)); - m_Addresses[str] = CalculateIdentHash (ident); - numAddresses++; - } - } - LogPrint (numAddresses, " addresses loaded"); - } - - private: + void LoadHosts (); std::map m_Addresses; bool m_IsLoaded; diff --git a/Makefile b/Makefile index d13d41b7..fec4f79d 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ OBJECTS = obj/i2p.o obj/base64.o obj/NTCPSession.o obj/RouterInfo.o obj/Transpor obj/RouterContext.o obj/NetDb.o obj/LeaseSet.o obj/Tunnel.o obj/TunnelEndpoint.o \ obj/TunnelGateway.o obj/TransitTunnel.o obj/I2NPProtocol.o obj/Log.o obj/Garlic.o \ obj/HTTPServer.o obj/Streaming.o obj/Identity.o obj/SSU.o obj/util.o obj/Reseed.o \ - obj/UPnP.o obj/TunnelPool.o obj/HTTPProxy.o + obj/UPnP.o obj/TunnelPool.o obj/HTTPProxy.o obj/AddressBook.o INCFLAGS = LDFLAGS = -Wl,-rpath,/usr/local/lib -lcryptopp -lboost_system -lboost_filesystem -lboost_regex -lboost_program_options -lpthread LIBS = From 0e49d4dcd65b8704bc344694ab04fde5d3e51b1c Mon Sep 17 00:00:00 2001 From: cpubug Date: Wed, 2 Apr 2014 00:27:40 +0400 Subject: [PATCH 2/2] improve hosts.txt loading --- AddressBook.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/AddressBook.cpp b/AddressBook.cpp index 8bd82d42..023e75cf 100644 --- a/AddressBook.cpp +++ b/AddressBook.cpp @@ -39,18 +39,26 @@ void AddressBook::LoadHosts () return; } int numAddresses = 0; - char str[1024]; + + std::string s; + while (!f.eof ()) { - f.getline (str, 1024); - char * key = strchr (str, '='); - if (key) + getline(f, s); + + if (!s.length()) + break; + + size_t pos = s.find('='); + + if (pos != std::string::npos) { - *key = 0; - key++; + std::string name = s.substr(0, pos++); + std::string addr = s.substr(pos); + Identity ident; - Base64ToByteStream (key, strlen(key), (uint8_t *)&ident, sizeof (ident)); - m_Addresses[str] = CalculateIdentHash (ident); + Base64ToByteStream (addr.c_str(), addr.length(), (uint8_t *)&ident, sizeof (ident)); + m_Addresses[name] = CalculateIdentHash (ident); numAddresses++; } }