opertype_t opertypes;
operclass_t operclass;
-void ReadClassesAndTypes()
+bool InitTypes(const char* tag)
{
- char TypeName[MAXBUF],Classes[MAXBUF],ClassName[MAXBUF],CommandList[MAXBUF];
for (opertype_t::iterator n = opertypes.begin(); n != opertypes.end(); n++)
{
if (n->second)
delete[] n->second;
}
+ opertypes.clear();
+ return true;
+}
+
+bool InitClasses(const char* tag)
+{
for (operclass_t::iterator n = operclass.begin(); n != operclass.end(); n++)
{
if (n->second)
delete[] n->second;
}
- opertypes.clear();
operclass.clear();
- for (int j =0; j < Config->ConfValueEnum("type",&Config->config_f); j++)
- {
- Config->ConfValue("type","name",j,TypeName,&Config->config_f);
- Config->ConfValue("type","classes",j,Classes,&Config->config_f);
- opertypes[TypeName] = strdup(Classes);
- log(DEBUG,"Read oper TYPE '%s' with classes '%s'",TypeName,Classes);
- }
- for (int k =0; k < Config->ConfValueEnum("class",&Config->config_f); k++)
- {
- Config->ConfValue("class","name",k,ClassName,&Config->config_f);
- Config->ConfValue("class","commands",k,CommandList,&Config->config_f);
- operclass[ClassName] = strdup(CommandList);
- log(DEBUG,"Read oper CLASS '%s' with commands '%s'",ClassName,CommandList);
- }
+ return true;
}
-template<typename T> inline string ConvToStr(const T &in)
+bool DoType(const char* tag, char** entries, void** values, int* types)
{
- stringstream tmp;
- if (!(tmp << in)) return string();
- return tmp.str();
+ char* TypeName = (char*)values[0];
+ char* Classes = (char*)values[1];
+ opertypes[TypeName] = strdup(Classes);
+ log(DEBUG,"Read oper TYPE '%s' with classes '%s'",TypeName,Classes);
+ return true;
+}
+
+bool DoClass(const char* tag, char** entries, void** values, int* types)
+{
+ char* ClassName = (char*)values[0];
+ char* CommandList = (char*)values[1];
+ operclass[ClassName] = strdup(CommandList);
+ log(DEBUG,"Read oper CLASS '%s' with commands '%s'",ClassName,CommandList);
+ return true;
+}
+
+bool DoneClassesAndTypes(const char* tag)
+{
+ return true;
}
userrec::userrec()
server = (char*)FindServerNamePtr(Config->ServerName);
reset_due = TIME;
lines_in = fd = lastping = signon = idle_lastmsg = nping = registered = 0;
- timeout = flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0;
+ modebits = timeout = flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0;
haspassed = dns_done = false;
recvq = "";
sendq = "";
}
}
-bool userrec::HasPermission(std::string &command)
+bool userrec::HasPermission(const std::string &command)
{
char* mycmd;
char* savept;
}
-bool userrec::AddBuffer(std::string a)
+bool userrec::AddBuffer(const std::string &a)
{
std::string b = "";
char* n = (char*)a.c_str();
if ((*i != '\r') && (*i != '\0') && (*i != 7))
b = b + *i;
}
- std::stringstream stream(recvq);
- stream << b;
- recvq = stream.str();
+ recvq.append(b);
unsigned int i = 0;
// count the size of the first line in the buffer.
while (i < recvq.length())
ret = ret + *line;
line++;
}
- if ((*line == '\n') || (*line == '\r'))
+ while ((*line == '\n') || (*line == '\r'))
line++;
recvq = line;
return ret;
}
-void userrec::AddWriteBuf(std::string data)
+void userrec::AddWriteBuf(const std::string &data)
{
- if (this->GetWriteError() != "")
+ if (*this->GetWriteError())
return;
if (sendq.length() + data.length() > (unsigned)this->sendqmax)
{
}
}
-void userrec::SetWriteError(std::string error)
+void userrec::SetWriteError(const std::string &error)
{
log(DEBUG,"Setting error string for %s to '%s'",this->nick,error.c_str());
// don't try to set the error twice, its already set take the first string.
this->WriteError = error;
}
-std::string userrec::GetWriteError()
+const char* userrec::GetWriteError()
{
- return this->WriteError;
+ return this->WriteError.c_str();
}
void AddOper(userrec* user)
{
user_hash::iterator iter = clientlist.find(user->nick);
+
+/*
+ * I'm pretty sure returning here is causing a desync when part of the net thinks a user is gone,
+ * and another part doesn't. We want to broadcast the quit/kill before bailing so the net stays in sync.
+ *
+ * I can't imagine this blowing up, so I'm commenting it out. We still check
+ * before playing with a bad iterator below in our if(). DISCUSS THIS BEFORE YOU DO ANYTHING. --w00t
+ *
+ * if (iter == clientlist.end())
+ * return;
+ */
+
char reason[MAXBUF];
strlcpy(reason,r,MAXQUIT-1);
log(DEBUG,"kill_link: %s '%s'",user->nick,reason);
- Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
- log(DEBUG,"closing fd %d",user->fd);
+ if (IS_LOCAL(user))
+ Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
if (user->registered == 7) {
purge_empty_chans(user);
WriteCommonExcept(user,"QUIT :%s",reason);
}
- user->FlushWriteBuf();
+ if (IS_LOCAL(user))
+ user->FlushWriteBuf();
FOREACH_MOD(I_OnUserDisconnect,OnUserDisconnect(user));
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
if (Config->GetIOHook(user->port))
{
// if they were an oper with +s.
if (user->registered == 7) {
// fix by brain: only show local quits because we only show local connects (it just makes SENSE)
- if (user->fd > -1)
+ if (IS_LOCAL(user))
WriteOpers("*** Client exiting: %s!%s@%s [%s]",user->nick,user->ident,user->host,reason);
AddWhoWas(user);
}
if (iter != clientlist.end())
{
log(DEBUG,"deleting user hash value %lx",(unsigned long)user);
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
fd_ref_table[user->fd] = NULL;
if (find(local_users.begin(),local_users.end(),user) != local_users.end())
}
}
clientlist.erase(iter);
+ delete user;
}
- delete user;
}
WhoWasGroup::WhoWasGroup(userrec* user) : host(NULL), dhost(NULL), ident(NULL), server(NULL), gecos(NULL), signon(user->signon)
}
}
}
-