mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Added support for explicitly binding an outbound connection to an ip. Will be used by spanningtree.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6534 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
parent
8785246ab6
commit
5f9237c4a3
@ -69,6 +69,8 @@ class InspSocket : public EventHandler
|
||||
{
|
||||
public:
|
||||
|
||||
std::string cbindip;
|
||||
|
||||
bool IsIOHooked;
|
||||
|
||||
InspIRCd* Instance;
|
||||
@ -149,7 +151,7 @@ class InspSocket : public EventHandler
|
||||
*/
|
||||
bool WaitingForWriteEvent;
|
||||
|
||||
bool BindAddr();
|
||||
bool BindAddr(const std::string &ip);
|
||||
|
||||
/**
|
||||
* The default constructor does nothing
|
||||
@ -177,9 +179,10 @@ class InspSocket : public EventHandler
|
||||
* @param port The port number to connect to, or bind to
|
||||
* @param listening true to listen on the given host:port pair, or false to connect to them
|
||||
* @param maxtime Number of seconds to wait, if connecting, before the connection times out and an OnTimeout() event is generated
|
||||
* @param connectbindip When creating an outbound connection, the IP to bind the connection to. If not defined, the port is not bound.
|
||||
* @return On exit, GetState() returns I_ERROR if an error occured, and errno can be used to read the socket error.
|
||||
*/
|
||||
InspSocket(InspIRCd* SI, const std::string &ipaddr, int port, bool listening, unsigned long maxtime);
|
||||
InspSocket(InspIRCd* SI, const std::string &ipaddr, int port, bool listening, unsigned long maxtime, const std::string &connectbindip = "");
|
||||
|
||||
/**
|
||||
* This method is called when an outbound
|
||||
|
@ -49,8 +49,9 @@ InspSocket::InspSocket(InspIRCd* SI, int newfd, const char* ip)
|
||||
this->Instance->SE->AddFd(this);
|
||||
}
|
||||
|
||||
InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool listening, unsigned long maxtime)
|
||||
InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool listening, unsigned long maxtime, const std::string &connectbindip)
|
||||
{
|
||||
this->cbindip = connectbindip;
|
||||
this->fd = -1;
|
||||
this->Instance = SI;
|
||||
strlcpy(host,ipaddr.c_str(),MAXBUF);
|
||||
@ -158,7 +159,7 @@ void InspSocket::SetQueues(int nfd)
|
||||
* This is easier to configure when you have a lot of links and a lot
|
||||
* of servers to configure.
|
||||
*/
|
||||
bool InspSocket::BindAddr()
|
||||
bool InspSocket::BindAddr(const std::string &ip)
|
||||
{
|
||||
ConfigReader Conf(this->Instance);
|
||||
bool bindfail = false;
|
||||
@ -169,13 +170,13 @@ bool InspSocket::BindAddr()
|
||||
if ((!*this->host) || strchr(this->host, ':'))
|
||||
v6 = true;
|
||||
#endif
|
||||
for (int j =0; j < Conf.Enumerate("bind"); j++)
|
||||
int j = 0;
|
||||
while ((j < Conf.Enumerate("bind")) && (!ip.empty()))
|
||||
{
|
||||
std::string Type = Conf.ReadValue("bind","type",j);
|
||||
std::string IP = Conf.ReadValue("bind","address",j);
|
||||
if (Type == "servers")
|
||||
std::string IP = ip.empty() ? Conf.ReadValue("bind","address",j) : ip;
|
||||
if (!ip.empty() || Conf.ReadValue("bind","type",j) == "servers")
|
||||
{
|
||||
if ((IP != "*") && (IP != "127.0.0.1") && (IP != "") && (IP != "::1"))
|
||||
if (!ip.empty() || ((IP != "*") && (IP != "127.0.0.1") && (IP != "") && (IP != "::1")))
|
||||
{
|
||||
sockaddr* s = new sockaddr[2];
|
||||
#ifdef IPV6
|
||||
@ -231,6 +232,7 @@ bool InspSocket::BindAddr()
|
||||
return true;
|
||||
}
|
||||
}
|
||||
j++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -249,7 +251,7 @@ bool InspSocket::DoConnect()
|
||||
this->fd = socket(AF_INET6, SOCK_STREAM, 0);
|
||||
if ((this->fd > -1) && ((strstr(this->IP,"::ffff:") != (char*)&this->IP) && (strstr(this->IP,"::FFFF:") != (char*)&this->IP)))
|
||||
{
|
||||
if (!this->BindAddr())
|
||||
if (!this->BindAddr(this->cbindip))
|
||||
{
|
||||
delete[] addr;
|
||||
return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user