diff --git a/Daemon.cpp b/Daemon.cpp index 7dfe54d9..e0c93cb3 100644 --- a/Daemon.cpp +++ b/Daemon.cpp @@ -33,7 +33,7 @@ namespace i2p i2p::proxy::HTTPProxy *httpProxy; }; - Daemon_Singleton::Daemon_Singleton() : d(*new Daemon_Singleton_Private()), running(1) {}; + Daemon_Singleton::Daemon_Singleton() : running(1), d(*new Daemon_Singleton_Private()) {}; Daemon_Singleton::~Daemon_Singleton() { delete &d; }; diff --git a/HTTPServer.cpp b/HTTPServer.cpp index ac23ebb3..c2a235fa 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -1,5 +1,4 @@ #include -#include #include #include "base64.h" #include "Log.h" @@ -388,8 +387,8 @@ namespace util { if (m_Stream) m_Stream->AsyncReceive (boost::asio::buffer (m_StreamBuffer, 8192), - boost::protect (boost::bind (&HTTPConnection::HandleStreamReceive, this, - boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)), + boost::bind (&HTTPConnection::HandleStreamReceive, this, + boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred), 45); // 45 seconds timeout } diff --git a/Identity.cpp b/Identity.cpp index c7c3ed0e..5a59e26e 100644 --- a/Identity.cpp +++ b/Identity.cpp @@ -40,6 +40,12 @@ namespace data return *this; } + bool IdentHash::FromBase32(const std::string& s) + { + size_t count = Base32ToByteStream(s.c_str(), s.length(), m_Hash, sizeof(m_Hash)); + return count == sizeof(m_Hash); + } + Keys CreateRandomKeys () { Keys keys; diff --git a/Identity.h b/Identity.h index ff35a7db..be9ae901 100644 --- a/Identity.h +++ b/Identity.h @@ -73,7 +73,9 @@ namespace data bool operator== (const IdentHash& other) const { return !memcmp (m_Hash, other.m_Hash, 32); }; bool operator< (const IdentHash& other) const { return memcmp (m_Hash, other.m_Hash, 32) < 0; }; - + + bool FromBase32(const std::string&); + private: uint8_t m_Hash[32]; @@ -106,7 +108,7 @@ namespace data public: RoutingDestination (): m_ElGamalEncryption (nullptr) {}; - virtual ~RoutingDestination () { if (m_ElGamalEncryption) delete m_ElGamalEncryption; }; + virtual ~RoutingDestination () { delete m_ElGamalEncryption; }; virtual const IdentHash& GetIdentHash () const = 0; virtual const uint8_t * GetEncryptionPublicKey () const = 0; diff --git a/Log.cpp b/Log.cpp index 4db4920e..92fd8a25 100644 --- a/Log.cpp +++ b/Log.cpp @@ -2,14 +2,19 @@ #include "Daemon.h" -i2p::util::MsgQueue g_Log; +Log g_Log; void LogMsg::Process() { if (Daemon.isLogging == 1 && Daemon.logfile.is_open()) - { Daemon.logfile << s.str(); - Daemon.logfile.flush(); - } + output << s.str(); -} \ No newline at end of file +} + +void Log::Flush () +{ + if (Daemon.isLogging == 1 && Daemon.logfile.is_open()) + Daemon.logfile.flush(); +} + diff --git a/Log.h b/Log.h index acef8f8e..a5856ba7 100644 --- a/Log.h +++ b/Log.h @@ -3,6 +3,7 @@ #include #include +#include #include "Queue.h" struct LogMsg @@ -15,7 +16,18 @@ struct LogMsg void Process(); }; -extern i2p::util::MsgQueue g_Log; +class Log: public i2p::util::MsgQueue +{ + public: + + Log () { SetOnEmpty (std::bind (&Log::Flush, this)); }; + + private: + + void Flush (); +}; + +extern Log g_Log; template void LogPrint (std::stringstream& s, TValue arg) diff --git a/Queue.h b/Queue.h index 85114bc1..22f51e69 100644 --- a/Queue.h +++ b/Queue.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace i2p { @@ -46,6 +47,12 @@ namespace util return el; } + void Wait () + { + std::unique_lock l(m_QueueMutex); + m_NonEmpty.wait (l); + } + bool Wait (int sec, int usec) { std::unique_lock l(m_QueueMutex); @@ -98,27 +105,40 @@ namespace util { public: - MsgQueue (): m_Thread (std::bind (&MsgQueue::Run, this)) , running(1) {}; + typedef std::function OnEmpty; + + MsgQueue (): m_IsRunning (true), m_Thread (std::bind (&MsgQueue::Run, this)) {}; void Stop() { - running = 0; + m_IsRunning = false; + Queue::WakeUp (); m_Thread.join(); } + void SetOnEmpty (OnEmpty const & e) { m_OnEmpty = e; }; + private: + void Run () { - Msg * msg = nullptr; - while ((msg = Queue::GetNext ()) != nullptr && running) + while (m_IsRunning) { - msg->Process (); - delete msg; + while (Msg * msg = Queue::Get ()) + { + msg->Process (); + delete msg; + } + if (m_OnEmpty != nullptr) + m_OnEmpty (); + Queue::Wait (); } } private: - std::thread m_Thread; - volatile int running; + + bool m_IsRunning; + std::thread m_Thread; + OnEmpty m_OnEmpty; }; } } diff --git a/Streaming.cpp b/Streaming.cpp index 9a23c313..d5e3fbcd 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -283,11 +283,13 @@ namespace stream bool Stream::SendPacket (const uint8_t * buf, size_t len) { const I2NPMessage * leaseSet = nullptr; + if (m_LeaseSetUpdated) { leaseSet = m_LocalDestination->GetLeaseSet (); m_LeaseSetUpdated = false; } + I2NPMessage * msg = i2p::garlic::routing.WrapMessage (m_RemoteLeaseSet, CreateDataMessage (this, buf, len), leaseSet); if (!m_OutboundTunnel || m_OutboundTunnel->IsFailed ()) diff --git a/Streaming.h b/Streaming.h index 88fd7c20..5a0ed383 100644 --- a/Streaming.h +++ b/Streaming.h @@ -214,8 +214,8 @@ namespace stream } } m_ReceiveTimer.expires_from_now (boost::posix_time::seconds(timeout)); - m_ReceiveTimer.async_wait (boost::bind (&Stream::HandleReceiveTimer, - this, boost::asio::placeholders::error, buffer, handler)); + m_ReceiveTimer.async_wait ([=](const boost::system::error_code& ecode) + { this->HandleReceiveTimer (ecode, buffer, handler); }); } template diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 5541301f..ac114a45 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -21,6 +21,7 @@ set ( SOURCES NTCPSession.cpp RouterContext.cpp SSU.cpp + SSUData.cpp TransitTunnel.cpp Tunnel.cpp TunnelGateway.cpp @@ -37,6 +38,7 @@ set ( SOURCES TunnelEndpoint.cpp TunnelPool.cpp util.cpp + Daemon.cpp ) set ( HEADERS @@ -48,6 +50,7 @@ set ( HEADERS NTCPSession.h RouterContext.h SSU.h + SSUData.h TransitTunnel.h Tunnel.h TunnelGateway.h @@ -64,8 +67,17 @@ set ( HEADERS TunnelEndpoint.h TunnelPool.h util.h + Daemon.h ) +if (WIN32) + list (APPEND SOURCES DeamonWin32.cpp) +else () + list (APPEND SOURCES DaemonLinux.cpp) +endif () + + + source_group ("Header Files" FILES ${HEADERS}) source_group ("Source Files" FILES ${SOURCES})