X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommands.cpp;h=2b96b0a8ffb9f3323899fbcd8ed781c7afb85f31;hb=9e81044ffde2b1fc62456aca512d0cd7f1e52ad8;hp=692dcd2235b6180d79eb9589b0cc0dfb74835933;hpb=36127608a981c809c9b8e52980a6c23874eb633e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/commands.cpp b/src/commands.cpp index 692dcd223..2b96b0a8f 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -14,20 +14,27 @@ * --------------------------------------------------- */ +using namespace std; + #include "inspircd.h" #include "inspircd_io.h" #include "inspircd_util.h" #include "inspircd_config.h" #include -#include #include #include #include + #ifdef USE_KQUEUE #include #include #include #endif + +#ifdef USE_EPOLL +#include +#endif + #include #include #include @@ -39,11 +46,7 @@ #include #include #include -#include #include -#include -#include -#include #include #include #include @@ -64,19 +67,17 @@ #include "xline.h" #include "inspstring.h" #include "dnsqueue.h" - -#ifdef GCC3 -#define nspace __gnu_cxx -#else -#define nspace std -#endif - -using namespace std; +#include "helperfuncs.h" +#include "hashcomp.h" #ifdef USE_KQUEUE extern int kq; #endif +#ifdef USE_EPOLL +int ep; +#endif + extern int MODCOUNT; extern std::vector modules; extern std::vector factory; @@ -133,75 +134,10 @@ const long duration_d = duration_h * 24; const long duration_w = duration_d * 7; const long duration_y = duration_w * 52; -namespace nspace -{ -#ifdef GCC34 - template<> struct hash -#else - template<> struct nspace::hash -#endif - { - size_t operator()(const struct in_addr &a) const - { - size_t q; - memcpy(&q,&a,sizeof(size_t)); - return q; - } - }; -#ifdef GCC34 - template<> struct hash -#else - template<> struct nspace::hash -#endif - { - size_t operator()(const string &s) const - { - char a[MAXBUF]; - static struct hash strhash; - strlcpy(a,s.c_str(),MAXBUF); - strlower(a); - return strhash(a); - } - }; -} - - -struct StrHashComp -{ - - bool operator()(const string& s1, const string& s2) const - { - char a[MAXBUF],b[MAXBUF]; - strlcpy(a,s1.c_str(),MAXBUF); - strlcpy(b,s2.c_str(),MAXBUF); - strlower(a); - strlower(b); - return (strcasecmp(a,b) == 0); - } - -}; - -struct InAddr_HashComp -{ - - bool operator()(const in_addr &s1, const in_addr &s2) const - { - size_t q; - size_t p; - - memcpy(&q,&s1,sizeof(size_t)); - memcpy(&p,&s2,sizeof(size_t)); - - return (q == p); - } - -}; - - -typedef nspace::hash_map, StrHashComp> user_hash; -typedef nspace::hash_map, StrHashComp> chan_hash; -typedef nspace::hash_map, InAddr_HashComp> address_cache; -typedef nspace::hash_map, StrHashComp> whowas_hash; +typedef nspace::hash_map, irc::StrHashComp> user_hash; +typedef nspace::hash_map, irc::StrHashComp> chan_hash; +typedef nspace::hash_map, irc::InAddr_HashComp> address_cache; +typedef nspace::hash_map, irc::StrHashComp> whowas_hash; typedef std::deque command_table; @@ -251,6 +187,15 @@ void handle_part(char **parameters, int pcnt, userrec *user) } } +void handle_commands(char **parameters, int pcnt, userrec *user) +{ + for (int i = 0; i < command_table.size(); i++) + { + WriteServ(user->fd,"902 %s :%s %s",user->nick,command_table[i].command,command_table[i].source); + } + WriteServ(user->fd,"903 %s :End of COMMANDS list"); +} + void handle_kick(char **parameters, int pcnt, userrec *user) { chanrec* Ptr = FindChan(parameters[0]); @@ -463,59 +408,75 @@ void handle_pass(char **parameters, int pcnt, userrec *user) void handle_invite(char **parameters, int pcnt, userrec *user) { - userrec* u = Find(parameters[0]); - chanrec* c = FindChan(parameters[1]); - - if ((!c) || (!u)) + if (pcnt == 2) { - if (!c) + userrec* u = Find(parameters[0]); + chanrec* c = FindChan(parameters[1]); + + if ((!c) || (!u)) { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]); + if (!c) + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]); + } + else + { + if (c->binarymodes & CM_INVITEONLY) + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + } + } + + return; } - else + + if (c->binarymodes & CM_INVITEONLY) { - if (c->binarymodes & CM_INVITEONLY) + if (cstatus(user,c) < STATUS_HOP) { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); + WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name); + return; } } + if (has_channel(u,c)) + { + WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name); + return; + } + if (!has_channel(user,c)) + { + WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); + return; + } - return; - } + int MOD_RESULT = 0; + FOREACH_RESULT(OnUserPreInvite(user,u,c)); + if (MOD_RESULT == 1) { + return; + } - if (c->binarymodes & CM_INVITEONLY) + u->InviteTo(c->name); + WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name); + WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name); + + // i token must go to ALL servers!!! + char buffer[MAXBUF]; + snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name); + NetSendToAll(buffer); + } + else { - if (cstatus(user,c) < STATUS_HOP) + // pinched from ircu - invite with not enough parameters shows channels + // youve been invited to but haven't joined yet. + InvitedList* il = user->GetInviteList(); + for (InvitedList::iterator i = il->begin(); i != il->end(); i++) { - WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name); - return; + if (i->channel) { + WriteServ(user->fd,"346 %s :%s",user->nick,i->channel); + } } + WriteServ(user->fd,"347 %s :End of INVITE list",user->nick); } - if (has_channel(u,c)) - { - WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name); - return; - } - if (!has_channel(user,c)) - { - WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name); - return; - } - - int MOD_RESULT = 0; - FOREACH_RESULT(OnUserPreInvite(user,u,c)); - if (MOD_RESULT == 1) { - return; - } - - u->InviteTo(c->name); - WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name); - WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name); - - // i token must go to ALL servers!!! - char buffer[MAXBUF]; - snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name); - NetSendToAll(buffer); } void handle_topic(char **parameters, int pcnt, userrec *user) @@ -978,6 +939,16 @@ void handle_quit(char **parameters, int pcnt, userrec *user) { log(DEBUG,"kqueue: Failed to remove user from queue!"); } +#endif +#ifdef USE_EPOLL + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLET; + ev.data.fd = user->fd; + int i = epoll_ctl(ep, EPOLL_CTL_DEL, user->fd, &ev); + if (i < 0) + { + log(DEBUG,"epoll: List deletion failure!"); + } #endif shutdown(user->fd,2); close(user->fd);