]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands.cpp
EXPERIMENTAL new socket engine code
[user/henk/code/inspircd.git] / src / commands.cpp
index a01f3a844283602db77d8bb51ba045885af87f55..0797c3f19d08edac492e5fbec7b0c525daa93cb8 100644 (file)
@@ -71,14 +71,9 @@ using namespace std;
 #include "dnsqueue.h"
 #include "helperfuncs.h"
 #include "hashcomp.h"
+#include "socketengine.h"
 
-#ifdef USE_KQUEUE
-extern int kq;
-#endif
-
-#ifdef USE_EPOLL
-int ep;
-#endif
+extern SocketEngine* SE;
 
 extern int MODCOUNT;
 extern std::vector<Module*> modules;
@@ -824,61 +819,72 @@ void handle_time(char **parameters, int pcnt, userrec *user)
 void handle_whois(char **parameters, int pcnt, userrec *user)
 {
        userrec *dest;
-
-       if (loop_call(handle_whois,parameters,pcnt,user,0,pcnt-1,0))
-               return;
+        if (loop_call(handle_whois,parameters,pcnt,user,0,pcnt-1,0))
+                return;
        dest = Find(parameters[0]);
        if (dest)
        {
-               // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER
-               if (dest->registered == 7)
+               do_whois(user,dest,0,0,parameters[0]);
+       }
+        else
+        {
+                /* no such nick/channel */
+                WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
+                WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
+       }
+}
+
+void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick)
+{
+       // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER
+       if (dest->registered == 7)
+       {
+               WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname);
+               if ((user == dest) || (strchr(user->modes,'o')))
                {
-                       WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname);
-                       if ((user == dest) || (strchr(user->modes,'o')))
-                       {
-                               WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, dest->ip);
-                       }
-                       char* cl = chlist(dest,user);
-                       if (*cl)
-                       {
-                               WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl);
-                       }
-                       WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str());
-                       if (*dest->awaymsg)
+                       WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, dest->ip);
+               }
+               char* cl = chlist(dest,user);
+               if (*cl)
+               {
+                       WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl);
+               }
+               WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str());
+               if (*dest->awaymsg)
+               {
+                       WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg);
+               }
+               if (strchr(dest->modes,'o'))
+               {
+                       if (*dest->oper)
                        {
-                               WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg);
+                               WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick, (strchr("aeiou",dest->oper[0]) ? "an" : "a"),dest->oper, Network);
                        }
-                       if (strchr(dest->modes,'o'))
+                       else
                        {
-                               if (*dest->oper)
-                               {
-                                       WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick, (strchr("aeiou",dest->oper[0]) ? "an" : "a"),dest->oper, Network);
-                               }
-                               else
-                               {
-                                       WriteServ(user->fd,"313 %s %s :is opered but has an unknown type",user->nick, dest->nick);
-                               }
+                               WriteServ(user->fd,"313 %s %s :is opered but has an unknown type",user->nick, dest->nick);
                        }
+               }
+               if ((!signon) && (!idle))
+               {
                        FOREACH_MOD OnWhois(user,dest);
-                       if (!strcasecmp(user->server,dest->server))
-                       {
-                               // idle time and signon line can only be sent if youre on the same server (according to RFC)
-                               WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon);
-                       }
-                       
-                       WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick);
+               }
+               if (!strcasecmp(user->server,dest->server))
+               {
+                       // idle time and signon line can only be sent if youre on the same server (according to RFC)
+                       WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon);
                }
                else
                {
-                       WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
-                       WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
+                       if ((idle) || (signon))
+                               WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, idle, signon);
                }
+               WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick);
        }
        else
        {
-               /* no such nick/channel */
-               WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
-               WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
+               WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, nick);
+               WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, nick);
        }
 }
 
@@ -936,25 +942,7 @@ void handle_quit(char **parameters, int pcnt, userrec *user)
        /* push the socket on a stack of sockets due to be closed at the next opportunity */
        if (user->fd > -1)
        {
-#ifdef USE_KQUEUE
-                struct kevent ke;
-                EV_SET(&ke, user->fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
-                int i = kevent(kq, &ke, 1, 0, 0, NULL);
-                if (i == -1)
-                {
-                        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
+               SE->DelFd(user->fd);
                user->CloseSocket();
        }