]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands.cpp
Services speedups for stupid buffered i/o uplinks
[user/henk/code/inspircd.git] / src / commands.cpp
index dc757c80328d8e8acf3bb2fa590a0d582dcb585a..98a5809f64efd3cae267e42e2838b5f973564a4f 100644 (file)
@@ -93,7 +93,6 @@ extern bool nofork;
 
 extern time_t TIME;
 
-extern std::vector<int> fd_reap;
 extern std::vector<std::string> module_names;
 
 extern char MyExecutable[1024];
@@ -159,6 +158,8 @@ struct StrHashComp
                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);
        }
 
@@ -336,16 +337,16 @@ void handle_restart(char **parameters, int pcnt, userrec *user)
                sleep(1);
                for (int i = 0; i < 65536; i++)
                {
-                       int on = 0;
+                       int on = 1;
                        struct linger linger = { 0 };
                        setsockopt(i, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));
                        linger.l_onoff = 1;
-                       linger.l_linger = 0;
+                       linger.l_linger = 1;
                        setsockopt(i, SOL_SOCKET, SO_LINGER, (const char*)&linger,sizeof(linger));
                        Blocking(i);
                        close(i);
                }
-               sleep(5);
+               sleep(2);
                
                execv(MyExecutable,argv);
 
@@ -429,6 +430,7 @@ void handle_pass(char **parameters, int pcnt, userrec *user)
                WriteServ(user->fd,"462 %s :You may not reregister",user->nick);
                return;
        }
+       strlcpy(user->password,parameters[0],MAXBUF);
        if (!strcasecmp(parameters[0],Passwd(user)))
        {
                user->haspassed = true;
@@ -542,14 +544,22 @@ void handle_topic(char **parameters, int pcnt, userrec *user)
                                        WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel", user->nick, Ptr->name);
                                        return;
                                }
-                               
+
                                char topic[MAXBUF];
                                strlcpy(topic,parameters[1],MAXBUF);
                                if (strlen(topic)>MAXTOPIC)
                                {
                                        topic[MAXTOPIC-1] = '\0';
                                }
-                                       
+
+                                if (!strcasecmp(user->server,ServerName))
+                                {
+                                        int MOD_RESULT = 0;
+                                        FOREACH_RESULT(OnLocalTopicChange(user,Ptr,topic));
+                                        if (MOD_RESULT)
+                                                return;
+                                }
+
                                strlcpy(Ptr->topic,topic,MAXBUF);
                                strlcpy(Ptr->setby,user->nick,NICKMAX);
                                Ptr->topicset = TIME;
@@ -773,9 +783,39 @@ void handle_server(char **parameters, int pcnt, userrec *user)
 
 void handle_info(char **parameters, int pcnt, userrec *user)
 {
-       WriteServ(user->fd,"371 %s :The Inspire IRCd Project Has been brought to you by the following people..",user->nick);
-       WriteServ(user->fd,"371 %s :Craig Edwards, Craig McLure, and Others..",user->nick);
-       WriteServ(user->fd,"371 %s :Will finish this later when i can be arsed :p",user->nick);
+       WriteServ(user->fd,"371 %s :. o O (The Inspire Internet Relay Chat Server) O o .",user->nick);
+        WriteServ(user->fd,"371 %s : ",user->nick);
+        WriteServ(user->fd,"371 %s :Core developers: Craig Edwards (Brain)",user->nick);
+        WriteServ(user->fd,"371 %s :                 Craig McLure",user->nick);
+        WriteServ(user->fd,"371 %s : ",user->nick);
+        WriteServ(user->fd,"371 %s :Contributors:    typobox43",user->nick);
+        WriteServ(user->fd,"371 %s :                 w00t",user->nick);
+        WriteServ(user->fd,"371 %s :                 Om",user->nick);
+        WriteServ(user->fd,"371 %s :                 Jazza",user->nick);
+        WriteServ(user->fd,"371 %s : ",user->nick);
+        WriteServ(user->fd,"371 %s :Testers:         CC",user->nick);
+        WriteServ(user->fd,"371 %s :                 Piggles",user->nick);
+        WriteServ(user->fd,"371 %s :                 Foamy",user->nick);
+        WriteServ(user->fd,"371 %s :                 Hart",user->nick);
+        WriteServ(user->fd,"371 %s :                 RageD",user->nick);
+        WriteServ(user->fd,"371 %s :                 [ed]",user->nick);
+        WriteServ(user->fd,"371 %s :                 Azhrarn",user->nick);
+        WriteServ(user->fd,"371 %s :                 nenolod",user->nick);
+        WriteServ(user->fd,"371 %s :                 luigiman",user->nick);
+        WriteServ(user->fd,"371 %s :                 Chu",user->nick);
+        WriteServ(user->fd,"371 %s :                 aquanight",user->nick);
+        WriteServ(user->fd,"371 %s :                 xptek",user->nick);
+        WriteServ(user->fd,"371 %s :                 Grantlinks",user->nick);
+        WriteServ(user->fd,"371 %s :                 Rob",user->nick);
+        WriteServ(user->fd,"371 %s :                 angelic",user->nick);
+        WriteServ(user->fd,"371 %s :                 Jason",user->nick);
+        WriteServ(user->fd,"371 %s : ",user->nick);
+        WriteServ(user->fd,"371 %s :Thanks to irc-junkie and searchirc",user->nick);
+        WriteServ(user->fd,"371 %s :for the nice comments and the help",user->nick);
+        WriteServ(user->fd,"371 %s :you gave us in attracting users to",user->nick);
+        WriteServ(user->fd,"371 %s :this software.",user->nick);
+        WriteServ(user->fd,"371 %s : ",user->nick);
+        WriteServ(user->fd,"371 %s :Best experienced with: An IRC client.",user->nick);
        FOREACH_MOD OnInfo(user);
        WriteServ(user->fd,"374 %s :End of /INFO list",user->nick);
 }
