]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
ISupportManager: Tidy-up, expand comments
[user/henk/code/inspircd.git] / src / users.cpp
index 5058cfcc24503d18da5265b1aca3d8769af26b4e..49c5c5e42e32ff8d49f30985149e4a4dd3bb36ea 100644 (file)
@@ -108,26 +108,6 @@ std::string User::ProcessNoticeMasks(const char *sm)
        return output;
 }
 
-void LocalUser::StartDNSLookup()
-{
-       try
-       {
-               bool cached = false;
-               UserResolver *res_reverse;
-
-               QueryType resolvtype = this->client_sa.sa.sa_family == AF_INET6 ? DNS_QUERY_PTR6 : DNS_QUERY_PTR4;
-               res_reverse = new UserResolver(this, this->GetIPString(), resolvtype, cached);
-
-               ServerInstance->AddResolver(res_reverse, cached);
-       }
-       catch (CoreException& e)
-       {
-               ServerInstance->Logs->Log("USERS", DEBUG,"Error in resolver: %s",e.GetReason());
-               dns_done = true;
-               ServerInstance->stats->statsDnsBad++;
-       }
-}
-
 bool User::IsNoticeMaskSet(unsigned char sm)
 {
        if (!isalpha(sm))
@@ -173,15 +153,15 @@ void User::SetMode(unsigned char m, bool value)
 
 const char* User::FormatModes(bool showparameters)
 {
-       static char data[MAXBUF];
+       static std::string data;
        std::string params;
-       int offset = 0;
+       data.clear();
 
        for (unsigned char n = 0; n < 64; n++)
        {
                if (modes[n])
                {
-                       data[offset++] = n + 65;
+                       data.push_back(n + 65);
                        ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_USER);
                        if (showparameters && mh && mh->GetNumParams(true))
                        {
@@ -191,9 +171,8 @@ const char* User::FormatModes(bool showparameters)
                        }
                }
        }
-       data[offset] = 0;
-       strlcat(data, params.c_str(), MAXBUF);
-       return data;
+       data += params;
+       return data.c_str();
 }
 
 User::User(const std::string &uid, const std::string& sid, int type)
@@ -205,7 +184,7 @@ User::User(const std::string &uid, const std::string& sid, int type)
        quietquit = quitting = false;
        client_sa.sa.sa_family = AF_UNSPEC;
 
-       ServerInstance->Logs->Log("USERS", DEBUG, "New UUID for user: %s", uuid.c_str());
+       ServerInstance->Logs->Log("USERS", LOG_DEBUG, "New UUID for user: %s", uuid.c_str());
 
        user_hash::iterator finduuid = ServerInstance->Users->uuidlist->find(uuid);
        if (finduuid == ServerInstance->Users->uuidlist->end())
@@ -215,12 +194,12 @@ User::User(const std::string &uid, const std::string& sid, int type)
 }
 
 LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* servaddr)
-       : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName, USERTYPE_LOCAL), eh(this),
+       : User(ServerInstance->UIDGen.GetUID(), ServerInstance->Config->ServerName, USERTYPE_LOCAL), eh(this),
        localuseriter(ServerInstance->Users->local_users.end()),
        bytes_in(0), bytes_out(0), cmds_in(0), cmds_out(0), nping(0), CommandFloodPenalty(0),
        already_sent(0)
 {
-       exempt = quitting_sendq = dns_done = false;
+       exempt = quitting_sendq = false;
        idle_lastmsg = 0;
        ident = "unknown";
        lastping = 0;
@@ -233,7 +212,7 @@ LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::so
 User::~User()
 {
        if (ServerInstance->Users->uuidlist->find(uuid) != ServerInstance->Users->uuidlist->end())
-               ServerInstance->Logs->Log("USERS", DEFAULT, "User destructor for %s called without cull", uuid.c_str());
+               ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "User destructor for %s called without cull", uuid.c_str());
 }
 
 const std::string& User::MakeHost()
