]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands.cpp
Added COMMANDS command (yes, really)
[user/henk/code/inspircd.git] / src / commands.cpp
index 692dcd2235b6180d79eb9589b0cc0dfb74835933..2b96b0a8ffb9f3323899fbcd8ed781c7afb85f31 100644 (file)
  * ---------------------------------------------------
  */
 
+using namespace std;
+
 #include "inspircd.h"
 #include "inspircd_io.h"
 #include "inspircd_util.h"
 #include "inspircd_config.h"
 #include <unistd.h>
-#include <fcntl.h>
 #include <sys/errno.h>
 #include <sys/ioctl.h>
 #include <sys/utsname.h>
+
 #ifdef USE_KQUEUE
 #include <sys/types.h>
 #include <sys/event.h>
 #include <sys/time.h>
 #endif
+
+#ifdef USE_EPOLL
+#include <sys/epoll.h>
+#endif
+
 #include <cstdio>
 #include <time.h>
 #include <string>
 #include <map>
 #include <sstream>
 #include <vector>
-#include <errno.h>
 #include <deque>
-#include <errno.h>
-#include <unistd.h>
-#include <sched.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 #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<Module*> modules;
 extern std::vector<ircd_module*> 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<in_addr>
-#else
-        template<> struct nspace::hash<in_addr>
-#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<string>
-#else
-        template<> struct nspace::hash<string>
-#endif
-        {
-                size_t operator()(const string &s) const
-                {
-                        char a[MAXBUF];
-                        static struct hash<const char *> 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<std::string, userrec*, nspace::hash<string>, StrHashComp> user_hash;
-typedef nspace::hash_map<std::string, chanrec*, nspace::hash<string>, StrHashComp> chan_hash;
-typedef nspace::hash_map<in_addr,string*, nspace::hash<in_addr>, InAddr_HashComp> address_cache;
-typedef nspace::hash_map<std::string, WhoWasUser*, nspace::hash<string>, StrHashComp> whowas_hash;
+typedef nspace::hash_map<std::string, userrec*, nspace::hash<string>, irc::StrHashComp> user_hash;
+typedef nspace::hash_map<std::string, chanrec*, nspace::hash<string>, irc::StrHashComp> chan_hash;
+typedef nspace::hash_map<in_addr,string*, nspace::hash<in_addr>, irc::InAddr_HashComp> address_cache;
+typedef nspace::hash_map<std::string, WhoWasUser*, nspace::hash<string>, irc::StrHashComp> whowas_hash;
 typedef std::deque<command_t> 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);