diff options
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/m_spanningtree/main.cpp | 27 | ||||
-rw-r--r-- | src/modules/m_spanningtree/main.h | 4 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket.h | 3 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket2.cpp | 59 |
4 files changed, 83 insertions, 10 deletions
diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 1fd33b946..f286ae104 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -199,13 +199,9 @@ int ModuleSpanningTree::HandleMotd(const char** parameters, int pcnt, userrec* u /* Send it out remotely, generate no reply yet */ TreeServer* s = Utils->FindServerMask(parameters[0]); if (s) - { Utils->DoOneToOne(user->nick, "MOTD", params, s->GetName()); - } else - { user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]); - } return 1; } return 0; @@ -221,18 +217,26 @@ int ModuleSpanningTree::HandleAdmin(const char** parameters, int pcnt, userrec* /* Send it out remotely, generate no reply yet */ TreeServer* s = Utils->FindServerMask(parameters[0]); if (s) - { Utils->DoOneToOne(user->nick, "ADMIN", params, s->GetName()); - } else - { user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]); - } return 1; } return 0; } +int ModuleSpanningTree::HandleModules(const char** parameters, int pcnt, userrec* user) +{ + std::deque<std::string> params; + params.push_back(parameters[0]); + TreeServer* s = Utils->FindServerMask(parameters[0]); + if (s) + Utils->DoOneToOne(user->nick, "MODULES", params, s->GetName()); + else + user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]); + return 1; +} + int ModuleSpanningTree::HandleStats(const char** parameters, int pcnt, userrec* user) { if (pcnt > 1) @@ -249,9 +253,7 @@ int ModuleSpanningTree::HandleStats(const char** parameters, int pcnt, userrec* Utils->DoOneToOne(user->nick, "STATS", params, s->GetName()); } else - { user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]); - } return 1; } return 0; @@ -649,6 +651,11 @@ int ModuleSpanningTree::OnPreCommand(const std::string &command, const char** pa this->HandleVersion(parameters,pcnt,user); return 1; } + else if ((command == "MODULES") && (pcnt > 0)) + { + this->HandleModules(parameters,pcnt,user); + return 1; + } return 0; } diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 4bf11ddd7..2c5d08c6a 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -95,6 +95,10 @@ class ModuleSpanningTree : public Module */ int HandleRemoteWhois(const char** parameters, int pcnt, userrec* user); + /** Handle remote MODULES + */ + int HandleModules(const char** parameters, int pcnt, userrec* user); + /** Ping all local servers */ void DoPingChecks(time_t curtime); diff --git a/src/modules/m_spanningtree/treesocket.h b/src/modules/m_spanningtree/treesocket.h index 5a5ec52f8..54b506c57 100644 --- a/src/modules/m_spanningtree/treesocket.h +++ b/src/modules/m_spanningtree/treesocket.h @@ -228,6 +228,9 @@ class TreeSocket : public InspSocket /** remote ADMIN. leet, huh? */ bool Admin(const std::string &prefix, std::deque<std::string> ¶ms); + /** Remote MODULES */ + bool Modules(const std::string &prefix, std::deque<std::string> ¶ms); + bool Stats(const std::string &prefix, std::deque<std::string> ¶ms); /** Because the core won't let users or even SERVERS set +o, diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp index db06a47c5..128f4613e 100644 --- a/src/modules/m_spanningtree/treesocket2.cpp +++ b/src/modules/m_spanningtree/treesocket2.cpp @@ -38,6 +38,61 @@ bool TreeSocket::Error(std::deque<std::string> ¶ms) return false; } +bool TreeSocket::Modules(const std::string &prefix, std::deque<std::string> ¶ms) +{ + if (params.empty()) + return true; + + if (!this->Instance->MatchText(this->Instance->Config->ServerName, params[0])) + { + /* Pass it on, not for us */ + Utils->DoOneToOne(prefix, "MODULES", params, params[0]); + return true; + } + + char strbuf[MAXBUF]; + std::deque<std::string> par; + par.push_back(prefix); + par.push_back(""); + + userrec* source = this->Instance->FindNick(prefix); + if (!source) + return true; + + for (unsigned int i = 0; i < Instance->Config->module_names.size(); i++) + { + Version V = Instance->modules[i]->GetVersion(); + char modulename[MAXBUF]; + char flagstate[MAXBUF]; + *flagstate = 0; + if (V.Flags & VF_STATIC) + strlcat(flagstate,", static",MAXBUF); + if (V.Flags & VF_VENDOR) + strlcat(flagstate,", vendor",MAXBUF); + if (V.Flags & VF_COMMON) + strlcat(flagstate,", common",MAXBUF); + if (V.Flags & VF_SERVICEPROVIDER) + strlcat(flagstate,", service provider",MAXBUF); + if (!flagstate[0]) + strcpy(flagstate," <no flags>"); + strlcpy(modulename,Instance->Config->module_names[i].c_str(),256); + if (*source->oper) + { + snprintf(strbuf, MAXBUF, "::%s 900 %s :0x%08lx %d.%d.%d.%d %s (%s)",Instance->Config->ServerName,source->nick,(long unsigned int)Instance->modules[i],V.Major,V.Minor,V.Revision,V.Build,ServerConfig::CleanFilename(modulename),flagstate+2); + } + else + { + snprintf(strbuf, MAXBUF, "::%s 900 %s :%s",Instance->Config->ServerName,source->nick,ServerConfig::CleanFilename(modulename)); + } + par[1] = strbuf; + Utils->DoOneToOne(Instance->Config->ServerName, "PUSH", par, source->server); + } + snprintf(strbuf, MAXBUF, "::%s 901 %s :End of MODULES list", Instance->Config->ServerName, source->nick); + par[1] = strbuf; + Utils->DoOneToOne(Instance->Config->ServerName, "PUSH", par, source->server); + return true; +} + /** remote MOTD. leet, huh? */ bool TreeSocket::Motd(const std::string &prefix, std::deque<std::string> ¶ms) { @@ -1050,6 +1105,10 @@ bool TreeSocket::ProcessLine(std::string &line) { return this->Motd(prefix, params); } + else if (command == "MODULES") + { + return this->Modules(prefix, params); + } else if (command == "ADMIN") { return this->Admin(prefix, params); |