]> 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 79f1f7c78d96ceefa9b42de25a3e41c4a8ea1222..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];
@@ -431,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;
@@ -927,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())
        {
@@ -1490,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)
@@ -1599,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)
 {
@@ -1622,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++)
@@ -1967,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);
                }
@@ -2796,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;
@@ -2908,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");
@@ -3068,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++)
                {
@@ -3136,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++)
@@ -3166,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);