@@ -887,8 +927,14 @@ void handle_quit(char **parameters, int pcnt, userrec *user)
                AddWhoWas(user);
        }
 
+       FOREACH_MOD OnUserDisconnect(user);
+
        /* push the socket on a stack of sockets due to be closed at the next opportunity */
-       fd_reap.push_back(user->fd);
+       if (user->fd > -1)
+       {
+               shutdown(user->fd,2);
+               close(user->fd);
+       }
        
        if (iter != clientlist.end())
        {
@@ -1100,7 +1146,6 @@ void handle_user(char **parameters, int pcnt, userrec *user)
                        WriteServ(user->fd,"461 %s USER :Not enough parameters",user->nick);
                }
                else {
-                       WriteServ(user->fd,"NOTICE Auth :No ident response, ident prefixed with ~");
                        strcpy(user->ident,"~"); /* we arent checking ident... but these days why bother anyway? */
                        strlcat(user->ident,parameters[0],IDENTMAX);
                        strlcpy(user->fullname,parameters[3],128);
@@ -1116,6 +1161,7 @@ void handle_user(char **parameters, int pcnt, userrec *user)
        if (user->registered == 3)
        {
                /* user is registered now, bit 0 = USER command, bit 1 = sent a NICK command */
+               FOREACH_MOD OnUserRegister(user);
                ConnectUser(user);
        }
 }
@@ -1271,6 +1317,8 @@ void handle_stats(char **parameters, int pcnt, userrec *user)
        }
 
 
+       FOREACH_MOD OnStats(*parameters[0]);
+
        if (!strcasecmp(parameters[0],"c"))
        {
                for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
@@ -1448,7 +1496,7 @@ void handle_connect(char **parameters, int pcnt, userrec *user)
        char Link_Pass[1024];
        int LinkPort;
        bool found = false;
-       
+
        for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
        {
                if (!found)
@@ -1557,7 +1605,16 @@ bool is_uline(const char* server)
        }
        return false;
 }
-
+int operstrcmp(char* data,char* input)
+{
+       int MOD_RESULT = 0;
+       FOREACH_RESULT(OnOperCompare(data,input))
+       if (MOD_RESULT == 1)
+               return 0;
+       if (MOD_RESULT == -1)
+               return 1;
+       return strcmp(data,input);
+}
 
 void handle_oper(char **parameters, int pcnt, userrec *user)
 {
@@ -1580,7 +1637,7 @@ void handle_oper(char **parameters, int pcnt, userrec *user)
                ConfValue("oper","password",i,Password,&config_f);
                ConfValue("oper","type",i,OperType,&config_f);
                ConfValue("oper","host",i,HostName,&config_f);
-               if ((!strcmp(LoginName,parameters[0])) && (!strcmp(Password,parameters[1])) && (match(TheHost,HostName)))
+               if ((!strcmp(LoginName,parameters[0])) && (!operstrcmp(Password,parameters[1])) && (match(TheHost,HostName)))
                {
                        fail2 = true;
                        for (j =0; j < ConfValueEnum("type",&config_f); j++)
@@ -1738,6 +1795,7 @@ void handle_nick(char **parameters, int pcnt, userrec *user)
        if (user->registered == 3)
        {
                /* user is registered now, bit 0 = USER command, bit 1 = sent a NICK command */
+               FOREACH_MOD OnUserRegister(user);
                ConnectUser(user);
        }
        if (user->registered == 7)
@@ -1924,14 +1982,28 @@ void handle_m(char token,char* params,serverrec* source,serverrec* reply, char*
 
 void handle_L(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host)
 {
-       char* nick = strtok(params," ");
-       char* channel = strtok(NULL," :");
-       char* reason = strtok(NULL,"\r\n");
+       char* nick = NULL;
+       char* channel = NULL;
+       char* reason = NULL;
+       log(DEBUG,"L TOKEN PARS: '%s'",params);
+       if (strstr(params,":#"))
+       {
+               nick = strtok(params," ");
+               channel = strtok(NULL,"\r\n");
+               channel++;
+               reason = "";
+       }
+       else
+        {
+                nick = strtok(params," ");
+                channel = strtok(NULL," :");
+                reason = strtok(NULL,"\r\n");
+                reason++;
+        }
        userrec* user = Find(nick);
-       reason++;
-       if (user)
+       if ((user) && (channel) && (reason))
        {
-               if (strcmp(reason,""))
+               if ((!reason) && (*reason != '\0'))
                {
                        del_channel(user,channel,reason,true);
                }
@@ -2493,6 +2565,7 @@ void handle_pipe(char token,char* params,serverrec* source,serverrec* reply, cha
 void process_restricted_commands(char token,char* params,serverrec* source,serverrec* reply, char* tcp_host,char* ipaddr,int port)
 {
        char buffer[MAXBUF];
+       int MOD_RESULT = 0;
 
        switch(token)
        {
@@ -2710,7 +2783,33 @@ void process_restricted_commands(char token,char* params,serverrec* source,serve
                break;
                // anything else
                default:
-                       WriteOpers("WARNING! Unknown datagram type '%c'",token);
+                       MOD_RESULT = 0;
+                       string_list s;
+                       char* data = strtok(params," ");
+                       while (data)
+                       {
+                               if (*data == ':')
+                               {
+                                       // the last item is a special case
+                                       data++;
+                                       char datalast[MAXBUF];
+                                       strlcpy(datalast,data,MAXBUF);
+                                       data = strtok(NULL," ");
+                                       while (data)
+                                       {
+                                               strlcpy(datalast," ",MAXBUF);
+                                               strlcpy(datalast,data,MAXBUF);
+                                               data = strtok(NULL," ");
+                                       }
+                                       s.push_back(data);
+                                       break;
+                               }
+                               s.push_back(data);
+                               data = strtok(NULL," ");
+                       }
+                       FOREACH_RESULT(OnMeshToken(token,s,source,reply,tcp_host,ipaddr,port));
+                       if (!MOD_RESULT)
+                               WriteOpers("WARNING! Unknown datagram type '%c'",token);
                break;
        }
 }
@@ -2726,9 +2825,15 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
        }
 
        char response[10240];
+       char old2[MAXBUF];
        char token = udp_msg[0];
        char* old = udp_msg;
 
+       if ((token != ':') && (strlen(udp_msg)>1) && (udp_msg[1] != ' '))
+       {
+               WriteOpers("*** Discarded %d chars illegal data from %s",strlen(udp_msg),tcp_host);
+       }
+
        if (token == ':') // leading :servername or details - strip them off (services does this, sucky)
        {
                char* src = udp_msg+1;
@@ -2838,7 +2943,6 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
                
        }
 
-
        char* params = udp_msg + 2;
        char finalparam[1024];
        strcpy(finalparam," :xxxx");
@@ -2998,7 +3102,7 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
                char Link_Pass[1024];
                char Link_SendPass[1024];
                int LinkPort = 0;
-               
+
                // search for a corresponding <link> block in the config files
                for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
                {
@@ -3066,6 +3170,26 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
                int LinkPort = 0;
 
                log(DEBUG,"U-token linked server detected.");
+
+               
+                for (int j = 0; j < 32; j++)
+                {
+                        if (me[j] != NULL)
+                        {
+                                for (int k = 0; k < me[j]->connectors.size(); k++)
+                                {
+                                        if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),servername))
+                                        {
+                                               char buffer[MAXBUF];
+                                               sprintf(buffer,"E :Access is denied (Server exists in the mesh)");
+                                               serv->SendPacket(buffer,tcp_host);
+                                               WriteOpers("CONNECT from %s denied, \"%s\" already exists!",tcp_host,servername);
+                                               RemoveServer(tcp_host);
+                                               return;
+                                       }
+                               }
+                       }
+               }
                
                // search for a corresponding <link> block in the config files
                for (int i = 0; i < ConfValueEnum("link",&config_f); i++)
@@ -3096,6 +3220,8 @@ void handle_link_packet(char* udp_msg, char* tcp_host, serverrec *serv)
                                                                me[j]->connectors[k].SetState(STATE_SERVICES);
                                                                sprintf(buffer,"X 0");
                                                                serv->SendPacket(buffer,servername);
+                                                               sprintf(buffer,"s %s %s %lu :%s",ServerName,Link_SendPass,LinkPort,ServerDesc);
+                                                               serv->SendPacket(buffer,servername);
                                                                DoSync(me[j],servername);
                                                                snprintf(buffer,MAXBUF,"H %s",servername);
                                                                NetSendToAllExcept(servername,buffer);