From a6c8a6a9f2c3f6c0fda6e5bdfeecc3af8c9b5708 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 23 Dec 2010 23:33:02 -0500 Subject: Prevent version.cpp from prepending version.sh's VERSION_EXTRA on every build --- Config | 2 +- include/version.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Config b/Config index 4ccc82c62..681c5d0d4 100755 --- a/Config +++ b/Config @@ -171,7 +171,7 @@ if [ ! "$NO_INTRO" ] ; then # Only do this if we are not on a tag, src/version.sh will be all we need then. if [ "$VERSION_BUILD" != "$VERSION_EXTRA" ] ; then echo "#define VERSION_BUILD $VERSION_BUILD" > include/version.h - echo "#define VERSION_EXTRA \"$VERSION_EXTRA\"" >> include/version.h + echo "#define VERSION_EXTRA \"-$VERSION_EXTRA\"" >> include/version.h fi fi cat $SOURCE_DIR/.BANNER | sed "s/CURVER/$VERSION/" | sed "s@SOURCE_DIR@$SOURCE_DIR@" | $PAGER diff --git a/include/version.cpp b/include/version.cpp index 9b8f38c45..8cf362726 100644 --- a/include/version.cpp +++ b/include/version.cpp @@ -96,7 +96,7 @@ int main(int argc, char *argv[]) for (std::list >::iterator it = versions.begin(), it_end = versions.end(); it != it_end; ++it) { if (it->first == "EXTRA") - fd << "#define VERSION_EXTRA \"" << (!version_extra.empty() ? version_extra : "") << it->second << "\"" << std::endl; + fd << "#define VERSION_EXTRA \"" << (!version_extra.empty() ? version_extra : "") << (version_extra.find(it->second) == std::string::npos ? it->second : "") << "\"" << std::endl; else fd << "#define VERSION_" << it->first << " " << it->second << std::endl; } -- cgit From befb4b364418a6e29d5ecb6bcefba565ab324978 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 24 Dec 2010 01:22:07 -0500 Subject: Made the default socket poller use poll() because it is supported on most platforms --- data/example.conf | 3 +- modules/socketengines/m_socketengine_epoll.cpp | 6 - modules/socketengines/m_socketengine_poll.cpp | 192 +++++++++++++++++++++++++ 3 files changed, 194 insertions(+), 7 deletions(-) create mode 100644 modules/socketengines/m_socketengine_poll.cpp diff --git a/data/example.conf b/data/example.conf index ddbdbbc42..174a0f8a8 100644 --- a/data/example.conf +++ b/data/example.conf @@ -283,11 +283,12 @@ options * * Supported: * - m_socketengine_select + * - m_socketengine_poll * - m_socketengine_epoll * * We recommend using epoll if your operating system supports it (Linux 2.6+). */ - socketengine = "m_socketengine_select" + socketengine = "m_socketengine_poll" /* * The maximum length of passwords diff --git a/modules/socketengines/m_socketengine_epoll.cpp b/modules/socketengines/m_socketengine_epoll.cpp index 7ec380109..4a228a694 100644 --- a/modules/socketengines/m_socketengine_epoll.cpp +++ b/modules/socketengines/m_socketengine_epoll.cpp @@ -10,12 +10,10 @@ class SocketEngineEPoll : public SocketEngineBase long max; int EngineHandle; epoll_event *events; - unsigned SocketCount; public: SocketEngineEPoll() { - SocketCount = 0; max = ulimit(4, 0); if (max <= 0) @@ -57,8 +55,6 @@ class SocketEngineEPoll : public SocketEngineBase } Sockets.insert(std::make_pair(ev.data.fd, s)); - - ++SocketCount; } void DelSocket(Socket *s) @@ -76,8 +72,6 @@ class SocketEngineEPoll : public SocketEngineBase } Sockets.erase(ev.data.fd); - - --SocketCount; } void MarkWritable(Socket *s) diff --git a/modules/socketengines/m_socketengine_poll.cpp b/modules/socketengines/m_socketengine_poll.cpp new file mode 100644 index 000000000..044a79c4f --- /dev/null +++ b/modules/socketengines/m_socketengine_poll.cpp @@ -0,0 +1,192 @@ +#include "module.h" + +#ifndef _WIN32 +# include +# include +# include +# ifndef POLLRDHUP +# define POLLRDHUP 0 +# endif +#else +# define poll WSAPoll +# define POLLRDHUP POLLHUP +#endif + +class SocketEnginePoll : public SocketEngineBase +{ + private: + long max; + pollfd *events; + int SocketCount; + std::map socket_positions; + + public: + SocketEnginePoll() + { + SocketCount = 0; +#ifndef _WIN32 + max = ulimit(4, 0); +#else + max = 1024; +#endif + + if (max <= 0) + { + Log() << "Can't determine maximum number of open sockets"; + throw ModuleException("Can't determine maximum number of open sockets"); + } + + events = new pollfd[max]; + } + + ~SocketEnginePoll() + { + delete [] events; + } + + void AddSocket(Socket *s) + { + if (SocketCount == max) + { + Log() << "Unable to add fd " << s->GetFD() << " to socketengine poll, engine is full"; + return; + } + + pollfd *ev = &this->events[SocketCount]; + ev->fd = s->GetFD(); + ev->events = POLLIN; + ev->revents = 0; + + Sockets.insert(std::make_pair(ev->fd, s)); + socket_positions.insert(std::make_pair(ev->fd, SocketCount)); + + ++SocketCount; + } + + void DelSocket(Socket *s) + { + std::map::iterator pos = socket_positions.find(s->GetFD()); + if (pos == socket_positions.end()) + { + Log() << "Unable to delete unknown fd " << s->GetFD() << " from socketengine poll"; + return; + } + + if (pos->second != SocketCount) + { + pollfd *ev = &this->events[pos->second], + *last_ev = &this->events[SocketCount - 1]; + + ev->fd = last_ev->fd; + ev->events = last_ev->events; + ev->revents = last_ev->revents; + + socket_positions[ev->fd] = pos->second; + } + + Sockets.erase(s->GetFD()); + this->socket_positions.erase(pos); + + --SocketCount; + } + + void MarkWritable(Socket *s) + { + if (s->HasFlag(SF_WRITABLE)) + return; + + std::map::iterator pos = socket_positions.find(s->GetFD()); + if (pos == socket_positions.end()) + { + Log() << "Unable to mark unknown fd " << s->GetFD() << " as writable"; + return; + } + + pollfd *ev = &this->events[pos->second]; + ev->events |= POLLOUT; + + s->SetFlag(SF_WRITABLE); + } + + void ClearWritable(Socket *s) + { + if (!s->HasFlag(SF_WRITABLE)) + return; + + std::map::iterator pos = socket_positions.find(s->GetFD()); + if (pos == socket_positions.end()) + { + Log() << "Unable to mark unknown fd " << s->GetFD() << " as writable"; + return; + } + + pollfd *ev = &this->events[pos->second]; + ev->events &= ~POLLOUT; + + s->UnsetFlag(SF_WRITABLE); + } + + void Process() + { + int total = poll(this->events, this->SocketCount, Config->ReadTimeout * 1000); + Anope::CurTime = time(NULL); + + if (total == -1) + { + Log() << "SockEngine::Process(): error: " << Anope::LastError(); + return; + } + + for (int i = 0; i < total; ++i) + { + pollfd *ev = &this->events[i]; + Socket *s = Sockets[ev->fd]; + + if (s->HasFlag(SF_DEAD)) + continue; + if (ev->revents & (POLLERR | POLLRDHUP)) + { + s->ProcessError(); + s->SetFlag(SF_DEAD); + continue; + } + + if ((ev->revents & POLLIN) && !s->ProcessRead()) + s->SetFlag(SF_DEAD); + + if ((ev->revents & POLLOUT) && !s->ProcessWrite()) + s->SetFlag(SF_DEAD); + } + + for (int i = 0; i < total; ++i) + { + pollfd *ev = &this->events[i]; + Socket *s = Sockets[ev->fd]; + + if (s->HasFlag(SF_DEAD)) + delete s; + } + } +}; + +class ModuleSocketEnginePoll : public Module +{ + SocketEnginePoll engine; + + public: + ModuleSocketEnginePoll(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator) + { + this->SetAuthor("Anope"); + this->SetPermanent(true); + this->SetType(SOCKETENGINE); + + SocketEngine = &engine; + } + + ~ModuleSocketEnginePoll() + { + SocketEngine = NULL; + } +}; + +MODULE_INIT(ModuleSocketEnginePoll) -- cgit From 35e328bcb60a431d9e8ee86c40df571d3653c451 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 24 Dec 2010 01:23:22 -0500 Subject: Fixed Windows build --- include/commands.h | 2 +- include/hashcomp.h | 4 ++-- include/services.h | 2 +- include/sockets.h | 2 +- modules/CMakeLists.txt | 8 ++++---- modules/core/db_plain.cpp | 6 +++--- modules/extra/db_mysql.cpp | 4 ++-- modules/extra/m_alias.cpp | 2 +- src/chanserv.cpp | 4 ++-- src/regchannel.cpp | 4 ++-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/commands.h b/include/commands.h index 6c7ef7494..f05b1a5db 100644 --- a/include/commands.h +++ b/include/commands.h @@ -44,7 +44,7 @@ enum CommandFlag }; /* The source for a command */ -struct CommandSource +struct CoreExport CommandSource { /* User executing the command */ User *u; diff --git a/include/hashcomp.h b/include/hashcomp.h index b99b97aa4..fa502b498 100644 --- a/include/hashcomp.h +++ b/include/hashcomp.h @@ -176,7 +176,7 @@ namespace irc /** Used to hash irc::strings for unordered_map */ - struct hash + struct CoreExport hash { /* VS 2008 specific code */ enum { bucket_size = 4, min_buckets = 8 }; @@ -253,7 +253,7 @@ namespace ci /** Used to hash ci::strings for unordered_map */ - struct hash + struct CoreExport hash { /* VS 2008 specific code */ enum { bucket_size = 4, min_buckets = 8 }; diff --git a/include/services.h b/include/services.h index d86729e51..5448d9170 100644 --- a/include/services.h +++ b/include/services.h @@ -765,7 +765,7 @@ enum EntryType ENTRYTYPE_HOST }; -class Entry : public Flags +class CoreExport Entry : public Flags { Anope::string mask; diff --git a/include/sockets.h b/include/sockets.h index c9e5bfed0..d5457cf05 100644 --- a/include/sockets.h +++ b/include/sockets.h @@ -340,7 +340,7 @@ class CoreExport ConnectionSocket : public BufferedSocket void Connect(const Anope::string &TargetHost, int Port, const Anope::string &BindHost = ""); }; -class ClientSocket : public BufferedSocket +class CoreExport ClientSocket : public BufferedSocket { public: /* Listen socket this connection came from */ diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 9e094b40c..a9a73e775 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -76,9 +76,9 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS}) endif(WIN32) set_target_properties(${SO} PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX "" LINK_FLAGS "${TEMP_LDFLAGS} ${WIN32_NO_LIBS}") add_dependencies(${SO} ${PROGRAM_NAME}) - # For Windows only, have the module link to the export library of Anope as well as the wsock32 library (most of the modules probably don't need this, but this is to be on the safe side), also set it's version + # For Windows only, have the module link to the export library of Anope as well as wsock32 and Ws2_32 libraries (most of the modules probably don't need this, but this is to be on the safe side), also set it's version if(WIN32) - target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 ${WIN32_MEMORY} ${TEMP_DEPENDENCIES}) + target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 Ws2_32 ${WIN32_MEMORY} ${TEMP_DEPENDENCIES}) set_target_properties(${PROGRAM_NAME} PROPERTIES VERSION "${VERSION_DOTTED}") endif(WIN32) # Set the module to be installed to the module directory under the data directory @@ -170,9 +170,9 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS}) add_library(${SO} MODULE ${MODULES_SUBDIR_SRCS}) set_target_properties(${SO} PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX "" LINK_FLAGS "${SUBDIR_LDFLAGS}") add_dependencies(${SO} ${PROGRAM_NAME}) - # For Windows only, have the module link to the export library of Anope as well as the wsock32 library (most of the modules probably don't need this, but this is to be on the safe side), also set it's version + # For Windows only, have the module link to the export library of Anope as well as wsock32 and Ws2_32 libraries (most of the modules probably don't need this, but this is to be on the safe side), also set it's version if(WIN32) - target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 ${WIN32_MEMORY} ${SUBDIR_EXTRA_DEPENDS}) + target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 Ws2_32 ${WIN32_MEMORY} ${SUBDIR_EXTRA_DEPENDS}) set_target_properties(${PROGRAM_NAME} PROPERTIES VERSION "${VERSION_DOTTED}") endif(WIN32) # Set the module to be installed to the module directory under the data directory diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp index 44058d5e5..97ac75bde 100644 --- a/modules/core/db_plain.cpp +++ b/modules/core/db_plain.cpp @@ -980,7 +980,7 @@ class DBPlain : public Module db << " " << oldmodes; else { - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; if (ml.set) @@ -1003,7 +1003,7 @@ class DBPlain : public Module } else { - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; if (!ml.set) @@ -1028,7 +1028,7 @@ class DBPlain : public Module } else { - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name); diff --git a/modules/extra/db_mysql.cpp b/modules/extra/db_mysql.cpp index 07135757c..3cc0ceacb 100644 --- a/modules/extra/db_mysql.cpp +++ b/modules/extra/db_mysql.cpp @@ -206,7 +206,7 @@ static Anope::string MakeMLock(ChannelInfo *ci, bool status) ; else { - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; if (ml.set == status) @@ -249,7 +249,7 @@ static Anope::string GetMLockParams(ChannelInfo *ci, bool onoff) } else { - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; diff --git a/modules/extra/m_alias.cpp b/modules/extra/m_alias.cpp index f1b6c3959..8e73bacd9 100644 --- a/modules/extra/m_alias.cpp +++ b/modules/extra/m_alias.cpp @@ -62,7 +62,7 @@ class ModuleAlias : public Module EventReturn OnPreCommandRun(User *&u, BotInfo *&bi, Anope::string &command, Anope::string &message, ChannelInfo *&ci) { bool fantasy = ci != NULL; - std::map >::const_iterator it = aliases.find(command), it_end = it; + std::multimap >::const_iterator it = aliases.find(command), it_end = it; if (it_end != aliases.end()) it_end = aliases.upper_bound(command); for (; it != it_end; ++it) diff --git a/src/chanserv.cpp b/src/chanserv.cpp index 504bdea2a..35fd8975c 100644 --- a/src/chanserv.cpp +++ b/src/chanserv.cpp @@ -111,7 +111,7 @@ Anope::string get_mlock_modes(ChannelInfo *ci, int complete) { Anope::string pos = "+", neg = "-", params; - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name); @@ -241,7 +241,7 @@ void check_modes(Channel *c) return; } - for (std::map::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) + for (std::multimap::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it) { const ModeLock &ml = it->second; ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name); diff --git a/src/regchannel.cpp b/src/regchannel.cpp index 62dc94b3d..17c141ea7 100644 --- a/src/regchannel.cpp +++ b/src/regchannel.cpp @@ -579,13 +579,13 @@ void ChannelInfo::LoadMLock() */ bool ChannelInfo::HasMLock(ChannelMode *mode, const Anope::string ¶m, bool status) const { - std::map::const_iterator it = this->mode_locks.find(mode->Name); + std::multimap::const_iterator it = this->mode_locks.find(mode->Name); if (it != this->mode_locks.end()) { if (mode->Type != MODE_REGULAR) { - std::map::const_iterator it_end = this->mode_locks.upper_bound(mode->Name); + std::multimap::const_iterator it_end = this->mode_locks.upper_bound(mode->Name); for (; it != it_end; ++it) { const ModeLock &ml = it->second; -- cgit From d5c1d6ebecf833acb3745e3d9520193066e94916 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 24 Dec 2010 16:12:08 -0500 Subject: Do not allow xop del to delete users on another list --- modules/core/cs_xop.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/cs_xop.cpp b/modules/core/cs_xop.cpp index 1d1ec7c84..6ab6edff8 100644 --- a/modules/core/cs_xop.cpp +++ b/modules/core/cs_xop.cpp @@ -316,7 +316,7 @@ class XOPBase : public Command XOPDelCallback list(source, this, messages, override, mask); list.Process(); } - else if (!access) + else if (!access || access->level != level) { source.Reply(messages[XOP_NOT_FOUND], mask.c_str(), ci->name.c_str()); return MOD_CONT; -- cgit From 86900175c83375e4d3ad21749d8d6b65cc9f6732 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 24 Dec 2010 19:07:47 -0500 Subject: Made clearing SXLines remove the XLine from the IRCd too --- src/operserv.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/operserv.cpp b/src/operserv.cpp index c76b34375..553126218 100644 --- a/src/operserv.cpp +++ b/src/operserv.cpp @@ -324,9 +324,8 @@ XLine *XLineManager::GetEntry(unsigned index) */ void XLineManager::Clear() { - for (std::vector::iterator it = this->XLines.begin(), it_end = this->XLines.end(); it != it_end; ++it) - delete *it; - this->XLines.clear(); + while (!this->XLines.empty()) + this->DelXLine(this->XLines.front()); } /** Add an entry to this XLine Manager -- cgit From aa9e33cf74cbbb4572465a15cc9919511c297216 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 24 Dec 2010 19:55:09 -0500 Subject: Bug #1216 - Do not apply SQLines on our own clients --- src/operserv.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/operserv.cpp b/src/operserv.cpp index 553126218..6437fa2c9 100644 --- a/src/operserv.cpp +++ b/src/operserv.cpp @@ -605,7 +605,7 @@ XLine *SNLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_ User *user = *it; ++it; - if (!user->HasMode(UMODE_OPER) && Anope::Match(user->realname, x->Mask)) + if (!user->HasMode(UMODE_OPER) && user->server != Me && Anope::Match(user->realname, x->Mask)) kill_user(Config->ServerName, user, rreason); } } @@ -697,7 +697,7 @@ XLine *SQLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_ UserContainer *uc = *it; ++it; - if (uc->user->HasMode(UMODE_OPER)) + if (uc->user->HasMode(UMODE_OPER) || uc->user->server == Me) continue; c->Kick(NULL, uc->user, "%s", reason.c_str()); } @@ -710,7 +710,7 @@ XLine *SQLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_ User *user = *it; ++it; - if (!user->HasMode(UMODE_OPER) && Anope::Match(user->nick, x->Mask)) + if (!user->HasMode(UMODE_OPER) && user->server != Me && Anope::Match(user->nick, x->Mask)) kill_user(Config->ServerName, user, rreason); } } -- cgit From 80721d1873e770eddd4c232d42d9ba920e6e644a Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 25 Dec 2010 02:30:39 -0500 Subject: Forward port part of 821995bf604b5c6e18e6c0c93a31e149565160c8 --- src/bots.cpp | 8 ++++++++ src/modules.cpp | 3 +++ 2 files changed, 11 insertions(+) diff --git a/src/bots.cpp b/src/bots.cpp index 87a646923..07ea91b3a 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -72,6 +72,14 @@ BotInfo::~BotInfo() ci->bi = NULL; } + for (CommandMap::const_iterator it = this->Commands.begin(), it_end = this->Commands.end(); it != it_end; ++it) + { + Command *c = it->second; + + if (c->module) + c->module->DelCommand(this, c); + } + BotListByNick.erase(this->nick); if (!this->uid.empty()) BotListByUID.erase(this->uid); diff --git a/src/modules.cpp b/src/modules.cpp index 63e6bcab3..1ca060108 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -173,6 +173,9 @@ int Module::DelCommand(BotInfo *bi, Command *c) if (!bi->Commands.erase(c->name)) return MOD_ERR_NOEXIST; + + c->module = NULL; + c->service = NULL; return MOD_ERR_OK; } -- cgit From 036d4514f0017bc7e06833fce2d13a4bc86e8b1c Mon Sep 17 00:00:00 2001 From: lethality Date: Sat, 25 Dec 2010 15:27:02 +0000 Subject: updated crontab instructions in INSTALL --- docs/INSTALL | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/INSTALL b/docs/INSTALL index 3883f5a51..e011470b5 100644 --- a/docs/INSTALL +++ b/docs/INSTALL @@ -185,16 +185,16 @@ Note: You should also read the README and FAQ files! modification. First rename the example.chk script that is in Anope path (by default, - this is ~/services) to services.chk and edit it. You'll need to modify - the CONFIGURATION part of the file. Then ensure that the file is marked - as executable by typing chmod +x services.chk, and try to launch the + this is ~/services/data) to services.chk and edit it. You'll need to + modify the CONFIGURATION part of the file. Then ensure that the file is + marked as executable by typing chmod +x services.chk, and try to launch the script to see if it works (Anope must not be running when you do this ;)) When this is done, you'll have to add the crontab entry. Type crontab -e. This will open the default text editor with the crontab file. Enter the following (with correct path): - */5 * * * * /home/ircd/services/services.chk >/dev/null 2>&1 + */5 * * * * /home/ircd/services/data/services.chk >/dev/null 2>&1 The */5 at the beginning means "check every 5 minutes". You may replace the 5 with other another number if you want (but less than 60). Consult -- cgit From 1b3f2567bc34da051025ba91184b3370f7956c63 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 26 Dec 2010 00:14:49 -0500 Subject: Fixed a potential crash from dropping nicks --- src/nickcore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nickcore.cpp b/src/nickcore.cpp index 40cd873a8..b094c8962 100644 --- a/src/nickcore.cpp +++ b/src/nickcore.cpp @@ -32,9 +32,9 @@ NickCore::~NickCore() /* Clean up this nick core from any users online using it * (ones that /nick but remain unidentified) */ - for (std::list::iterator it = this->Users.begin(), it_end = this->Users.end(); it != it_end; ++it) + for (std::list::iterator it = this->Users.begin(); it != this->Users.end();) { - User *user = *it; + User *user = *it++; ircdproto->SendAccountLogout(user, user->Account()); user->RemoveMode(NickServ, UMODE_REGISTERED); ircdproto->SendUnregisteredNick(user); -- cgit From 8af2465a61b09e020c1324acfb78bbf912869fc8 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 26 Dec 2010 00:31:11 -0500 Subject: Bug #1219 - Correctly restrict people from registering potentential guest names --- modules/core/ns_register.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/ns_register.cpp b/modules/core/ns_register.cpp index edf8181e5..31f99540a 100644 --- a/modules/core/ns_register.cpp +++ b/modules/core/ns_register.cpp @@ -213,7 +213,7 @@ class CommandNSRegister : public CommandNSConfirm /* Guest nick can now have a series of between 1 and 7 digits. * --lara */ - if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 && !u->nick.find_ci(Config->NSGuestNickPrefix) && !u->nick.substr(prefixlen).find_first_not_of("1234567890")) + if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 && !u->nick.find_ci(Config->NSGuestNickPrefix) && u->nick.substr(prefixlen).find_first_not_of("1234567890") == Anope::string::npos) { source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str()); return MOD_CONT; -- cgit