From 2abc9807d931b5e1a18bf210045885b649ca7b9b Mon Sep 17 00:00:00 2001
From: R4SAS <r4sas@i2pmail.org>
Date: Fri, 17 May 2019 11:04:44 +0300
Subject: [PATCH] handle webconsole and tunnels bind errors (#510)

---
 daemon/Daemon.cpp             |  2 +-
 daemon/HTTPServer.cpp         | 13 +++++++++----
 libi2pd_client/I2PService.cpp | 10 +++++++---
 libi2pd_client/I2PTunnel.cpp  |  2 +-
 4 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/daemon/Daemon.cpp b/daemon/Daemon.cpp
index 0ea45bb7..8dd4b6f6 100644
--- a/daemon/Daemon.cpp
+++ b/daemon/Daemon.cpp
@@ -322,7 +322,7 @@ namespace i2p
 			bool http; i2p::config::GetOption("http.enabled", http);
 			if (http) {
 				std::string httpAddr; i2p::config::GetOption("http.address", httpAddr);
-				uint16_t		httpPort; i2p::config::GetOption("http.port",		 httpPort);
+				uint16_t    httpPort; i2p::config::GetOption("http.port", httpPort);
 				LogPrint(eLogInfo, "Daemon: starting HTTP Server at ", httpAddr, ":", httpPort);
 				d.httpServer = std::unique_ptr<i2p::http::HTTPServer>(new i2p::http::HTTPServer(httpAddr, httpPort));
 				d.httpServer->Start();
diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp
index 963fed71..7967806b 100644
--- a/daemon/HTTPServer.cpp
+++ b/daemon/HTTPServer.cpp
@@ -1084,10 +1084,15 @@ namespace http {
 			i2p::config::SetOption("http.pass", pass);
 			LogPrint(eLogInfo, "HTTPServer: password set to ", pass);
 		}
-		m_IsRunning = true;
-		m_Thread = std::unique_ptr<std::thread>(new std::thread (std::bind (&HTTPServer::Run, this)));
-		m_Acceptor.listen ();
-		Accept ();
+
+		try {
+			m_IsRunning = true;
+			m_Thread = std::unique_ptr<std::thread>(new std::thread (std::bind (&HTTPServer::Run, this)));
+			m_Acceptor.listen ();
+			Accept ();
+		} catch (std::exception& ex) {
+			LogPrint (eLogError, "HTTPServer: failed to start webconsole: ", ex.what ());
+		}
 	}
 
 	void HTTPServer::Stop ()
diff --git a/libi2pd_client/I2PService.cpp b/libi2pd_client/I2PService.cpp
index 7157020f..c795fc5f 100644
--- a/libi2pd_client/I2PService.cpp
+++ b/libi2pd_client/I2PService.cpp
@@ -283,10 +283,14 @@ namespace client
 	void TCPIPAcceptor::Start ()
 	{
 		m_Acceptor.reset (new boost::asio::ip::tcp::acceptor (GetService (), m_LocalEndpoint));
-		//update the local end point in case port has been set zero and got updated now
+		// update the local end point in case port has been set zero and got updated now
 		m_LocalEndpoint = m_Acceptor->local_endpoint();
-		m_Acceptor->listen ();
-		Accept ();
+		try {
+			m_Acceptor->listen ();
+			Accept ();
+		} catch (std::exception& ex) {
+			LogPrint (eLogError, "I2PService: failed to start ", GetName(), " acceptor: ", ex.what ());
+		}
 	}
 
 	void TCPIPAcceptor::Stop ()
diff --git a/libi2pd_client/I2PTunnel.cpp b/libi2pd_client/I2PTunnel.cpp
index 290ce11e..b7487441 100644
--- a/libi2pd_client/I2PTunnel.cpp
+++ b/libi2pd_client/I2PTunnel.cpp
@@ -389,7 +389,7 @@ namespace client
 	}
 
 
-	/* This handler tries to stablish a connection with the desired server and dies if it fails to do so */
+	/* This handler tries to establish a connection with the desired server and dies if it fails to do so */
 	class I2PClientTunnelHandler: public I2PServiceHandler, public std::enable_shared_from_this<I2PClientTunnelHandler>
 	{
 		public: