/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* InspIRCd: (C) 2002-2007 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/#include"inspircd.h"#include"configreader.h"#include"channels.h"#include"users.h"#include<stdarg.h>#include"socketengine.h"#include"wildcard.h"#include"xline.h"#include"commands/cmd_whowas.h"staticunsignedlongalready_sent[MAX_DESCRIPTORS]={0};/* XXX: Used for speeding up WriteCommon operations */unsignedlonguniq_id=0;boolInitTypes(ServerConfig*conf,constchar*tag){if(conf->opertypes.size()){for(opertype_t::iteratorn=conf->opertypes.begin();n!=conf->opertypes.end();n++){if(n->second)delete[]n->second;}}conf->opertypes.clear();returntrue;}boolInitClasses(ServerConfig*conf,constchar*tag){if(conf->operclass.size()){for(operclass_t::iteratorn=conf->operclass.begin();n!=conf->operclass.end();n++){if(n->second)delete[]n->second;}}conf->operclass.clear();returntrue;}boolDoType(ServerConfig*conf,constchar*tag,char**entries,ValueList&values,int*types){constchar*TypeName=values[0].GetString();constchar*Classes=values[1].GetString();conf->opertypes[TypeName]=strnewdup(Classes);returntrue;}boolDoClass(ServerConfig*conf,constchar*tag,char**entries,ValueList&values,int*types){constchar*ClassName=values[0].GetString();constchar*CommandList=values[1].GetString();conf->operclass[ClassName]=strnewdup(CommandList);returntrue;}boolDoneClassesAndTypes(ServerConfig*conf,constchar*tag){returntrue;}std::stringuserrec::ProcessNoticeMasks(constchar*sm){booladding=true,oldadding=false;constchar*c=sm;std::stringoutput;while(c&&*c){switch(*c){case'+':adding=true;break;case'-':adding=false;break;case'*':for(unsignedchard='A';d<='z';d++){if(ServerInstance->SNO->IsEnabled(d)){if((!IsNoticeMaskSet(d)&&adding)||(IsNoticeMaskSet(d)&&!adding)){if((oldadding!=adding)||(!output.length()))output+=(adding?'+':'-');this->SetNoticeMask(d,adding);output+=d;}}oldadding=adding;}break;default:if((*c>='A')&&(*c<='z')&&(ServerInstance->SNO->IsEnabled(*c))){if((!IsNoticeMaskSet(*c)&&adding)||(IsNoticeMaskSet(*c)&&!adding)){if((oldadding!=adding)||(!output.length()))output+=(adding?'+':'-');this->SetNoticeMask(*c,adding);output+=*c;}}oldadding=adding;break;}*c++;}returnoutput;}voiduserrec::StartDNSLookup(){try{boolcached;constchar*ip=this->GetIPString();/* Special case for 4in6 (Have i mentioned i HATE 4in6?) */if(!strncmp(ip,"0::ffff:",8))res_reverse=newUserResolver(this->ServerInstance,this,ip+8,DNS_QUERY_PTR4,cached);elseres_reverse=newUserResolver(this->ServerInstance,this,ip,this->GetProtocolFamily()==AF_INET?DNS_QUERY_PTR4:DNS_QUERY_PTR6,cached);this->ServerInstance->AddResolver(res_reverse,cached);}catch(CoreException&e){ServerInstance->Log(DEBUG,"Error in resolver: %s",e.GetReason());}}UserResolver::UserResolver(InspIRCd*Instance,userrec*user,std::stringto_resolve,QueryTypeqt,bool&cache):Resolver(Instance,to_resolve,qt,cache),bound_user(user){this->fwd=(qt==DNS_QUERY_A||qt==DNS_QUERY_AAAA);this->bound_fd=user->GetFd();}voidUserResolver::OnLookupComplete(conststd::string&result,unsignedintttl,boolcached){if((!this->fwd)&&(ServerInstance->SE->GetRef(this->bound_fd)==this->bound_user)){