]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_globalload.cpp
Fix segfault in m_chanprotect when OnAccessCheck is called with a null channel
[user/henk/code/inspircd.git] / src / modules / m_globalload.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
6  * See: http://wiki.inspircd.org/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 /* $ModDesc: Allows global loading of a module. */
15
16 #include "inspircd.h"
17
18 /** Handle /GLOADMODULE
19  */
20 class CommandGloadmodule : public Command
21 {
22  public:
23         CommandGloadmodule (InspIRCd* Instance, Module* Creator) : Command(Instance, Creator,"GLOADMODULE", "o", 1)
24         {
25                 syntax = "<modulename> [servermask]";
26                 TRANSLATE3(TR_TEXT, TR_TEXT, TR_END);
27         }
28
29         CmdResult Handle (const std::vector<std::string> &parameters, User *user)
30         {
31                 std::string servername = parameters.size() > 1 ? parameters[1] : "*";
32
33                 if (InspIRCd::Match(ServerInstance->Config->ServerName, servername))
34                 {
35                         if (ServerInstance->Modules->Load(parameters[0].c_str()))
36                         {
37                                 ServerInstance->SNO->WriteToSnoMask('a', "NEW MODULE '%s' GLOBALLY LOADED BY '%s'",parameters[0].c_str(), user->nick.c_str());
38                                 user->WriteNumeric(975, "%s %s :Module successfully loaded.",user->nick.c_str(), parameters[0].c_str());
39                         }
40                         else
41                         {
42                                 user->WriteNumeric(974, "%s %s :%s",user->nick.c_str(), parameters[0].c_str(), ServerInstance->Modules->LastError().c_str());
43                         }
44                 }
45                 else
46                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBAL LOAD BY '%s' (not loaded here)",parameters[0].c_str(), user->nick.c_str());
47
48                 return CMD_SUCCESS;
49         }
50 };
51
52 /** Handle /GUNLOADMODULE
53  */
54 class CommandGunloadmodule : public Command
55 {
56  public:
57         CommandGunloadmodule (InspIRCd* Instance, Module* Creator) : Command(Instance, Creator,"GUNLOADMODULE", "o", 1)
58         {
59                 syntax = "<modulename> [servermask]";
60         }
61
62         CmdResult Handle (const std::vector<std::string> &parameters, User *user)
63         {
64                 std::string servername = parameters.size() > 1 ? parameters[1] : "*";
65
66                 if (InspIRCd::Match(ServerInstance->Config->ServerName, servername))
67                 {
68                         if (ServerInstance->Modules->Unload(parameters[0].c_str()))
69                         {
70                                 ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBALLY UNLOADED BY '%s'",parameters[0].c_str(), user->nick.c_str());
71                                 user->WriteNumeric(973, "%s %s :Module successfully unloaded.",user->nick.c_str(), parameters[0].c_str());
72                         }
73                         else
74                         {
75                                 user->WriteNumeric(972, "%s %s :%s",user->nick.c_str(), parameters[0].c_str(), ServerInstance->Modules->LastError().c_str());
76                         }
77                 }
78                 else
79                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBAL UNLOAD BY '%s' (not unloaded here)",parameters[0].c_str(), user->nick.c_str());
80
81                 return CMD_SUCCESS;
82         }
83 };
84
85 /** Handle /GRELOADMODULE
86  */
87 class CommandGreloadmodule : public Command
88 {
89  public:
90         CommandGreloadmodule (InspIRCd* Instance, Module* Creator) : Command(Instance, Creator, "GRELOADMODULE", "o", 1)
91         {
92                 syntax = "<modulename> [servermask]";
93         }
94
95         CmdResult Handle(const std::vector<std::string> &parameters, User *user)
96         {
97                 std::string servername = parameters.size() > 1 ? parameters[1] : "*";
98
99                 if (InspIRCd::Match(ServerInstance->Config->ServerName, servername))
100                 {
101                         bool ok = true;
102                         if (!ServerInstance->Modules->Unload(parameters[0].c_str()))
103                         {
104                                 ok = false;
105                                 user->WriteNumeric(972, "%s %s :%s",user->nick.c_str(), parameters[0].c_str(), ServerInstance->Modules->LastError().c_str());
106                         }
107                         if (!ServerInstance->Modules->Load(parameters[0].c_str()))
108                         {
109                                 ok = false;
110                                 user->WriteNumeric(974, "%s %s :%s",user->nick.c_str(), parameters[0].c_str(), ServerInstance->Modules->LastError().c_str());
111                         }
112                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBALLY RELOADED BY '%s'",parameters[0].c_str(), user->nick.c_str());
113                         if (ok)
114                                 user->WriteNumeric(975, "%s %s :Module successfully loaded.",user->nick.c_str(), parameters[0].c_str());
115                 }
116                 else
117                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBAL RELOAD BY '%s' (not reloaded here)",parameters[0].c_str(), user->nick.c_str());
118
119                 return CMD_SUCCESS;
120         }
121 };
122
123 class ModuleGlobalLoad : public Module
124 {
125         CommandGloadmodule cmd1;
126         CommandGunloadmodule cmd2;
127         CommandGreloadmodule cmd3;
128
129  public:
130         ModuleGlobalLoad(InspIRCd* Me)
131                 : Module(Me), cmd1(Me, this), cmd2(Me, this), cmd3(Me, this)
132         {
133                 ServerInstance->AddCommand(&cmd1);
134                 ServerInstance->AddCommand(&cmd2);
135                 ServerInstance->AddCommand(&cmd3);
136         }
137
138         virtual ~ModuleGlobalLoad()
139         {
140         }
141
142         virtual Version GetVersion()
143         {
144                 return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION);
145         }
146 };
147
148 MODULE_INIT(ModuleGlobalLoad)
149