+ 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;