@@ -332,40 +311,22 @@ const std::string& User::GetFullRealHost()
        return this->cached_fullrealhost;
 }
 
-bool LocalUser::IsInvited(const irc::string &channel)
-{
-       Channel* chan = ServerInstance->FindChan(channel.c_str());
-       if (!chan)
-               return false;
-
-       return (Invitation::Find(chan, this) != NULL);
-}
-
 InviteList& LocalUser::GetInviteList()
 {
        RemoveExpiredInvites();
        return invites;
 }
 
-void LocalUser::InviteTo(const irc::string &channel, time_t invtimeout)
-{
-       Channel* chan = ServerInstance->FindChan(channel.c_str());
-       if (chan)
-               Invitation::Create(chan, this, invtimeout);
-}
-
-void LocalUser::RemoveInvite(const irc::string &channel)
+bool LocalUser::RemoveInvite(Channel* chan)
 {
-       Channel* chan = ServerInstance->FindChan(channel.c_str());
-       if (chan)
+       Invitation* inv = Invitation::Find(chan, this);
+       if (inv)
        {
-               Invitation* inv = Invitation::Find(chan, this);
-               if (inv)
-               {
-                       inv->cull();
-                       delete inv;
-               }
+               inv->cull();
+               delete inv;
+               return true;
        }
+       return false;
 }
 
 void LocalUser::RemoveExpiredInvites()
@@ -380,7 +341,7 @@ bool User::HasModePermission(unsigned char, ModeType)
 
 bool LocalUser::HasModePermission(unsigned char mode, ModeType type)
 {
-       if (!IS_OPER(this))
+       if (!this->IsOper())
                return false;
 
        if (mode < 'A' || mode > ('A' + 64)) return false;
@@ -403,7 +364,7 @@ bool User::HasPermission(const std::string&)
 bool LocalUser::HasPermission(const std::string &command)
 {
        // are they even an oper at all?
-       if (!IS_OPER(this))
+       if (!this->IsOper())
        {
                return false;
        }
@@ -423,10 +384,10 @@ bool User::HasPrivPermission(const std::string &privstr, bool noisy)
 
 bool LocalUser::HasPrivPermission(const std::string &privstr, bool noisy)
 {
-       if (!IS_OPER(this))
+       if (!this->IsOper())
        {
                if (noisy)
-                       this->WriteServ("NOTICE %s :You are not an oper", this->nick.c_str());
+                       this->WriteNotice("You are not an oper");
                return false;
        }
 
@@ -440,7 +401,8 @@ bool LocalUser::HasPrivPermission(const std::string &privstr, bool noisy)
        }
 
        if (noisy)
-               this->WriteServ("NOTICE %s :Oper type %s does not have access to priv %s", this->nick.c_str(), oper->NameStr(), privstr.c_str());
+               this->WriteNotice("Oper type " + oper->name + " does not have access to priv " + privstr);
+
        return false;
 }
 
@@ -454,6 +416,7 @@ void UserIOHandler::OnDataReady()
                ServerInstance->Users->QuitUser(user, "RecvQ exceeded");
                ServerInstance->SNO->WriteToSnoMask('a', "User %s RecvQ of %lu exceeds connect class maximum of %lu",
                        user->nick.c_str(), (unsigned long)recvq.length(), user->MyClass->GetRecvqMax());
+               return;
        }
        unsigned long sendqmax = ULONG_MAX;
        if (!user->HasPrivPermission("users/flood/increased-buffers"))
@@ -544,6 +507,8 @@ CullResult LocalUser::cull()
        // is only a precaution currently.
        if (localuseriter != ServerInstance->Users->local_users.end())
                ServerInstance->Users->local_users.erase(localuseriter);
+       else
+               ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "ERROR: LocalUserIter does not point to a valid entry for " + this->nick);
 
        ClearInvites();
        eh.cull();
