summaryrefslogtreecommitdiff
path: root/src/operserv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/operserv.c')
-rw-r--r--src/operserv.c1065
1 files changed, 0 insertions, 1065 deletions
diff --git a/src/operserv.c b/src/operserv.c
deleted file mode 100644
index 455d74923..000000000
--- a/src/operserv.c
+++ /dev/null
@@ -1,1065 +0,0 @@
-/* OperServ functions.
- *
- * (C) 2003-2010 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- *
- */
-
-#include "services.h"
-#include "pseudo.h"
-
-/*************************************************************************/
-
-/* AKILL, SGLINE, SQLINE and SZLINE lists */
-SList akills, sglines, sqlines, szlines;
-
-/*************************************************************************/
-
-static int is_akill_entry_equal(SList * slist, void *item1, void *item2);
-static void free_akill_entry(SList * slist, void *item);
-static int is_sgline_entry_equal(SList * slist, void *item1, void *item2);
-static void free_sgline_entry(SList * slist, void *item);
-static int is_sqline_entry_equal(SList * slist, void *item1, void *item2);
-static void free_sqline_entry(SList * slist, void *item);
-static int is_szline_entry_equal(SList * slist, void *item1, void *item2);
-static void free_szline_entry(SList * slist, void *item);
-
-/* News items */
-std::vector<NewsItem *> News;
-
-std::vector<std::bitset<32> > DefCon;
-int DefConModesSet = 0;
-/* Defcon modes mlocked on */
-Flags<ChannelModeName> DefConModesOn;
-/* Defcon modes mlocked off */
-Flags<ChannelModeName> DefConModesOff;
-/* Map of Modesa and Params for DefCon */
-std::map<ChannelModeName, std::string> DefConModesOnParams;
-
-bool SetDefConParam(ChannelModeName Name, std::string &buf)
-{
- return DefConModesOnParams.insert(std::make_pair(Name, buf)).second;
-}
-
-bool GetDefConParam(ChannelModeName Name, std::string *buf)
-{
- std::map<ChannelModeName, std::string>::iterator it = DefConModesOnParams.find(Name);
-
- buf->clear();
-
- if (it != DefConModesOnParams.end())
- {
- *buf = it->second;
- return true;
- }
-
- return false;
-}
-
-void UnsetDefConParam(ChannelModeName Name)
-{
- std::map<ChannelModeName, std::string>::iterator it = DefConModesOnParams.find(Name);
-
- if (it != DefConModesOnParams.end())
- {
- DefConModesOnParams.erase(it);
- }
-}
-
-/*************************************************************************/
-
-void moduleAddOperServCmds();
-/*************************************************************************/
-
-/* Options for the lists */
-SListOpts akopts = { 0, NULL, &is_akill_entry_equal, &free_akill_entry };
-
-SListOpts sgopts = { 0, NULL, &is_sgline_entry_equal, &free_sgline_entry };
-SListOpts sqopts =
- { SLISTF_SORT, NULL, &is_sqline_entry_equal, &free_sqline_entry };
-SListOpts szopts = { 0, NULL, &is_szline_entry_equal, &free_szline_entry };
-
-/*************************************************************************/
-/* *INDENT-OFF* */
-void moduleAddOperServCmds() {
- ModuleManager::LoadModuleList(Config.OperServCoreModules);
-}
-
-/* *INDENT-ON* */
-/*************************************************************************/
-/*************************************************************************/
-
-/* OperServ initialization. */
-
-void os_init()
-{
- moduleAddOperServCmds();
-
- slist_init(&akills);
- akills.opts = &akopts;
-
- if (ircd->sgline) {
- slist_init(&sglines);
- sglines.opts = &sgopts;
- }
- if (ircd->sqline) {
- slist_init(&sqlines);
- sqlines.opts = &sqopts;
- }
- if (ircd->szline) {
- slist_init(&szlines);
- szlines.opts = &szopts;
- }
-}
-
-/*************************************************************************/
-
-/* Main OperServ routine. */
-
-void operserv(User * u, char *buf)
-{
- const char *cmd;
- const char *s;
-
- Alog() << Config.s_OperServ << ": " << u->nick << ": " << buf;
-
- cmd = strtok(buf, " ");
- if (!cmd) {
- return;
- } else if (stricmp(cmd, "\1PING") == 0) {
- if (!(s = strtok(NULL, ""))) {
- s = "";
- }
- ircdproto->SendCTCP(findbot(Config.s_OperServ), u->nick.c_str(), "PING %s", s);
- } else {
- mod_run_cmd(Config.s_OperServ, u, OPERSERV, cmd);
- }
-}
-
-/*************************************************************************/
-/*********************** OperServ command functions **********************/
-/*************************************************************************/
-
-/*************************************************************************/
-
-
-Server *server_global(Server * s, char *msg)
-{
- Server *sl;
-
- while (s) {
- /* Do not send the notice to ourselves our juped servers */
- if (!s->HasFlag(SERVER_ISME) && !s->HasFlag(SERVER_JUPED))
- notice_server(Config.s_GlobalNoticer, s, "%s", msg);
-
- if (s->links) {
- sl = server_global(s->links, msg);
- if (sl)
- s = sl;
- else
- s = s->next;
- } else {
- s = s->next;
- }
- }
- return s;
-
-}
-
-void oper_global(char *nick, const char *fmt, ...)
-{
- va_list args;
- char msg[2048]; /* largest valid message is 512, this should cover any global */
- char dmsg[2048]; /* largest valid message is 512, this should cover any global */
-
- va_start(args, fmt);
- vsnprintf(msg, sizeof(msg), fmt, args);
- va_end(args);
-
- /* I don't like the way this is coded... */
- if ((nick) && (!Config.AnonymousGlobal)) {
- snprintf(dmsg, sizeof(dmsg), "[%s] %s", nick, msg);
- server_global(servlist, dmsg);
- } else {
- server_global(servlist, msg);
- }
-
-}
-
-/**************************************************************************/
-
-
-/************************************************************************/
-/*************************************************************************/
-
-/* Adds an AKILL to the list. Returns >= 0 on success, -1 if it fails, -2
- * if only the expiry time was changed.
- * The success result is the number of AKILLs that were deleted to successfully add one.
- */
-
-int add_akill(User * u, const char *mask, const char *by, const time_t expires,
- const char *reason)
-{
- int deleted = 0, i;
- char *user, *mask2, *host;
- Akill *entry;
-
- if (!mask) {
- return -1;
- }
-
- /* Checks whether there is an AKILL that already covers
- * the one we want to add, and whether there are AKILLs
- * that would be covered by this one. The masks AND the
- * expiry times are used to determine this, because some
- * AKILLs may become useful when another one expires.
- * If so, warn the user in the first case and cleanup
- * the useless AKILLs in the second.
- */
-
- if (akills.count > 0) {
-
- for (i = akills.count - 1; i >= 0; i--) {
- char amask[BUFSIZE];
-
- entry = static_cast<Akill *>(akills.list[i]);
-
- if (!entry)
- continue;
-
- snprintf(amask, sizeof(amask), "%s@%s", entry->user,
- entry->host);
-
- if (!stricmp(amask, mask)) {
- /* We change the AKILL expiry time if its current one is less than the new.
- * This is preferable to be sure we don't change an important AKILL
- * accidentely.
- */
- if (entry->expires >= expires || entry->expires == 0) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_AKILL_EXISTS,
- mask);
- return -1;
- } else {
- entry->expires = expires;
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_AKILL_CHANGED,
- amask);
- return -2;
- }
- }
-
- if (Anope::Match(mask, amask, false)
- && (entry->expires >= expires || entry->expires == 0)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_AKILL_ALREADY_COVERED,
- mask, amask);
- return -1;
- }
-
- if (Anope::Match(amask, mask, false)
- && (entry->expires <= expires || expires == 0)) {
- slist_delete(&akills, i);
- deleted++;
- }
- }
-
- }
-
- /* We can now check whether the list is full or not. */
- if (slist_full(&akills)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_AKILL_REACHED_LIMIT,
- akills.limit);
- return -1;
- }
-
- /* We can now (really) add the AKILL. */
- mask2 = sstrdup(mask);
- host = strchr(mask2, '@');
-
- if (!host) {
- delete [] mask2;
- return -1;
- }
-
- user = mask2;
- *host = 0;
- host++;
-
- entry = new Akill;
-
- if (!entry) {
- delete [] mask2;
- return -1;
- }
-
- entry->user = sstrdup(user);
- entry->host = sstrdup(host);
- entry->by = sstrdup(by);
- entry->reason = sstrdup(reason);
- entry->seton = time(NULL);
- entry->expires = expires;
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddAkill, OnAddAkill(u, entry));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete entry;
- return -1;
- }
-
- slist_add(&akills, entry);
-
- if (Config.AkillOnAdd)
- ircdproto->SendAkill(entry);
-
- delete [] mask2;
-
- return deleted;
-}
-
-/* Does the user match any AKILLs? */
-
-int check_akill(const char *nick, const char *username, const char *host,
- const char *vhost, const char *ip)
-{
- int i;
- Akill *ak;
-
- if (akills.count == 0)
- return 0;
-
- for (i = 0; i < akills.count; i++) {
- ak = static_cast<Akill *>(akills.list[i]);
- if (!ak)
- continue;
- if (Anope::Match(username, ak->user, false)
- && Anope::Match(host, ak->host, false)) {
- ircdproto->SendAkill(ak);
- return 1;
- }
- if (ircd->vhost) {
- if (vhost) {
- if (Anope::Match(username, ak->user, false)
- && Anope::Match(vhost, ak->host, false)) {
- ircdproto->SendAkill(ak);
- return 1;
- }
- }
- }
- if (ircd->nickip) {
- if (ip) {
- if (Anope::Match(username, ak->user, false)
- && Anope::Match(ip, ak->host, false)) {
- ircdproto->SendAkill(ak);
- return 1;
- }
- }
- }
-
- }
-
- return 0;
-}
-
-/* Delete any expired autokills. */
-
-void expire_akills()
-{
- int i;
- time_t now = time(NULL);
- Akill *ak;
-
- for (i = akills.count - 1; i >= 0; i--) {
- ak = static_cast<Akill *>(akills.list[i]);
-
- if (!ak->expires || ak->expires > now)
- continue;
-
- if (Config.WallAkillExpire)
- ircdproto->SendGlobops(findbot(Config.s_OperServ), "AKILL on %s@%s has expired",
- ak->user, ak->host);
- slist_delete(&akills, i);
- }
-}
-
-static void free_akill_entry(SList * slist, void *item)
-{
- Akill *ak = static_cast<Akill *>(item);
-
- /* Remove the AKILLs from all the servers */
- ircdproto->SendAkillDel(ak);
-
- /* Free the structure */
- delete [] ak->user;
- delete [] ak->host;
- delete [] ak->by;
- delete [] ak->reason;
- delete ak;
-}
-
-/* item1 is not an Akill pointer, but a char
- */
-
-static int is_akill_entry_equal(SList * slist, void *item1, void *item2)
-{
- char *ak1 = static_cast<char *>(item1), buf[BUFSIZE];
- Akill *ak2 = static_cast<Akill *>(item2);
-
- if (!ak1 || !ak2)
- return 0;
-
- snprintf(buf, sizeof(buf), "%s@%s", ak2->user, ak2->host);
-
- if (!stricmp(ak1, buf))
- return 1;
- else
- return 0;
-}
-
-
-/*************************************************************************/
-
-/* Adds an SGLINE to the list. Returns >= 0 on success, -1 if it failed, -2 if
- * only the expiry time changed.
- * The success result is the number of SGLINEs that were deleted to successfully add one.
- */
-
-int add_sgline(User * u, const char *mask, const char *by, time_t expires,
- const char *reason)
-{
- int deleted = 0, i;
- SXLine *entry;
- User *u2, *next;
- char buf[BUFSIZE];
- *buf = '\0';
-
- /* Checks whether there is an SGLINE that already covers
- * the one we want to add, and whether there are SGLINEs
- * that would be covered by this one.
- * If so, warn the user in the first case and cleanup
- * the useless SGLINEs in the second.
- */
-
- if (!mask) {
- return -1;
- }
-
- if (sglines.count > 0) {
-
- for (i = sglines.count - 1; i >= 0; i--) {
- entry = static_cast<SXLine *>(sglines.list[i]);
-
- if (!entry)
- continue;
-
- if (!stricmp(entry->mask, mask)) {
- if (entry->expires >= expires || entry->expires == 0) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SGLINE_EXISTS,
- mask);
- return -1;
- } else {
- entry->expires = expires;
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SGLINE_CHANGED,
- entry->mask);
- return -2;
- }
- }
-
- if (Anope::Match(mask, entry->mask, false )
- && (entry->expires >= expires || entry->expires == 0)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SGLINE_ALREADY_COVERED,
- mask, entry->mask);
- return -1;
- }
-
- if (Anope::Match(entry->mask, mask, false)
- && (entry->expires <= expires || expires == 0)) {
- slist_delete(&sglines, i);
- deleted++;
- }
- }
-
- }
-
- /* We can now check whether the list is full or not. */
- if (slist_full(&sglines)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SGLINE_REACHED_LIMIT,
- sglines.limit);
- return -1;
- }
-
- /* We can now (really) add the SGLINE. */
- entry = new SXLine;
- if (!entry)
- return -1;
-
- entry->mask = sstrdup(mask);
- entry->by = sstrdup(by);
- entry->reason = sstrdup(reason);
- entry->seton = time(NULL);
- entry->expires = expires;
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddSXLine, OnAddSXLine(u, entry, SX_SGLINE));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete entry;
- return -1;
- }
-
- slist_add(&sglines, entry);
-
- ircdproto->SendSGLine(entry);
-
- if (Config.KillonSGline && !ircd->sglineenforce) {
- snprintf(buf, (BUFSIZE - 1), "G-Lined: %s", entry->reason);
- u2 = firstuser();
- while (u2) {
- next = nextuser();
- if (!is_oper(u2)) {
- if (Anope::Match(u2->realname, entry->mask, false)) {
- kill_user(Config.ServerName, u2->nick, buf);
- }
- }
- u2 = next;
- }
- }
- return deleted;
-}
-
-/* Does the user match any SGLINEs? */
-
-int check_sgline(const char *nick, const char *realname)
-{
- int i;
- SXLine *sx;
-
- if (sglines.count == 0)
- return 0;
-
- for (i = 0; i < sglines.count; i++) {
- sx = static_cast<SXLine *>(sglines.list[i]);
- if (!sx)
- continue;
-
- if (Anope::Match(realname, sx->mask, false)) {
- ircdproto->SendSGLine(sx);
- /* We kill nick since s_sgline can't */
- ircdproto->SendSVSKill(NULL, finduser(nick), "G-Lined: %s", sx->reason);
- return 1;
- }
- }
-
- return 0;
-}
-
-/* Delete any expired SGLINEs. */
-
-void expire_sglines()
-{
- int i;
- time_t now = time(NULL);
- SXLine *sx;
-
- for (i = sglines.count - 1; i >= 0; i--) {
- sx = static_cast<SXLine *>(sglines.list[i]);
-
- if (!sx->expires || sx->expires > now)
- continue;
-
- if (Config.WallSGLineExpire)
- ircdproto->SendGlobops(findbot(Config.s_OperServ), "SGLINE on \2%s\2 has expired",
- sx->mask);
- slist_delete(&sglines, i);
- }
-}
-
-static void free_sgline_entry(SList * slist, void *item)
-{
- SXLine *sx = static_cast<SXLine *>(item);
-
- /* Remove the SGLINE from all the servers */
- ircdproto->SendSGLineDel(sx);
-
- /* Free the structure */
- delete [] sx->mask;
- delete [] sx->by;
- delete [] sx->reason;
- delete sx;
-}
-
-/* item1 is not an SXLine pointer, but a char */
-
-static int is_sgline_entry_equal(SList * slist, void *item1, void *item2)
-{
- char *sx1 = static_cast<char *>(item1);
- SXLine *sx2 = static_cast<SXLine *>(item2);
-
- if (!sx1 || !sx2)
- return 0;
-
- if (!stricmp(sx1, sx2->mask))
- return 1;
- else
- return 0;
-}
-
-/*************************************************************************/
-
-/* Adds an SQLINE to the list. Returns >= 0 on success, -1 if it failed, -2 if
- * only the expiry time changed.
- * The success result is the number of SQLINEs that were deleted to successfully add one.
- */
-
-int add_sqline(User * u, const char *mask, const char *by, time_t expires,
- const char *reason)
-{
- int deleted = 0, i;
- User *u2, *next;
- SXLine *entry;
- char buf[BUFSIZE];
- *buf = '\0';
-
- /* Checks whether there is an SQLINE that already covers
- * the one we want to add, and whether there are SQLINEs
- * that would be covered by this one.
- * If so, warn the user in the first case and cleanup
- * the useless SQLINEs in the second.
- */
-
- if (!mask) {
- return -1;
- }
-
- if (sqlines.count > 0) {
-
- for (i = sqlines.count - 1; i >= 0; i--) {
- entry = static_cast<SXLine *>(sqlines.list[i]);
-
- if (!entry)
- continue;
-
- if ((*mask == '#' && *entry->mask != '#') ||
- (*mask != '#' && *entry->mask == '#'))
- continue;
-
- if (!stricmp(entry->mask, mask)) {
- if (entry->expires >= expires || entry->expires == 0) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SQLINE_EXISTS,
- mask);
- return -1;
- } else {
- entry->expires = expires;
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SQLINE_CHANGED,
- entry->mask);
- return -2;
- }
- }
-
- if (Anope::Match(mask, entry->mask, false)
- && (entry->expires >= expires || entry->expires == 0)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SQLINE_ALREADY_COVERED,
- mask, entry->mask);
- return -1;
- }
-
- if (Anope::Match(entry->mask, mask, false)
- && (entry->expires <= expires || expires == 0)) {
- slist_delete(&sqlines, i);
- deleted++;
- }
- }
-
- }
-
- /* We can now check whether the list is full or not. */
- if (slist_full(&sqlines)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SQLINE_REACHED_LIMIT,
- sqlines.limit);
- return -1;
- }
-
- /* We can now (really) add the SQLINE. */
- entry = new SXLine;
- if (!entry)
- return -1;
-
- entry->mask = sstrdup(mask);
- entry->by = sstrdup(by);
- entry->reason = sstrdup(reason);
- entry->seton = time(NULL);
- entry->expires = expires;
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddSXLine, OnAddSXLine(u, entry, SX_SQLINE));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete entry;
- return -1;
- }
-
- slist_add(&sqlines, entry);
-
- sqline(entry->mask, entry->reason);
-
- if (Config.KillonSQline) {
- snprintf(buf, (BUFSIZE - 1), "Q-Lined: %s", entry->reason);
- u2 = firstuser();
- while (u2) {
- next = nextuser();
- if (!is_oper(u2)) {
- if (Anope::Match(u2->nick, entry->mask, false)) {
- kill_user(Config.ServerName, u2->nick, buf);
- }
- }
- u2 = next;
- }
- }
-
- return deleted;
-}
-
-/* Does the user match any SQLINEs? */
-
-int check_sqline(const char *nick, int nick_change)
-{
- int i;
- SXLine *sx;
- char reason[300];
-
- if (sqlines.count == 0)
- return 0;
-
- for (i = 0; i < sqlines.count; i++) {
- sx = static_cast<SXLine *>(sqlines.list[i]);
- if (!sx)
- continue;
-
- if (ircd->chansqline) {
- if (*sx->mask == '#')
- continue;
- }
-
- if (Anope::Match(nick, sx->mask, false)) {
- sqline(sx->mask, sx->reason);
- /* We kill nick since s_sqline can't */
- snprintf(reason, sizeof(reason), "Q-Lined: %s", sx->reason);
- kill_user(Config.s_OperServ, nick, reason);
- return 1;
- }
- }
-
- return 0;
-}
-
-int check_chan_sqline(const char *chan)
-{
- int i;
- SXLine *sx;
-
- if (sqlines.count == 0)
- return 0;
-
- for (i = 0; i < sqlines.count; i++) {
- sx = static_cast<SXLine *>(sqlines.list[i]);
- if (!sx)
- continue;
-
- if (*sx->mask != '#')
- continue;
-
- if (Anope::Match(chan, sx->mask, false)) {
- sqline(sx->mask, sx->reason);
- return 1;
- }
- }
-
- return 0;
-}
-
-/* Delete any expired SQLINEs. */
-
-void expire_sqlines()
-{
- int i;
- time_t now = time(NULL);
- SXLine *sx;
-
- for (i = sqlines.count - 1; i >= 0; i--) {
- sx = static_cast<SXLine *>(sqlines.list[i]);
-
- if (!sx->expires || sx->expires > now)
- continue;
-
- if (Config.WallSQLineExpire)
- ircdproto->SendGlobops(findbot(Config.s_OperServ), "SQLINE on \2%s\2 has expired",
- sx->mask);
-
- slist_delete(&sqlines, i);
- }
-}
-
-static void free_sqline_entry(SList * slist, void *item)
-{
- SXLine *sx = static_cast<SXLine *>(item);
-
- /* Remove the SQLINE from all the servers */
- ircdproto->SendSQLineDel(sx->mask);
-
- /* Free the structure */
- delete [] sx->mask;
- delete [] sx->by;
- delete [] sx->reason;
- delete sx;
-}
-
-/* item1 is not an SXLine pointer, but a char */
-
-static int is_sqline_entry_equal(SList * slist, void *item1, void *item2)
-{
- char *sx1 = static_cast<char *>(item1);
- SXLine *sx2 = static_cast<SXLine *>(item2);
-
- if (!sx1 || !sx2)
- return 0;
-
- if (!stricmp(sx1, sx2->mask))
- return 1;
- else
- return 0;
-}
-
-/*************************************************************************/
-
-/* Adds an SZLINE to the list. Returns >= 0 on success, -1 on error, -2 if
- * only the expiry time changed.
- * The success result is the number of SZLINEs that were deleted to successfully add one.
- */
-
-int add_szline(User * u, const char *mask, const char *by, time_t expires,
- const char *reason)
-{
- int deleted = 0, i;
- SXLine *entry;
-
- if (!mask) {
- return -1;
- }
-
- /* Checks whether there is an SZLINE that already covers
- * the one we want to add, and whether there are SZLINEs
- * that would be covered by this one.
- * If so, warn the user in the first case and cleanup
- * the useless SZLINEs in the second.
- */
-
- if (szlines.count > 0) {
-
- for (i = szlines.count - 1; i >= 0; i--) {
- entry = static_cast<SXLine *>(szlines.list[i]);
-
- if (!entry)
- continue;
-
- if (!stricmp(entry->mask, mask)) {
- if (entry->expires >= expires || entry->expires == 0) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SZLINE_EXISTS,
- mask);
- return -1;
- } else {
- entry->expires = expires;
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SZLINE_EXISTS,
- mask);
- return -2;
- }
- }
-
- if (Anope::Match(mask, entry->mask, false)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SZLINE_ALREADY_COVERED,
- mask, entry->mask);
- return -1;
- }
-
- if (Anope::Match(entry->mask, mask, false)) {
- slist_delete(&szlines, i);
- deleted++;
- }
- }
-
- }
-
- /* We can now check whether the list is full or not. */
- if (slist_full(&szlines)) {
- if (u)
- notice_lang(Config.s_OperServ, u, OPER_SZLINE_REACHED_LIMIT,
- szlines.limit);
- return -1;
- }
-
- /* We can now (really) add the SZLINE. */
- entry = new SXLine;
- if (!entry)
- return -1;
-
- entry->mask = sstrdup(mask);
- entry->by = sstrdup(by);
- entry->reason = sstrdup(reason);
- entry->seton = time(NULL);
- entry->expires = expires;
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddSXLine, OnAddSXLine(u, entry, SX_SZLINE));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete entry;
- return -1;
- }
-
- slist_add(&szlines, entry);
- ircdproto->SendSZLine(entry);
-
- return deleted;
-}
-
-/* Check and enforce any Zlines that we have */
-int check_szline(const char *nick, char *ip)
-{
- int i;
- SXLine *sx;
-
- if (szlines.count == 0) {
- return 0;
- }
-
- if (!ip) {
- return 0;
- }
-
- for (i = 0; i < szlines.count; i++) {
- sx = static_cast<SXLine *>(szlines.list[i]);
- if (!sx) {
- continue;
- }
-
- if (Anope::Match(ip, sx->mask, false)) {
- ircdproto->SendSZLine(sx);
- return 1;
- }
- }
-
- return 0;
-}
-
-
-/* Delete any expired SZLINEs. */
-
-void expire_szlines()
-{
- int i;
- time_t now = time(NULL);
- SXLine *sx;
-
- for (i = szlines.count - 1; i >= 0; i--) {
- sx = static_cast<SXLine *>(szlines.list[i]);
-
- if (!sx->expires || sx->expires > now)
- continue;
-
- if (Config.WallSZLineExpire)
- ircdproto->SendGlobops(findbot(Config.s_OperServ), "SZLINE on \2%s\2 has expired",
- sx->mask);
- slist_delete(&szlines, i);
- }
-}
-
-static void free_szline_entry(SList * slist, void *item)
-{
- SXLine *sx = static_cast<SXLine *>(item);
-
- /* Remove the SZLINE from all the servers */
- ircdproto->SendSZLineDel(sx);
-
- /* Free the structure */
- delete [] sx->mask;
- delete [] sx->by;
- delete [] sx->reason;
- delete sx;
-}
-
-/* item1 is not an SXLine pointer, but a char
- */
-
-static int is_szline_entry_equal(SList * slist, void *item1, void *item2)
-{
- char *sx1 = static_cast<char *>(item1);
- SXLine *sx2 = static_cast<SXLine *>(item2);
-
- if (!sx1 || !sx2)
- return 0;
-
- if (!stricmp(sx1, sx2->mask))
- return 1;
- else
- return 0;
-}
-
-/*************************************************************************/
-
-/** Check if a certain defcon option is currently in affect
- * @param Level The level
- * @return true and false
- */
-bool CheckDefCon(DefconLevel Level)
-{
- if (Config.DefConLevel)
- return DefCon[Config.DefConLevel][Level];
- return false;
-}
-
-/** Check if a certain defcon option is in a certain defcon level
- * @param level The defcon level
- * @param Level The defcon level name
- * @return true or false
- */
-bool CheckDefCon(int level, DefconLevel Level)
-{
- return DefCon[level][Level];
-}
-
-/** Add a defcon level option to a defcon level
- * @param level The defcon level
- * @param Level The defcon level option
- */
-void AddDefCon(int level, DefconLevel Level)
-{
- DefCon[level][Level] = true;
-}
-
-/** Remove a defcon level option from a defcon level
- * @param level The defcon level
- * @param Level The defcon level option
- */
-void DelDefCon(int level, DefconLevel Level)
-{
- DefCon[level][Level] = false;
-}
-