mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
use shared pointers for tunnel reload
This commit is contained in:
parent
0df68872ab
commit
2fbbbf298b
@ -488,8 +488,8 @@ namespace client
|
|||||||
{
|
{
|
||||||
localDestination = m_SharedLocalDestination;
|
localDestination = m_SharedLocalDestination;
|
||||||
}
|
}
|
||||||
auto clientTunnel = new I2PUDPClientTunnel(name, dest, end, localDestination, destinationPort);
|
auto clientTunnel = std::make_shared<I2PUDPClientTunnel>(name, dest, end, localDestination, destinationPort);
|
||||||
if(m_ClientForwards.insert(std::make_pair(end, std::unique_ptr<I2PUDPClientTunnel>(clientTunnel))).second)
|
if(m_ClientForwards.insert(std::make_pair(end, clientTunnel)).second)
|
||||||
{
|
{
|
||||||
clientTunnel->Start();
|
clientTunnel->Start();
|
||||||
}
|
}
|
||||||
@ -498,31 +498,35 @@ namespace client
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
boost::asio::ip::tcp::endpoint clientEndpoint;
|
boost::asio::ip::tcp::endpoint clientEndpoint;
|
||||||
I2PService * clientTunnel = nullptr;
|
std::shared_ptr<I2PService> clientTunnel;
|
||||||
if (type == I2P_TUNNELS_SECTION_TYPE_SOCKS)
|
if (type == I2P_TUNNELS_SECTION_TYPE_SOCKS)
|
||||||
{
|
{
|
||||||
// socks proxy
|
// socks proxy
|
||||||
clientTunnel = new i2p::proxy::SOCKSProxy(name, address, port, false, "", destinationPort, localDestination);
|
auto tun = std::make_shared<i2p::proxy::SOCKSProxy>(name, address, port, false, "", destinationPort, localDestination);
|
||||||
clientEndpoint = ((i2p::proxy::SOCKSProxy*)clientTunnel)->GetLocalEndpoint ();
|
clientTunnel = tun;
|
||||||
|
clientEndpoint = tun->GetLocalEndpoint ();
|
||||||
}
|
}
|
||||||
else if (type == I2P_TUNNELS_SECTION_TYPE_HTTPPROXY)
|
else if (type == I2P_TUNNELS_SECTION_TYPE_HTTPPROXY)
|
||||||
{
|
{
|
||||||
// http proxy
|
// http proxy
|
||||||
std::string outproxy = section.second.get("outproxy", "");
|
std::string outproxy = section.second.get("outproxy", "");
|
||||||
clientTunnel = new i2p::proxy::HTTPProxy(name, address, port, outproxy, localDestination);
|
auto tun = std::make_shared<i2p::proxy::HTTPProxy>(name, address, port, outproxy, localDestination);
|
||||||
clientEndpoint = ((i2p::proxy::HTTPProxy*)clientTunnel)->GetLocalEndpoint ();
|
clientTunnel = tun;
|
||||||
|
clientEndpoint = tun->GetLocalEndpoint ();
|
||||||
}
|
}
|
||||||
else if (type == I2P_TUNNELS_SECTION_TYPE_WEBSOCKS)
|
else if (type == I2P_TUNNELS_SECTION_TYPE_WEBSOCKS)
|
||||||
{
|
{
|
||||||
// websocks proxy
|
// websocks proxy
|
||||||
clientTunnel = new WebSocks(address, port, localDestination);;
|
auto tun = std::make_shared<WebSocks>(address, port, localDestination);
|
||||||
clientEndpoint = ((WebSocks*)clientTunnel)->GetLocalEndpoint();
|
clientTunnel = tun;
|
||||||
|
clientEndpoint = tun->GetLocalEndpoint();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// tcp client
|
// tcp client
|
||||||
clientTunnel = new I2PClientTunnel (name, dest, address, port, localDestination, destinationPort);
|
auto tun = std::make_shared<I2PClientTunnel> (name, dest, address, port, localDestination, destinationPort);
|
||||||
clientEndpoint = ((I2PClientTunnel*)clientTunnel)->GetLocalEndpoint ();
|
clientTunnel = tun;
|
||||||
|
clientEndpoint = tun->GetLocalEndpoint ();
|
||||||
}
|
}
|
||||||
uint32_t timeout = section.second.get<uint32_t>(I2P_CLIENT_TUNNEL_CONNECT_TIMEOUT, 0);
|
uint32_t timeout = section.second.get<uint32_t>(I2P_CLIENT_TUNNEL_CONNECT_TIMEOUT, 0);
|
||||||
if(timeout)
|
if(timeout)
|
||||||
@ -531,8 +535,7 @@ namespace client
|
|||||||
LogPrint(eLogInfo, "Clients: I2P Client tunnel connect timeout set to ", timeout);
|
LogPrint(eLogInfo, "Clients: I2P Client tunnel connect timeout set to ", timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto clientTunnelDest = clientTunnel->GetLocalDestination (); // make copy of destination for possible update
|
auto ins = m_ClientTunnels.insert (std::make_pair (clientEndpoint, clientTunnel));
|
||||||
auto ins = m_ClientTunnels.insert (std::make_pair (clientEndpoint, std::unique_ptr<I2PService>(clientTunnel)));
|
|
||||||
if (ins.second)
|
if (ins.second)
|
||||||
{
|
{
|
||||||
clientTunnel->Start ();
|
clientTunnel->Start ();
|
||||||
@ -541,10 +544,10 @@ namespace client
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: update
|
// TODO: update
|
||||||
if (ins.first->second->GetLocalDestination () != clientTunnelDest)
|
if (ins.first->second->GetLocalDestination () != clientTunnel->GetLocalDestination ())
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Clients: I2P client tunnel destination updated");
|
LogPrint (eLogInfo, "Clients: I2P client tunnel destination updated");
|
||||||
ins.first->second->SetLocalDestination (clientTunnelDest);
|
ins.first->second->SetLocalDestination (clientTunnel->GetLocalDestination ());
|
||||||
}
|
}
|
||||||
ins.first->second->isUpdated = true;
|
ins.first->second->isUpdated = true;
|
||||||
LogPrint (eLogInfo, "Clients: I2P client tunnel for endpoint ", clientEndpoint, " already exists");
|
LogPrint (eLogInfo, "Clients: I2P client tunnel for endpoint ", clientEndpoint, " already exists");
|
||||||
@ -589,7 +592,7 @@ namespace client
|
|||||||
// TODO: hostnames
|
// TODO: hostnames
|
||||||
auto localAddress = boost::asio::ip::address::from_string(address);
|
auto localAddress = boost::asio::ip::address::from_string(address);
|
||||||
boost::asio::ip::udp::endpoint endpoint(boost::asio::ip::address::from_string(host), port);
|
boost::asio::ip::udp::endpoint endpoint(boost::asio::ip::address::from_string(host), port);
|
||||||
I2PUDPServerTunnel * serverTunnel = new I2PUDPServerTunnel(name, localDestination, localAddress, endpoint, port);
|
auto serverTunnel = std::make_shared<I2PUDPServerTunnel>(name, localDestination, localAddress, endpoint, port);
|
||||||
if(!isUniqueLocal)
|
if(!isUniqueLocal)
|
||||||
{
|
{
|
||||||
LogPrint(eLogInfo, "Clients: disabling loopback address mapping");
|
LogPrint(eLogInfo, "Clients: disabling loopback address mapping");
|
||||||
@ -600,7 +603,7 @@ namespace client
|
|||||||
std::make_pair(
|
std::make_pair(
|
||||||
std::make_pair(
|
std::make_pair(
|
||||||
localDestination->GetIdentHash(), port),
|
localDestination->GetIdentHash(), port),
|
||||||
std::unique_ptr<I2PUDPServerTunnel>(serverTunnel))).second)
|
serverTunnel)).second)
|
||||||
{
|
{
|
||||||
serverTunnel->Start();
|
serverTunnel->Start();
|
||||||
LogPrint(eLogInfo, "Clients: I2P Server Forward created for UDP Endpoint ", host, ":", port, " bound on ", address, " for ",localDestination->GetIdentHash().ToBase32());
|
LogPrint(eLogInfo, "Clients: I2P Server Forward created for UDP Endpoint ", host, ":", port, " bound on ", address, " for ",localDestination->GetIdentHash().ToBase32());
|
||||||
@ -611,13 +614,13 @@ namespace client
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
I2PServerTunnel * serverTunnel;
|
std::shared_ptr<I2PServerTunnel> serverTunnel;
|
||||||
if (type == I2P_TUNNELS_SECTION_TYPE_HTTP)
|
if (type == I2P_TUNNELS_SECTION_TYPE_HTTP)
|
||||||
serverTunnel = new I2PServerTunnelHTTP (name, host, port, localDestination, hostOverride, inPort, gzip);
|
serverTunnel = std::make_shared<I2PServerTunnelHTTP> (name, host, port, localDestination, hostOverride, inPort, gzip);
|
||||||
else if (type == I2P_TUNNELS_SECTION_TYPE_IRC)
|
else if (type == I2P_TUNNELS_SECTION_TYPE_IRC)
|
||||||
serverTunnel = new I2PServerTunnelIRC (name, host, port, localDestination, webircpass, inPort, gzip);
|
serverTunnel = std::make_shared<I2PServerTunnelIRC> (name, host, port, localDestination, webircpass, inPort, gzip);
|
||||||
else // regular server tunnel by default
|
else // regular server tunnel by default
|
||||||
serverTunnel = new I2PServerTunnel (name, host, port, localDestination, inPort, gzip);
|
serverTunnel = std::make_shared<I2PServerTunnel> (name, host, port, localDestination, inPort, gzip);
|
||||||
|
|
||||||
if(!isUniqueLocal)
|
if(!isUniqueLocal)
|
||||||
{
|
{
|
||||||
@ -640,10 +643,9 @@ namespace client
|
|||||||
while (comma != std::string::npos);
|
while (comma != std::string::npos);
|
||||||
serverTunnel->SetAccessList (idents);
|
serverTunnel->SetAccessList (idents);
|
||||||
}
|
}
|
||||||
auto serverTunnelDest = serverTunnel->GetLocalDestination ();
|
|
||||||
auto ins = m_ServerTunnels.insert (std::make_pair (
|
auto ins = m_ServerTunnels.insert (std::make_pair (
|
||||||
std::make_pair (localDestination->GetIdentHash (), inPort),
|
std::make_pair (localDestination->GetIdentHash (), inPort),
|
||||||
std::unique_ptr<I2PServerTunnel>(serverTunnel)));
|
serverTunnel));
|
||||||
if (ins.second)
|
if (ins.second)
|
||||||
{
|
{
|
||||||
serverTunnel->Start ();
|
serverTunnel->Start ();
|
||||||
@ -652,10 +654,10 @@ namespace client
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: update
|
// TODO: update
|
||||||
if (ins.first->second->GetLocalDestination () != serverTunnelDest)
|
if (ins.first->second->GetLocalDestination () != serverTunnel->GetLocalDestination ())
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Clients: I2P server tunnel destination updated");
|
LogPrint (eLogInfo, "Clients: I2P server tunnel destination updated");
|
||||||
ins.first->second->SetLocalDestination (serverTunnelDest);
|
ins.first->second->SetLocalDestination (serverTunnel->GetLocalDestination ());
|
||||||
}
|
}
|
||||||
ins.first->second->isUpdated = true;
|
ins.first->second->isUpdated = true;
|
||||||
LogPrint (eLogInfo, "Clients: I2P server tunnel for destination/port ", m_AddressBook.ToAddress(localDestination->GetIdentHash ()), "/", inPort, " already exists");
|
LogPrint (eLogInfo, "Clients: I2P server tunnel for destination/port ", m_AddressBook.ToAddress(localDestination->GetIdentHash ()), "/", inPort, " already exists");
|
||||||
|
@ -113,12 +113,12 @@ namespace client
|
|||||||
|
|
||||||
i2p::proxy::HTTPProxy * m_HttpProxy;
|
i2p::proxy::HTTPProxy * m_HttpProxy;
|
||||||
i2p::proxy::SOCKSProxy * m_SocksProxy;
|
i2p::proxy::SOCKSProxy * m_SocksProxy;
|
||||||
std::map<boost::asio::ip::tcp::endpoint, std::unique_ptr<I2PService> > m_ClientTunnels; // local endpoint->tunnel
|
std::map<boost::asio::ip::tcp::endpoint, std::shared_ptr<I2PService> > m_ClientTunnels; // local endpoint->tunnel
|
||||||
std::map<std::pair<i2p::data::IdentHash, int>, std::unique_ptr<I2PServerTunnel> > m_ServerTunnels; // <destination,port>->tunnel
|
std::map<std::pair<i2p::data::IdentHash, int>, std::shared_ptr<I2PServerTunnel> > m_ServerTunnels; // <destination,port>->tunnel
|
||||||
|
|
||||||
std::mutex m_ForwardsMutex;
|
std::mutex m_ForwardsMutex;
|
||||||
std::map<boost::asio::ip::udp::endpoint, std::unique_ptr<I2PUDPClientTunnel> > m_ClientForwards; // local endpoint -> udp tunnel
|
std::map<boost::asio::ip::udp::endpoint, std::shared_ptr<I2PUDPClientTunnel> > m_ClientForwards; // local endpoint -> udp tunnel
|
||||||
std::map<std::pair<i2p::data::IdentHash, int>, std::unique_ptr<I2PUDPServerTunnel> > m_ServerForwards; // <destination,port> -> udp tunnel
|
std::map<std::pair<i2p::data::IdentHash, int>, std::shared_ptr<I2PUDPServerTunnel> > m_ServerForwards; // <destination,port> -> udp tunnel
|
||||||
|
|
||||||
SAMBridge * m_SamBridge;
|
SAMBridge * m_SamBridge;
|
||||||
BOBCommandChannel * m_BOBCommandChannel;
|
BOBCommandChannel * m_BOBCommandChannel;
|
||||||
|
Loading…
Reference in New Issue
Block a user