]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/helperfuncs.cpp
Fix some Windows-related problems.
[user/henk/code/inspircd.git] / src / helperfuncs.cpp
index 63123738ef29ea811ab3556713cb142bd3d1dc76..354d0a112e9b2f4354430cbb78e6b87a881e1f68 100644 (file)
@@ -22,8 +22,6 @@
  */
 
 
-/* $Core */
-
 #ifdef _WIN32
 #define _CRT_RAND_S
 #include <stdlib.h>
@@ -38,7 +36,7 @@ std::string InspIRCd::GetServerDescription(const std::string& servername)
 {
        std::string description;
 
-       FOREACH_MOD(I_OnGetServerDescription,OnGetServerDescription(servername,description));
+       FOREACH_MOD(OnGetServerDescription, (servername,description));
 
        if (!description.empty())
        {
@@ -116,12 +114,6 @@ void InspIRCd::SendError(const std::string &s)
        }
 }
 
-/* return channel count */
-long InspIRCd::ChannelCount()
-{
-       return chanlist->size();
-}
-
 bool InspIRCd::IsValidMask(const std::string &mask)
 {
        const char* dest = mask.c_str();
@@ -345,18 +337,14 @@ void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const std::str
        FIRST_MOD_RESULT(OnWhoisLine, MOD_RESULT, (user, dest, numeric, copy_text));
 
        if (MOD_RESULT != MOD_RES_DENY)
-               user->WriteServ("%d %s", numeric, copy_text.c_str());
+               user->WriteNumeric(numeric, copy_text);
 }
 
 void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-       va_start (argsPtr, format);
-       vsnprintf(textbuffer, MAXBUF, format, argsPtr);
-       va_end(argsPtr);
-
-       this->SendWhoisLine(user, dest, numeric, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, format, format)
+       this->SendWhoisLine(user, dest, numeric, textbuffer);
 }
 
 /** Refactored by Brain, Jun 2009. Much faster with some clever O(1) array
@@ -402,19 +390,36 @@ unsigned long InspIRCd::Duration(const std::string &str)
        return total + subtotal;
 }
 
-const char* InspIRCd::Format(const char* formatString, ...)
+const char* InspIRCd::Format(va_list &vaList, const char* formatString)
 {
        static std::vector<char> formatBuffer(1024);
-       int vsnret = 0;
 
-       va_list vaList;
-       va_start(vaList, formatString);
-       while ((vsnret = vsnprintf(&formatBuffer[0], formatBuffer.size(), formatString, vaList)) < 0 || static_cast<unsigned int>(vsnret) >= formatBuffer.size())
+       while (true)
+       {
+               va_list dst;
+               va_copy(dst, vaList);
+
+               int vsnret = vsnprintf(&formatBuffer[0], formatBuffer.size(), formatString, dst);
+               va_end(dst);
+
+               if (vsnret > 0 && static_cast<unsigned>(vsnret) < formatBuffer.size())
+               {
+                       break;
+               }
+
                formatBuffer.resize(formatBuffer.size() * 2);
-       va_end(vaList);
+       }
+
        return &formatBuffer[0];
 }
 
+const char* InspIRCd::Format(const char* formatString, ...)
+{
+       const char* ret;
+       VAFORMAT(ret, formatString, formatString);
+       return ret;
+}
+
 bool InspIRCd::ULine(const std::string& sserver)
 {
        if (sserver.empty())
@@ -434,7 +439,26 @@ bool InspIRCd::SilentULine(const std::string& sserver)
 
 std::string InspIRCd::TimeString(time_t curtime)
 {
-       return std::string(ctime(&curtime),24);
+#ifdef _WIN32
+       if (curtime < 0)
+               curtime = 0;
+#endif
+
+       struct tm* timeinfo = localtime(&curtime);
+       if (!timeinfo)
+       {
+               curtime = 0;
+               timeinfo = localtime(&curtime);
+       }
+
+       // If the calculated year exceeds four digits or is less than the year 1000,
+       // the behavior of asctime() is undefined
+       if (timeinfo->tm_year + 1900 > 9999)
+               timeinfo->tm_year = 9999 - 1900;
+       else if (timeinfo->tm_year + 1900 < 1000)
+               timeinfo->tm_year = 0;
+
+       return std::string(asctime(timeinfo),24);
 }
 
 std::string InspIRCd::GenRandomStr(int length, bool printable)
@@ -492,7 +516,7 @@ ModResult OnCheckExemptionHandler::Call(User* user, Channel* chan, const std::st
                        minmode = current[pos+1];
        }
 
-       ModeHandler* mh = ServerInstance->Modes->FindMode(minmode, MODETYPE_CHANNEL);
+       PrefixMode* mh = ServerInstance->Modes->FindPrefixMode(minmode);
        if (mh && mypfx >= mh->GetPrefixRank())
                return MOD_RES_ALLOW;
        if (mh || minmode == '*')