@@ -585,10 +550,10 @@ void User::Oper(OperInfo* info)
        }
 
        ServerInstance->SNO->WriteToSnoMask('o',"%s (%s@%s) is now an IRC operator of type %s (using oper '%s')",
-               nick.c_str(), ident.c_str(), host.c_str(), oper->NameStr(), opername.c_str());
-       this->WriteNumeric(381, "%s :You are now %s %s", nick.c_str(), strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->NameStr());
+               nick.c_str(), ident.c_str(), host.c_str(), oper->name.c_str(), opername.c_str());
+       this->WriteNumeric(381, "%s :You are now %s %s", nick.c_str(), strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->name.c_str());
 
-       ServerInstance->Logs->Log("OPER", DEFAULT, "%s opered as type: %s", GetFullRealHost().c_str(), oper->NameStr());
+       ServerInstance->Logs->Log("OPER", LOG_DEFAULT, "%s opered as type: %s", GetFullRealHost().c_str(), oper->name.c_str());
        ServerInstance->Users->all_opers.push_back(this);
 
        // Expand permissions from config for faster lookup
@@ -653,7 +618,7 @@ void OperInfo::init()
 
 void User::UnOper()
 {
-       if (!IS_OPER(this))
+       if (!this->IsOper())
                return;
 
        /*
@@ -766,12 +731,10 @@ void LocalUser::FullConnect()
        this->WriteNumeric(RPL_YOURHOSTIS, "%s :Your host is %s, running version %s",this->nick.c_str(),ServerInstance->Config->ServerName.c_str(),BRANCH);
        this->WriteNumeric(RPL_SERVERCREATED, "%s :This server was created %s %s", this->nick.c_str(), __TIME__, __DATE__);
 
-       std::string umlist = ServerInstance->Modes->UserModeList();
-       std::string cmlist = ServerInstance->Modes->ChannelModeList();
-       std::string pmlist = ServerInstance->Modes->ParaModeList();
-       this->WriteNumeric(RPL_SERVERVERSION, "%s %s %s %s %s %s", this->nick.c_str(), ServerInstance->Config->ServerName.c_str(), BRANCH, umlist.c_str(), cmlist.c_str(), pmlist.c_str());
+       const std::string& modelist = ServerInstance->Modes->GetModeListFor004Numeric();
+       this->WriteNumeric(RPL_SERVERVERSION, "%s %s %s %s", this->nick.c_str(), ServerInstance->Config->ServerName.c_str(), BRANCH, modelist.c_str());
 
-       ServerInstance->Config->Send005(this);
+       ServerInstance->ISupport.SendTo(this);
        this->WriteNumeric(RPL_YOURUUID, "%s %s :your unique ID", this->nick.c_str(), this->uuid.c_str());
 
        /* Now registered */
@@ -807,7 +770,7 @@ void LocalUser::FullConnect()
 
        ServerInstance->SNO->WriteToSnoMask('c',"Client connecting on port %d (class %s): %s (%s) [%s]",
                this->GetServerPort(), this->MyClass->name.c_str(), GetFullRealHost().c_str(), this->GetIPString().c_str(), this->fullname.c_str());
-       ServerInstance->Logs->Log("BANCACHE", DEBUG, "BanCache: Adding NEGATIVE hit for " + this->GetIPString());
+       ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCache: Adding NEGATIVE hit for " + this->GetIPString());
        ServerInstance->BanCache->AddHit(this->GetIPString(), "", "");
        // reset the flood penalty (which could have been raised due to things like auto +x)
        CommandFloodPenalty = 0;
@@ -824,19 +787,24 @@ void User::InvalidateCache()
 
 bool User::ChangeNick(const std::string& newnick, bool force)
 {
-       ModResult MOD_RESULT;
-
-       if (force)
-               ServerInstance->NICKForced.set(this, 1);
-       FIRST_MOD_RESULT(OnUserPreNick, MOD_RESULT, (this, newnick));
-       ServerInstance->NICKForced.set(this, 0);
-
-       if (MOD_RESULT == MOD_RES_DENY)
+       if (quitting)
        {
-               ServerInstance->stats->statsCollisions++;
+               ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "ERROR: Attempted to change nick of a quitting user: " + this->nick);
                return false;
        }
 
+       if (!force)
+       {
+               ModResult MOD_RESULT;
+               FIRST_MOD_RESULT(OnUserPreNick, MOD_RESULT, (this, newnick));
+
+               if (MOD_RESULT == MOD_RES_DENY)
+               {
+                       ServerInstance->stats->statsCollisions++;
+                       return false;
+               }
+       }
+
        if (assign(newnick) == assign(nick))
        {
                // case change, don't need to check Q:lines and such
@@ -1032,7 +1000,7 @@ void LocalUser::Write(const std::string& text)
                return;
        }
 
-       ServerInstance->Logs->Log("USEROUTPUT", RAWIO, "C[%s] O %s", uuid.c_str(), text.c_str());
+       ServerInstance->Logs->Log("USEROUTPUT", LOG_RAWIO, "C[%s] O %s", uuid.c_str(), text.c_str());
 
        eh.AddWriteBuf(text);
        eh.AddWriteBuf(wide_newline);
@@ -1046,14 +1014,9 @@ void LocalUser::Write(const std::string& text)
  */
 void LocalUser::Write(const char *text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->Write(std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->Write(textbuffer);
 }
 
 void User::WriteServ(const std::string& text)
@@ -1066,27 +1029,21 @@ void User::WriteServ(const std::string& text)
  */
 void User::WriteServ(const char* text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteServ(std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->WriteServ(textbuffer);
 }
 
+void User::WriteNotice(const std::string& text)
+{
+       this->WriteServ("NOTICE " + (this->registered == REG_ALL ? this->nick : "*") + " :" + text);
+}
 
 void User::WriteNumeric(unsigned int numeric, const char* text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteNumeric(numeric, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->WriteNumeric(numeric, textbuffer);
 }
 
 void User::WriteNumeric(unsigned int numeric, const std::string &text)
@@ -1105,11 +1062,8 @@ void User::WriteNumeric(unsigned int numeric, const std::string &text)
 
 void User::WriteFrom(User *user, const std::string &text)
 {
-       char tb[MAXBUF];
-
-       snprintf(tb,MAXBUF,":%s %s",user->GetFullHost().c_str(),text.c_str());
-
-       this->Write(std::string(tb));
+       const std::string message = ":" + user->GetFullHost() + " " + text;
+       this->Write(message);
 }
 
 
@@ -1117,14 +1071,9 @@ void User::WriteFrom(User *user, const std::string &text)
 
 void User::WriteFrom(User *user, const char* text, ...)
 {
-       va_list argsPtr;
-       char textbuffer[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteFrom(user, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       this->WriteFrom(user, textbuffer);
 }
 
 
@@ -1132,14 +1081,9 @@ void User::WriteFrom(User *user, const char* text, ...)
 
 void User::WriteTo(User *dest, const char *data, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-
-       va_start(argsPtr, data);
-       vsnprintf(textbuffer, MAXBUF, data, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteTo(dest, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, data, data);
+       this->WriteTo(dest, textbuffer);
 }
 
 void User::WriteTo(User *dest, const std::string &data)
@@ -1149,36 +1093,24 @@ void User::WriteTo(User *dest, const std::string &data)
 
 void User::WriteCommon(const char* text, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-
        if (this->registered != REG_ALL || quitting)
                return;
 
-       int len = snprintf(textbuffer,MAXBUF,":%s ",this->GetFullHost().c_str());
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer + len, MAXBUF - len, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteCommonRaw(std::string(textbuffer), true);
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       textbuffer = ":" + this->GetFullHost() + " " + textbuffer;
+       this->WriteCommonRaw(textbuffer, true);
 }
 
 void User::WriteCommonExcept(const char* text, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-
        if (this->registered != REG_ALL || quitting)
                return;
 
-       int len = snprintf(textbuffer,MAXBUF,":%s ",this->GetFullHost().c_str());
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer + len, MAXBUF - len, text, argsPtr);
-       va_end(argsPtr);
-
-       this->WriteCommonRaw(std::string(textbuffer), false);
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       textbuffer = ":" + this->GetFullHost() + " " + textbuffer;
+       this->WriteCommonRaw(textbuffer, false);
 }
 
 void User::WriteCommonRaw(const std::string &line, bool include_self)
@@ -1223,18 +1155,13 @@ void User::WriteCommonRaw(const std::string &line, bool include_self)
 
 void User::WriteCommonQuit(const std::string &normal_text, const std::string &oper_text)
 {
-       char tb1[MAXBUF];
-       char tb2[MAXBUF];
-
        if (this->registered != REG_ALL)
                return;
 
        already_sent_t uniq_id = ++LocalUser::already_sent_id;
 
-       snprintf(tb1,MAXBUF,":%s QUIT :%s",this->GetFullHost().c_str(),normal_text.c_str());
-       snprintf(tb2,MAXBUF,":%s QUIT :%s",this->GetFullHost().c_str(),oper_text.c_str());
-       std::string out1 = tb1;
-       std::string out2 = tb2;
+       const std::string normalMessage = ":" + this->GetFullHost() + " QUIT :" + normal_text;
+       const std::string operMessage = ":" + this->GetFullHost() + " QUIT :" + oper_text;
 
        UserChanList include_c(chans);
        std::map<User*,bool> exceptions;
@@ -1248,7 +1175,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op
                {
                        u->already_sent = uniq_id;
                        if (i->second)
-                               u->Write(IS_OPER(u) ? out2 : out1);
+                               u->Write(u->IsOper() ? operMessage : normalMessage);
                }
        }
        for (UCListIter v = include_c.begin(); v != include_c.end(); ++v)
@@ -1260,7 +1187,7 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op
                        if (u && !u->quitting && (u->already_sent != uniq_id))
                        {
                                u->already_sent = uniq_id;
-                               u->Write(IS_OPER(u) ? out2 : out1);
+                               u->Write(u->IsOper() ? operMessage : normalMessage);
                        }
                }
        }
@@ -1282,14 +1209,9 @@ void FakeUser::SendText(const std::string& line)
 
 void User::SendText(const char *text, ...)
 {
-       va_list argsPtr;
-       char line[MAXBUF];
-
-       va_start(argsPtr, text);
-       vsnprintf(line, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       SendText(std::string(line));
+       std::string line;
+       VAFORMAT(line, text, text);
+       SendText(line);
 }
 
 void User::SendText(const std::string &LinePrefix, std::stringstream &TextStream)
@@ -1365,8 +1287,6 @@ bool User::ChangeName(const char* gecos)
 
 void User::DoHostCycle(const std::string &quitline)
 {
-       char buffer[MAXBUF];
-
        if (!ServerInstance->Config->CycleHosts)
                return;
 
@@ -1397,18 +1317,17 @@ void User::DoHostCycle(const std::string &quitline)
        for (UCListIter v = include_c.begin(); v != include_c.end(); ++v)
        {
                Channel* c = *v;
-               snprintf(buffer, MAXBUF, ":%s JOIN %s", GetFullHost().c_str(), c->name.c_str());
-               std::string joinline(buffer);
                Membership* memb = c->GetUser(this);
-               std::string modeline = memb->modes;
-               if (modeline.length() > 0)
+               const std::string joinline = ":" + GetFullHost() + " JOIN " + c->name;
+               std::string modeline;
+
+               if (!memb->modes.empty())
                {
-                       for(unsigned int i=0; i < memb->modes.length(); i++)
+                       modeline = ":" + (ServerInstance->Config->CycleHostsFromUser ? GetFullHost() : ServerInstance->Config->ServerName)
+                               + " MODE " + c->name + " +" + memb->modes;
+
+                       for (size_t i = 0; i < memb->modes.length(); i++)
                                modeline.append(" ").append(nick);
-                       snprintf(buffer, MAXBUF, ":%s MODE %s +%s",
-                               ServerInstance->Config->CycleHostsFromUser ? GetFullHost().c_str() : ServerInstance->Config->ServerName.c_str(),
-                               c->name.c_str(), modeline.c_str());
-                       modeline = buffer;
                }
 
                const UserMembList *ulist = c->GetUsers();
@@ -1426,7 +1345,7 @@ void User::DoHostCycle(const std::string &quitline)
                                u->already_sent = seen_id;
                        }
                        u->Write(joinline);
-                       if (modeline.length() > 0)
+                       if (!memb->modes.empty())
                                u->Write(modeline);
                }
        }
@@ -1482,76 +1401,14 @@ bool User::ChangeIdent(const char* newident)
 
 void User::SendAll(const char* command, const char* text, ...)
 {
-       char textbuffer[MAXBUF];
-       char formatbuffer[MAXBUF];
-       va_list argsPtr;
-
-       va_start(argsPtr, text);
-       vsnprintf(textbuffer, MAXBUF, text, argsPtr);
-       va_end(argsPtr);
-
-       snprintf(formatbuffer,MAXBUF,":%s %s $* :%s", this->GetFullHost().c_str(), command, textbuffer);
-       std::string fmt = formatbuffer;
+       std::string textbuffer;
+       VAFORMAT(textbuffer, text, text);
+       const std::string message = ":" + this->GetFullHost() + " " + command + " $* :" + textbuffer;
 
        for (LocalUserList::const_iterator i = ServerInstance->Users->local_users.begin(); i != ServerInstance->Users->local_users.end(); i++)
        {
                if ((*i)->registered == REG_ALL)
-                       (*i)->Write(fmt);
-       }
-}
-
-
-std::string User::ChannelList(User* source, bool spy)
-{
-       std::string list;
-
-       for (UCListIter i = this->chans.begin(); i != this->chans.end(); i++)
-       {
-               Channel* c = *i;
-               /* If the target is the sender, neither +p nor +s is set, or
-                * the channel contains the user, it is not a spy channel
-                */
-               if (spy != (source == this || !(c->IsModeSet('p') || c->IsModeSet('s')) || c->HasUser(source)))
-                       list.append(c->GetPrefixChar(this)).append(c->name).append(" ");
-       }
-
-       return list;
-}
-
-void User::SplitChanList(User* dest, const std::string &cl)
-{
-       std::string line;
-       std::ostringstream prefix;
-       std::string::size_type start, pos, length;
-
-       prefix << this->nick << " " << dest->nick << " :";
-       line = prefix.str();
-       int namelen = ServerInstance->Config->ServerName.length() + 6;
-
-       for (start = 0; (pos = cl.find(' ', start)) != std::string::npos; start = pos+1)
-       {
-               length = (pos == std::string::npos) ? cl.length() : pos;
-
-               if (line.length() + namelen + length - start > 510)
-               {
-                       ServerInstance->SendWhoisLine(this, dest, 319, "%s", line.c_str());
-                       line = prefix.str();
-               }
-
-               if(pos == std::string::npos)
-               {
-                       line.append(cl.substr(start, length - start));
-                       break;
-               }
-               else
-               {
-                       line.append(cl.substr(start, length - start + 1));
-               }
-       }
-
-       if (line.length() != prefix.str().length())
-       {
-               ServerInstance->SendWhoisLine(this, dest, 319, "%s", line.c_str());
+                       (*i)->Write(message);
        }
 }
 
@@ -1566,7 +1423,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
 {
        ConnectClass *found = NULL;
 
-       ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Setting connect class for UID %s", this->uuid.c_str());
+       ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Setting connect class for UID %s", this->uuid.c_str());
 
        if (!explicit_name.empty())
        {
@@ -1576,7 +1433,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
 
                        if (explicit_name == c->name)
                        {
-                               ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Explicitly set to %s", explicit_name.c_str());
+                               ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Explicitly set to %s", explicit_name.c_str());
                                found = c;
                        }
                }
@@ -1586,7 +1443,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
                for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
                {
                        ConnectClass* c = *i;
-                       ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Checking %s", c->GetName().c_str());
+                       ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Checking %s", c->GetName().c_str());
 
                        ModResult MOD_RESULT;
                        FIRST_MOD_RESULT(OnSetConnectClass, MOD_RESULT, (this,c));
@@ -1594,7 +1451,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
                                continue;
                        if (MOD_RESULT == MOD_RES_ALLOW)
                        {
-                               ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Class forced by module to %s", c->GetName().c_str());
+                               ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Class forced by module to %s", c->GetName().c_str());
                                found = c;
                                break;
                        }
@@ -1610,7 +1467,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
                        if (!InspIRCd::MatchCIDR(this->GetIPString(), c->GetHost(), NULL) &&
                            !InspIRCd::MatchCIDR(this->host, c->GetHost(), NULL))
                        {
-                               ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "No host match (for %s)", c->GetHost().c_str());
+                               ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "No host match (for %s)", c->GetHost().c_str());
                                continue;
                        }
 
@@ -1620,7 +1477,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
                         */
                        if (c->limit && (c->GetReferenceCount() >= c->limit))
                        {
-                               ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "OOPS: Connect class limit (%lu) hit, denying", c->limit);
+                               ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "OOPS: Connect class limit (%lu) hit, denying", c->limit);
                                continue;
                        }
 
@@ -1628,7 +1485,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
                        int port = c->config->getInt("port");
                        if (port)
                        {
-                               ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Requires port (%d)", port);
+                               ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Requires port (%d)", port);
 
                                /* and our port doesn't match, fail. */
                                if (this->GetServerPort() != port)
@@ -1639,7 +1496,7 @@ void LocalUser::SetClass(const std::string &explicit_name)
                        {
                                if (ServerInstance->PassCompare(this, c->config->getString("password"), password, c->config->getString("hash")))
                                {
-                                       ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "Bad password, skipping");
+                                       ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Bad password, skipping");
                                        continue;
                                }
                        }
@@ -1703,7 +1560,8 @@ const std::string& FakeUser::GetFullRealHost()
 ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask)
        : config(tag), type(t), fakelag(true), name("unnamed"), registration_timeout(0), host(mask),
        pingtime(0), softsendqmax(0), hardsendqmax(0), recvqmax(0),
-       penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxconnwarn(true), maxchans(0), limit(0)
+       penaltythreshold(0), commandrate(0), maxlocal(0), maxglobal(0), maxconnwarn(true), maxchans(0),
+       limit(0), nouserdns(false)
 {
 }
 
@@ -1713,7 +1571,7 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, cons
        softsendqmax(parent.softsendqmax), hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax),
        penaltythreshold(parent.penaltythreshold), commandrate(parent.commandrate),
        maxlocal(parent.maxlocal), maxglobal(parent.maxglobal), maxconnwarn(parent.maxconnwarn), maxchans(parent.maxchans),
-       limit(parent.limit)
+       limit(parent.limit), nouserdns(parent.nouserdns)
 {
 }
 
@@ -1736,4 +1594,5 @@ void ConnectClass::Update(const ConnectClass* src)
        maxconnwarn = src->maxconnwarn;
        maxchans = src->maxchans;
        limit = src->limit;
+       nouserdns = src->nouserdns;
 }