diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-08-02 10:26:21 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-08-02 10:26:21 +0000 |
commit | a54cfebb0434574f91acdcee07b89ea9f682d272 (patch) | |
tree | a6da7af4b41c72748628375b907204ffc0be8088 /src/modules/m_spanningtree.cpp | |
parent | b4f7f64413022c0cdd2900760748d4b24a8f68ec (diff) |
InspSocket no longer resolves hosts.
InspSocket::DoResolve() and the stuff that calls it is gone, if you pass InspSocket an invalid ip, it will bail during its connect.
You must now use Resolver classes to resolve hostnames into IP addresses, if you wish to do this. Currently, only one non-extra module
does this, see class ServernameResolver within m_spanningtree
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4634 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_spanningtree.cpp')
-rw-r--r-- | src/modules/m_spanningtree.cpp | 73 |
1 files changed, 63 insertions, 10 deletions
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index 0725d7b51..c91926d98 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -186,6 +186,7 @@ class UserManager : public classbase } }; + /* Each server in the tree is represented by one class of * type TreeServer. A locally connected TreeServer can * have a class of type TreeSocket associated with it, for @@ -3064,6 +3065,36 @@ class TreeSocket : public InspSocket } }; +class ServernameResolver : public Resolver +{ + private: + Link MyLink; + public: + ServernameResolver(const std::string &hostname, Link x) : Resolver(hostname, true), MyLink(x) + { + } + + void OnLookupComplete(const std::string &result) + { + TreeSocket* newsocket = new TreeSocket(result,MyLink.Port,false,10,MyLink.Name.c_str()); + if (newsocket->GetFd() > -1) + { + Srv->AddSocket(newsocket); + } + else + { + WriteOpers("*** CONNECT: Error connecting \002%s\002: %s.",MyLink.Name.c_str(),strerror(errno)); + delete newsocket; + } + } + + void OnError(ResolverError e) + { + WriteOpers("*** CONNECT: Error connecting \002%s\002: Unable to resolve hostname.",MyLink.Name.c_str()); + } +}; + + void AddThisServer(TreeServer* server, std::deque<TreeServer*> &list) { for (unsigned int c = 0; c < list.size(); c++) @@ -3666,16 +3697,28 @@ class ModuleSpanningTree : public Module { // an autoconnected server is not connected. Check if its time to connect it WriteOpers("*** AUTOCONNECT: Auto-connecting server \002%s\002 (%lu seconds until next attempt)",x->Name.c_str(),x->AutoConnect); - TreeSocket* newsocket = new TreeSocket(x->IPAddr,x->Port,false,10,x->Name.c_str()); - if (newsocket->GetFd() > -1) + + insp_inaddr binip; + + if (insp_aton(x->IPAddr.c_str(), &binip) > 0) { - Srv->AddSocket(newsocket); + TreeSocket* newsocket = new TreeSocket(x->IPAddr,x->Port,false,10,x->Name.c_str()); + if (newsocket->GetFd() > -1) + { + Srv->AddSocket(newsocket); + } + else + { + WriteOpers("*** AUTOCONNECT: Error autoconnecting \002%s\002: %s.",x->Name.c_str(),strerror(errno)); + delete newsocket; + } } else { - WriteOpers("*** AUTOCONNECT: Error autoconnecting \002%s\002: %s.",x->Name.c_str(),strerror(errno)); - DELETE(newsocket); + ServernameResolver* snr = new ServernameResolver(x->IPAddr, *x); + Srv->AddResolver(snr); } + } } } @@ -3728,15 +3771,25 @@ class ModuleSpanningTree : public Module if (!CheckDupe) { WriteServ(user->fd,"NOTICE %s :*** CONNECT: Connecting to server: \002%s\002 (%s:%d)",user->nick,x->Name.c_str(),(x->HiddenFromStats ? "<hidden>" : x->IPAddr.c_str()),x->Port); - TreeSocket* newsocket = new TreeSocket(x->IPAddr,x->Port,false,10,x->Name.c_str()); - if (newsocket->GetFd() > -1) + insp_inaddr binip; + + if (insp_aton(x->IPAddr.c_str(), &binip) > 0) { - Srv->AddSocket(newsocket); + TreeSocket* newsocket = new TreeSocket(x->IPAddr,x->Port,false,10,x->Name.c_str()); + if (newsocket->GetFd() > -1) + { + Srv->AddSocket(newsocket); + } + else + { + WriteOpers("*** CONNECT: Error connecting \002%s\002: %s.",x->Name.c_str(),strerror(errno)); + delete newsocket; + } } else { - WriteServ(user->fd,"NOTICE %s :*** CONNECT: Error connecting \002%s\002: %s.",user->nick,x->Name.c_str(),strerror(errno)); - DELETE(newsocket); + ServernameResolver* snr = new ServernameResolver(x->IPAddr, *x); + Srv->AddResolver(snr); } return 1; } |