+ else
+ {
+ /* Found something thats not a number, find out how much
+ * it multiplies the built up number by, multiply the total
+ * and reset the built up number.
+ */
+ if (subtotal)
+ total += subtotal * duration_multi[multiplier];
+
+ /* Next subtotal please */
+ subtotal = 0;
+ multiplier = *i;
+ times = 1;
+ }
+ }
+ if (multiplier)
+ {
+ total += subtotal * duration_multi[multiplier];
+ subtotal = 0;
+ }
+ /* Any trailing values built up are treated as raw seconds */
+ return total + subtotal;
+}
+
+bool InspIRCd::ULine(const std::string& sserver)
+{
+ if (sserver.empty())
+ return true;
+
+ return (Config->ulines.find(sserver.c_str()) != Config->ulines.end());
+}
+
+bool InspIRCd::SilentULine(const std::string& sserver)
+{
+ std::map<irc::string,bool>::iterator n = Config->ulines.find(sserver.c_str());
+ if (n != Config->ulines.end())
+ return n->second;
+ else
+ return false;
+}
+
+std::string InspIRCd::TimeString(time_t curtime)
+{
+ return std::string(ctime(&curtime),24);
+}
+
+// You should only pass a single character to this.
+void InspIRCd::AddExtBanChar(char c)
+{
+ std::string &tok = Config->data005;
+ std::string::size_type ebpos = tok.find(" EXTBAN=,");
+
+ if (ebpos == std::string::npos)
+ {
+ tok.append(" EXTBAN=,");
+ tok.push_back(c);
+ }
+ else
+ {
+ ebpos += 9;
+ while (isalpha(tok[ebpos]) && tok[ebpos] < c)
+ ebpos++;
+ tok.insert(ebpos, 1, c);
+ }
+}
+
+std::string InspIRCd::GenRandomStr(int length, bool printable)
+{
+ char* buf = new char[length];
+ GenRandom(buf, length);
+ std::string rv;
+ rv.resize(length);
+ for(int i=0; i < length; i++)
+ rv[i] = printable ? 0x3F + (buf[i] & 0x3F) : buf[i];
+ delete[] buf;
+ return rv;
+}
+
+// NOTE: this has a slight bias for lower values if max is not a power of 2.
+// Don't use it if that matters.
+unsigned long InspIRCd::GenRandomInt(unsigned long max)
+{
+ unsigned long rv;
+ GenRandom((char*)&rv, sizeof(rv));
+ return rv % max;
+}
+
+// This is overridden by a higher-quality algorithm when SSL support is loaded
+void GenRandomHandler::Call(char *output, size_t max)
+{
+ for(unsigned int i=0; i < max; i++)
+#ifdef _WIN32
+ {
+ unsigned int uTemp;
+ if(rand_s(&uTemp) != 0)
+ output[i] = rand();
+ else
+ output[i] = uTemp;