]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/helperfuncs.cpp
Decide that it wasn't quite appropriate :(
[user/henk/code/inspircd.git] / src / helperfuncs.cpp
index e5b1c67735dec9e8c5a17c0aedb244eeff45b188..6b7178e225b9f9b9b25f8bcd54e4cf15801531f5 100644 (file)
@@ -125,7 +125,7 @@ void readfile(file_cache &F, const char* fname)
 
 void Write_NoFormat(int sock, const char *text)
 {
-       if ((sock < 0) || (!text))
+       if ((sock < 0) || (!text) || (sock > MAX_DESCRIPTORS))
                return;
 
        char tb[MAXBUF];
@@ -135,7 +135,14 @@ void Write_NoFormat(int sock, const char *text)
        {
                if (Config->GetIOHook(fd_ref_table[sock]->port))
                {
-                       Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       try
+                       {
+                               Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       }
+                       catch (ModuleException& modexcept)
+                       {
+                               log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                       }
                }
                else
                {
@@ -148,7 +155,7 @@ void Write_NoFormat(int sock, const char *text)
 
 void Write(int sock,char *text, ...)
 {
-        if (sock < 0)
+        if ((sock < 0) || (sock > MAX_DESCRIPTORS))
                 return;
         if (!text)
         {
@@ -166,7 +173,14 @@ void Write(int sock,char *text, ...)
         {
                if (Config->GetIOHook(fd_ref_table[sock]->port))
                {
-                       Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       try
+                       {
+                               Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       }
+                       catch (ModuleException& modexcept)
+                       {
+                               log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                       }                                                               
                }
                else
                {
@@ -179,7 +193,7 @@ void Write(int sock,char *text, ...)
 
 void WriteServ_NoFormat(int sock, const char* text)
 {
-       if ((sock < 0) || (!text))
+       if ((sock < 0) || (!text) || (sock > MAX_DESCRIPTORS))
                return;
        char tb[MAXBUF];
        int bytes = snprintf(tb,MAXBUF,":%s %s\r\n",Config->ServerName,text);
@@ -188,7 +202,14 @@ void WriteServ_NoFormat(int sock, const char* text)
        {
                if (Config->GetIOHook(fd_ref_table[sock]->port))
                {
-                       Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       try
+                       {
+                               Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       }
+                        catch (ModuleException& modexcept)
+                        {
+                                log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                        }
                }
                else
                {
@@ -203,7 +224,7 @@ void WriteServ_NoFormat(int sock, const char* text)
 
 void WriteServ(int sock, char* text, ...)
 {
-        if (sock < 0)
+        if ((sock < 0) || (sock > MAX_DESCRIPTORS))
                 return;
         if (!text)
         {
@@ -221,7 +242,14 @@ void WriteServ(int sock, char* text, ...)
         {
                if (Config->GetIOHook(fd_ref_table[sock]->port))
                {
-                       Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       try
+                       {
+                               Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       }
+                        catch (ModuleException& modexcept)
+                        {
+                                log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                        }
                }
                else
                {
@@ -234,7 +262,7 @@ void WriteServ(int sock, char* text, ...)
 
 void WriteFrom_NoFormat(int sock, userrec *user, const char* text)
 {
-       if ((sock < 0) || (!text) || (!user))
+       if ((sock < 0) || (!text) || (!user) || (sock > MAX_DESCRIPTORS))
                return;
        char tb[MAXBUF];
        int bytes = snprintf(tb,MAXBUF,":%s %s\r\n",user->GetFullHost(),text);
@@ -243,7 +271,14 @@ void WriteFrom_NoFormat(int sock, userrec *user, const char* text)
        {
                if (Config->GetIOHook(fd_ref_table[sock]->port))
                {
-                       Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       try
+                       {
+                               Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       }
+                        catch (ModuleException& modexcept)
+                        {
+                                log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                        }
                }
                else
                {
@@ -258,7 +293,7 @@ void WriteFrom_NoFormat(int sock, userrec *user, const char* text)
 
 void WriteFrom(int sock, userrec *user,char* text, ...)
 {
-        if (sock < 0)
+        if ((sock < 0) || (sock > MAX_DESCRIPTORS))
                 return;
         if ((!text) || (!user))
         {
@@ -276,7 +311,14 @@ void WriteFrom(int sock, userrec *user,char* text, ...)
         {
                if (Config->GetIOHook(fd_ref_table[sock]->port))
                {
-                       Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       try
+                       {
+                               Config->GetIOHook(fd_ref_table[sock]->port)->OnRawSocketWrite(sock,tb,bytes);
+                       }
+                        catch (ModuleException& modexcept)
+                        {
+                                log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                        }
                }
                else
                {
@@ -982,6 +1024,18 @@ userrec* Find(std::string nick)
         return iter->second;
 }
 
+userrec* Find(const char* nick)
+{
+       if (!nick)
+               return NULL;
+       user_hash::iterator iter = clientlist.find(nick);
+       
+       if (iter == clientlist.end())
+               return NULL;
+
+       return iter->second;
+}
+
 /* find a channel record by channel name and return a pointer to it */
 
 chanrec* FindChan(const char* chan)
@@ -1286,7 +1340,10 @@ int usercount_invisible(void)
 
 int usercount_opers(void)
 {
-        return all_opers.size();
+       int c = 0;
+       for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
+               if (*i->second->oper) c++;
+        return c;
 }
 
 int usercount_unknown(void)
@@ -1337,7 +1394,15 @@ void ShowMOTD(userrec *user)
         // only one write operation
        if (Config->GetIOHook(user->port))
        {
-               Config->GetIOHook(user->port)->OnRawSocketWrite(user->fd,(char*)WholeMOTD.c_str(),WholeMOTD.length());
+               try
+               {
+                       Config->GetIOHook(user->port)->OnRawSocketWrite(user->fd,(char*)WholeMOTD.c_str(),WholeMOTD.length());
+               }
+                catch (ModuleException& modexcept)
+                {
+                        log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                }
+
        }
        else
        {
@@ -1462,3 +1527,36 @@ int InsertMode(std::string &output, const char* mode, unsigned short section)
        output.insert(pos, mode);
        return 1;
 }
+
+bool IsValidChannelName(const char *chname)
+{
+               char *c;
+
+               /* check for no name - don't check for !*chname, as if it is empty, it won't be '#'! */
+               if (!chname || *chname != '#')
+               {
+                               return false;
+               }
+
+               c = (char *)chname + 1;
+               while (*c)
+               {
+                               switch (*c)
+                               {
+                                               case ' ':
+                                               case ',':
+                                               case 7:
+                                                               return false;
+                               }
+
+                               c++;
+               }
+               
+               /* too long a name - note funky pointer arithmetic here. */
+               if ((c - chname) > CHANMAX)
+               {
+                               return false;
+               }
+
+               return true;
+}