diff options
Diffstat (limited to 'src')
47 files changed, 1950 insertions, 3084 deletions
diff --git a/src/actions.cpp b/src/actions.cpp index bff5b36fa..17c0a2898 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -48,18 +48,16 @@ bool bad_password(User *u) * @param reason for the kill * @return void */ -void kill_user(const std::string &source, const std::string &user, const std::string &reason) +void kill_user(const Anope::string &source, const Anope::string &user, const Anope::string &reason) { - char buf[BUFSIZE]; - if (user.empty()) return; - std::string real_source = source.empty() ? Config.ServerName : source; + Anope::string real_source = source.empty() ? Config.ServerName : source; - snprintf(buf, sizeof(buf), "%s (%s)", source.c_str(), reason.c_str()); + Anope::string buf = real_source + " (" + reason + ")"; - ircdproto->SendSVSKill(findbot(source), finduser(user), buf); + ircdproto->SendSVSKill(findbot(source), finduser(user), "%s", buf.c_str()); if (!ircd->quitonkill && finduser(user)) do_kill(user, buf); @@ -73,9 +71,9 @@ void kill_user(const std::string &source, const std::string &user, const std::st * @param nick to remove the ban for * @return void */ -void common_unban(ChannelInfo *ci, const std::string &nick) +void common_unban(ChannelInfo *ci, const Anope::string &nick) { - char *host = NULL; + Anope::string host; uint32 ip = 0; User *u; Entry *ban, *next; @@ -89,18 +87,18 @@ void common_unban(ChannelInfo *ci, const std::string &nick) if (!ci->c->bans || !ci->c->bans->count) return; - if (!u->hostip) + if (u->hostip.empty()) { host = host_resolve(u->host); /* we store the just resolved hostname so we don't * need to do this again */ - if (host) - u->hostip = sstrdup(host); + if (!host.empty()) + u->hostip = host; } else - host = sstrdup(u->hostip); + host = u->hostip; /* Convert the host to an IP.. */ - if (host) + if (!host.empty()) ip = str_is_ip(host); if (ircd->svsmode_unban) @@ -109,12 +107,9 @@ void common_unban(ChannelInfo *ci, const std::string &nick) for (ban = ci->c->bans->entries; ban; ban = next) { next = ban->next; - if (entry_match(ban, u->nick.c_str(), u->GetIdent().c_str(), u->host, ip) || entry_match(ban, u->nick.c_str(), u->GetIdent().c_str(), u->GetDisplayedHost().c_str(), ip)) + if (entry_match(ban, u->nick, u->GetIdent(), u->host, ip) || entry_match(ban, u->nick, u->GetIdent(), u->GetDisplayedHost(), ip)) ci->c->RemoveMode(NULL, CMODE_BAN, ban->mask); } - /* host_resolve() sstrdup us this info so we gotta free it */ - if (host) - delete [] host; } /*************************************************************************/ diff --git a/src/base64.cpp b/src/base64.cpp index 2071ad40a..4f51eb5e8 100644 --- a/src/base64.cpp +++ b/src/base64.cpp @@ -9,31 +9,9 @@ * Based on the original code of Services by Andy Church. */ -/* - This is borrowed from Unreal -*/ - #include "services.h" -static char *int_to_base64(long); -static long base64_to_int(const char *); - -const char *base64enc(long i) -{ - if (i < 0) - return "0"; - return int_to_base64(i); -} - -long base64dec(const char *b64) -{ - if (b64) - return base64_to_int(b64); - else - return 0; -} - -static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const Anope::string Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) @@ -99,223 +77,97 @@ static const char Pad64 = '='; characters followed by one "=" padding character. */ -int b64_encode(const char *src, size_t srclength, char *target, size_t targsize) +void b64_encode(const Anope::string &src, Anope::string &target) { - size_t datalength = 0; + size_t src_pos = 0, src_len = src.length(); unsigned char input[3]; - unsigned char output[4]; - size_t i; - - while (srclength > 2) - { - input[0] = *src++; - input[1] = *src++; - input[2] = *src++; - srclength -= 3; - output[0] = input[0] >> 2; - output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); - output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); - output[3] = input[2] & 0x3f; + target.clear(); - if (datalength + 4 > targsize) - return -1; - target[datalength++] = Base64[output[0]]; - target[datalength++] = Base64[output[1]]; - target[datalength++] = Base64[output[2]]; - target[datalength++] = Base64[output[3]]; + while (src_len - src_pos > 2) + { + input[0] = src[src_pos++]; + input[1] = src[src_pos++]; + input[2] = src[src_pos++]; + + target += Base64[input[0] >> 2]; + target += Base64[((input[0] & 0x03) << 4) + (input[1] >> 4)]; + target += Base64[((input[1] & 0x0f) << 2) + (input[2] >> 6)]; + target += Base64[input[2] & 0x3f]; } - /* Now we worry about padding. */ - if (srclength) + /* Now we worry about padding */ + if (src_pos != src_len) { - /* Get what's left. */ - input[0] = input[1] = input[2] = '\0'; - for (i = 0; i < srclength; ++i) - input[i] = *src++; - - output[0] = input[0] >> 2; - output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); - output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); - - if (datalength + 4 > targsize) - return -1; - target[datalength++] = Base64[output[0]]; - target[datalength++] = Base64[output[1]]; - if (srclength == 1) - target[datalength++] = Pad64; + input[0] = input[1] = input[2] = 0; + for (size_t i = 0; i < src_len - src_pos; ++i) + input[i] = src[src_pos + i]; + + target += Base64[input[0] >> 2]; + target += Base64[((input[0] & 0x03) << 4) + (input[1] >> 4)]; + if (src_pos == src_len - 1) + target += Pad64; else - target[datalength++] = Base64[output[2]]; - target[datalength++] = Pad64; + target += Base64[((input[1] & 0x0f) << 2) + (input[2] >> 6)]; + target += Pad64; } - if (datalength >= targsize) - return -1; - target[datalength] = '\0'; /* Returned value doesn't count \0. */ - return datalength; } /* skips all whitespace anywhere. converts characters, four at a time, starting at (or after) src from base - 64 numbers into three 8 bit bytes in the target area. - it returns the number of data bytes stored at the target, or -1 on error. */ -int b64_decode(const char *src, char *target, size_t targsize) +void b64_decode(const Anope::string &src, Anope::string &target) { - int tarindex, state, ch; - char *pos; + target.clear(); - state = 0; - tarindex = 0; - - while ((ch = *src++) != '\0') + unsigned state = 0; + Anope::string::const_iterator ch = src.begin(), end = src.end(); + for (; ch != end; ++ch) { - if (isspace(ch)) /* Skip whitespace anywhere. */ + if (isspace(*ch)) /* Skip whitespace anywhere */ continue; - if (ch == Pad64) + if (*ch == Pad64) break; - pos = const_cast<char *>(strchr(Base64, ch)); - if (!pos) /* A non-base64 character. */ - return -1; + size_t pos = Base64.find(*ch); + if (pos == Anope::string::npos) /* A non-base64 character */ + return; switch (state) { case 0: - if (target) - { - if (static_cast<size_t>(tarindex) >= targsize) - return -1; - target[tarindex] = (pos - Base64) << 2; - } + target += pos << 2; state = 1; break; case 1: - if (target) - { - if (static_cast<size_t>(tarindex) + 1 >= targsize) - return -1; - target[tarindex] |= (pos - Base64) >> 4; - target[tarindex + 1] = ((pos - Base64) & 0x0f) << 4; - } - ++tarindex; + target[target.length() - 1] |= pos >> 4; + target += (pos & 0x0f) << 4; state = 2; break; case 2: - if (target) - { - if (static_cast<size_t>(tarindex) + 1 >= targsize) - return -1; - target[tarindex] |= (pos - Base64) >> 2; - target[tarindex + 1] = ((pos - Base64) & 0x03) << 6; - } - ++tarindex; + target[target.length() - 1] |= pos >> 2; + target += (pos & 0x03) << 6; state = 3; break; case 3: - if (target) - { - if (static_cast<size_t>(tarindex) >= targsize) - return -1; - target[tarindex] |= (pos - Base64); - } - ++tarindex; + target[target.length() - 1] |= pos; state = 0; - break; - default: - abort(); } } - - /* - * We are done decoding Base-64 chars. Let's see if we ended - * on a byte boundary, and/or with erroneous trailing characters. - */ - - if (ch == Pad64) /* We got a pad char. */ - { - ch = *src++; /* Skip it, get next. */ - switch (state) - { - case 0: /* Invalid = in first position */ - case 1: /* Invalid = in second position */ - return -1; - - case 2: /* Valid, means one byte of info */ - /* Skip any number of spaces. */ - for (; ch != '\0'; ch = *src++) - if (!isspace(ch)) - break; - /* Make sure there is another trailing = sign. */ - if (ch != Pad64) - return -1; - ch = *src++; /* Skip the = */ - /* Fall through to "single trailing =" case. */ - /* FALLTHROUGH */ - - case 3: /* Valid, means two bytes of info */ - /* - * We know this char is an =. Is there anything but - * whitespace after it? - */ - for (; ch != '\0'; ch = *src++) - if (!isspace(ch)) - return -1; - - /* - * Now make sure for cases 2 and 3 that the "extra" - * bits that slopped past the last full byte were - * zeros. If we don't check them, they become a - * subliminal channel. - */ - if (target && target[tarindex]) - return -1; - } - } - else - { - /* - * We ended by seeing the end of the string. Make sure we - * have no partial bytes lying around. - */ - if (state) - return -1; - } - - return tarindex; + if (!target[target.length() - 1]) + target.erase(target.length() - 1); } -const char *encode_ip(unsigned char *ip) +int decode_ip(const Anope::string &buf) { - static char buf[25]; - unsigned char *cp; - struct in_addr ia; /* For IPv4 */ - char *s_ip; /* Signed ip string */ - - if (!ip) - return "*"; + int len = buf.length(); + Anope::string targ; - if (strchr(reinterpret_cast<char *>(ip), ':')) - return NULL; - else - { - s_ip = str_signed(ip); - ia.s_addr = inet_addr(s_ip); - cp = reinterpret_cast<unsigned char *>(ia.s_addr); - b64_encode(reinterpret_cast<const char *>(&cp), sizeof(struct in_addr), buf, 25); - } - return buf; -} - -int decode_ip(const char *buf) -{ - int len = strlen(buf); - char targ[25]; - struct in_addr ia; - - b64_decode(buf, targ, 25); - ia = *reinterpret_cast<struct in_addr *>(targ); + b64_decode(buf, targ); + const struct in_addr ia = *reinterpret_cast<const struct in_addr *>(targ.c_str()); if (len == 24) /* IPv6 */ return 0; else if (len == 8) /* IPv4 */ @@ -323,91 +175,3 @@ int decode_ip(const char *buf) else /* Error?? */ return 0; } - -/* ':' and '#' and '&' and '+' and '@' must never be in this table. */ -/* these tables must NEVER CHANGE! >) */ -char int6_to_base64_map[] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', - 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V', - 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', - 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '{', '}' -}; - -char base64_to_int6_map[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, 63, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -}; - -static char *int_to_base64(long val) -{ - /* 32/6 == max 6 bytes for representation, - * +1 for the null, +1 for byte boundaries - */ - static char base64buf[8]; - long i = 7; - - base64buf[i] = '\0'; - - /* Temporary debugging code.. remove before 2038 ;p. - * This might happen in case of 64bit longs (opteron/ia64), - * if the value is then too large it can easily lead to - * a buffer underflow and thus to a crash. -- Syzop - */ - if (val > 2147483647L) - abort(); - - do - { - base64buf[--i] = int6_to_base64_map[val & 63]; - } while (val >>= 6); - - return base64buf + i; -} - -static long base64_to_int(const char *b64) -{ - int v = base64_to_int6_map[static_cast<const unsigned char>(*b64++)]; - - if (!b64) - return 0; - - while (*b64) - { - v <<= 6; - v += base64_to_int6_map[static_cast<const unsigned char>(*b64++)]; - } - - return v; -} - -long base64dects(const char *ts) -{ - if (!ts) - return 0; - - char *token = myStrGetToken(ts, '!', 1); - if (!token) - return strtoul(ts, NULL, 10); - - long value = base64dec(token); - delete [] token; - return value; -} diff --git a/src/bots.cpp b/src/bots.cpp index 4114d4317..88b981dcc 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -20,32 +20,31 @@ BotInfo *MemoServ = NULL; BotInfo *NickServ = NULL; BotInfo *OperServ = NULL; -BotInfo::BotInfo(const std::string &nnick, const std::string &nuser, const std::string &nhost, const std::string &nreal) : User(nnick, ts6_uid_retrieve()) +BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal) : User(nnick, ts6_uid_retrieve()) { this->ident = nuser; - this->host = sstrdup(nhost.c_str()); - this->realname = sstrdup(nreal.c_str()); + this->host = nhost; + this->realname = nreal; this->server = Me; this->lastmsg = this->created = time(NULL); - ci::string ci_nick(nnick.c_str()); - if (Config.s_ChanServ && ci_nick == Config.s_ChanServ) + if (!Config.s_ChanServ.empty() && nnick.equals_ci(Config.s_ChanServ)) ChanServ = this; - else if (Config.s_BotServ && ci_nick == Config.s_BotServ) + else if (!Config.s_BotServ.empty() && nnick.equals_ci(Config.s_BotServ)) BotServ = this; - else if (Config.s_HostServ && ci_nick == Config.s_HostServ) + else if (!Config.s_HostServ.empty() && nnick.equals_ci(Config.s_HostServ)) HostServ = this; - else if (Config.s_OperServ && ci_nick == Config.s_OperServ) + else if (!Config.s_OperServ.empty() && nnick.equals_ci(Config.s_OperServ)) OperServ = this; - else if (Config.s_MemoServ && ci_nick == Config.s_MemoServ) + else if (!Config.s_MemoServ.empty() && nnick.equals_ci(Config.s_MemoServ)) MemoServ = this; - else if (Config.s_NickServ && ci_nick == Config.s_NickServ) + else if (!Config.s_NickServ.empty() && nnick.equals_ci(Config.s_NickServ)) NickServ = this; - else if (Config.s_GlobalNoticer && ci_nick == Config.s_GlobalNoticer) + else if (!Config.s_GlobalNoticer.empty() && nnick.equals_ci(Config.s_GlobalNoticer)) Global = this; - BotListByNick[this->nick.c_str()] = this; + BotListByNick[this->nick] = this; if (!this->uid.empty()) BotListByUID[this->uid] = this; @@ -53,7 +52,7 @@ BotInfo::BotInfo(const std::string &nnick, const std::string &nuser, const std:: if (Me && Me->GetUplink() && Me->GetUplink()->IsSynced()) { ircdproto->SendClientIntroduction(this->nick, this->GetIdent(), this->host, this->realname, ircd->pseudoclient_mode, this->uid); - XLine x(this->nick.c_str(), "Reserved for services"); + XLine x(this->nick, "Reserved for services"); ircdproto->SendSQLine(&x); } } @@ -68,21 +67,21 @@ BotInfo::~BotInfo() ci->bi = NULL; } - BotListByNick.erase(this->nick.c_str()); + BotListByNick.erase(this->nick); if (!this->uid.empty()) BotListByUID.erase(this->uid); } -void BotInfo::SetNewNick(const std::string &newnick) +void BotInfo::SetNewNick(const Anope::string &newnick) { - UserListByNick.erase(this->nick.c_str()); - BotListByNick.erase(this->nick.c_str()); + UserListByNick.erase(this->nick); + BotListByNick.erase(this->nick); this->nick = newnick; - UserListByNick[this->nick.c_str()] = this; - BotListByNick[this->nick.c_str()] = this; + UserListByNick[this->nick] = this; + BotListByNick[this->nick] = this; } void BotInfo::RejoinAll() @@ -142,14 +141,14 @@ void BotInfo::Join(Channel *c) { next = ban->next; - if (entry_match(ban, this->nick.c_str(), this->GetIdent().c_str(), this->host, 0)) + if (entry_match(ban, this->nick, this->GetIdent(), this->host, 0)) c->RemoveMode(NULL, CMODE_BAN, ban->mask); } - std::string Limit; + Anope::string Limit; int limit = 0; - if (c->GetParam(CMODE_LIMIT, Limit)) - limit = atoi(Limit.c_str()); + if (c->GetParam(CMODE_LIMIT, Limit) && Limit.is_number_only()) + limit = convertTo<int>(Limit); /* Should we be invited? */ if (c->HasMode(CMODE_INVITE) || (limit && c->users.size() >= limit)) @@ -157,21 +156,21 @@ void BotInfo::Join(Channel *c) } } - ircdproto->SendJoin(this, c->name.c_str(), c->creation_time); + ircdproto->SendJoin(this, c->name, c->creation_time); for (std::list<ChannelModeStatus *>::iterator it = BotModes.begin(), it_end = BotModes.end(); it != it_end; ++it) c->SetMode(this, *it, this->nick, false); c->JoinUser(this); FOREACH_MOD(I_OnBotJoin, OnBotJoin(c->ci, this)); } -void BotInfo::Join(const std::string &chname) +void BotInfo::Join(const Anope::string &chname) { Channel *c = findchan(chname); return this->Join(c ? c : new Channel(chname)); } -void BotInfo::Part(Channel *c, const std::string &reason) +void BotInfo::Part(Channel *c, const Anope::string &reason) { - ircdproto->SendPart(this, c, !reason.empty() ? reason.c_str() : ""); + ircdproto->SendPart(this, c, "%s", !reason.empty() ? reason.c_str() : ""); c->DeleteUser(this); } diff --git a/src/botserv.cpp b/src/botserv.cpp index 85f559f24..ae62e7e69 100644 --- a/src/botserv.cpp +++ b/src/botserv.cpp @@ -42,12 +42,12 @@ void get_botserv_stats(long *nrec, long *memuse) { BotInfo *bi = it->second; - count++; + ++count; mem += sizeof(*bi); - mem += bi->nick.size() + 1; - mem += bi->GetIdent().size() + 1; - mem += strlen(bi->host) + 1; - mem += strlen(bi->realname) + 1; + mem += bi->nick.length() + 1; + mem += bi->GetIdent().length() + 1; + mem += bi->host.length() + 1; + mem += bi->realname.length() + 1; } *nrec = count; @@ -61,7 +61,7 @@ void get_botserv_stats(long *nrec, long *memuse) void bs_init() { - if (Config.s_BotServ) + if (!Config.s_BotServ.empty()) moduleAddBotServCmds(); } @@ -69,17 +69,17 @@ void bs_init() /* Main BotServ routine. */ -void botserv(User *u, BotInfo *bi, const std::string &buf) +void botserv(User *u, BotInfo *bi, const Anope::string &buf) { if (!u || !bi || buf.empty()) return; - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_ci("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string command = buf; + Anope::string command = buf; command.erase(command.begin()); command.erase(command.end()); - ircdproto->SendCTCP(bi, u->nick.c_str(), "%s", command.c_str()); + ircdproto->SendCTCP(bi, u->nick, "%s", command.c_str()); } else mod_run_cmd(bi, u, buf); @@ -91,27 +91,27 @@ void botserv(User *u, BotInfo *bi, const std::string &buf) * bot is on. */ -void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) +void botchanmsgs(User *u, ChannelInfo *ci, const Anope::string &buf) { if (!u || !ci || !ci->c || buf.empty()) return; /* Answer to ping if needed */ - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_ci("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string ctcp = buf; + Anope::string ctcp = buf; ctcp.erase(ctcp.begin()); ctcp.erase(ctcp.end()); - ircdproto->SendCTCP(ci->bi, u->nick.c_str(), "%s", ctcp.c_str()); + ircdproto->SendCTCP(ci->bi, u->nick, "%s", ctcp.c_str()); } bool was_action = false; - std::string realbuf = buf; + Anope::string realbuf = buf; /* If it's a /me, cut the CTCP part because the ACTION will cause * problems with the caps or badwords kicker */ - if (realbuf.find("\1ACTION ", 0, 8) && realbuf[buf.length() - 1] == '\1') + if (!realbuf.substr(0, 8).equals_ci("\1ACTION ") && realbuf[buf.length() - 1] == '\1') { realbuf.erase(0, 8); realbuf.erase(realbuf.end()); @@ -141,7 +141,7 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) if (!check_access(u, ci, CA_NOKICK) && Allow) { /* Bolds kicker */ - if (ci->botflags.HasFlag(BS_KICK_BOLDS) && realbuf.find_first_of(2) != std::string::npos) + if (ci->botflags.HasFlag(BS_KICK_BOLDS) && realbuf.find(2) != Anope::string::npos) { check_ban(ci, u, TTB_BOLDS); bot_kick(ci, u, BOT_REASON_BOLD); @@ -149,7 +149,7 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) } /* Color kicker */ - if (ci->botflags.HasFlag(BS_KICK_COLORS) && realbuf.find_first_of(3) != std::string::npos) + if (ci->botflags.HasFlag(BS_KICK_COLORS) && realbuf.find(3) != Anope::string::npos) { check_ban(ci, u, TTB_COLORS); bot_kick(ci, u, BOT_REASON_COLOR); @@ -157,7 +157,7 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) } /* Reverses kicker */ - if (ci->botflags.HasFlag(BS_KICK_REVERSES) && realbuf.find_first_of(22) != std::string::npos) + if (ci->botflags.HasFlag(BS_KICK_REVERSES) && realbuf.find(22) != Anope::string::npos) { check_ban(ci, u, TTB_REVERSES); bot_kick(ci, u, BOT_REASON_REVERSE); @@ -165,7 +165,7 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) } /* Underlines kicker */ - if (ci->botflags.HasFlag(BS_KICK_UNDERLINES) && realbuf.find_first_of(31) != std::string::npos) + if (ci->botflags.HasFlag(BS_KICK_UNDERLINES) && realbuf.find(31) != Anope::string::npos) { check_ban(ci, u, TTB_UNDERLINES); bot_kick(ci, u, BOT_REASON_UNDERLINE); @@ -204,39 +204,32 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) bool mustkick = false; /* Normalize the buffer */ - const char *nbuf = normalizeBuffer(realbuf.c_str()); + Anope::string nbuf = normalizeBuffer(realbuf); for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i) { BadWord *bw = ci->GetBadWord(i); - if (bw->type == BW_ANY && ((Config.BSCaseSensitive && strstr(nbuf, bw->word.c_str())) || (!Config.BSCaseSensitive && stristr(nbuf, bw->word.c_str())))) + if (bw->type == BW_ANY && ((Config.BSCaseSensitive && nbuf.find(bw->word) != Anope::string::npos) || (!Config.BSCaseSensitive && nbuf.find_ci(bw->word) != Anope::string::npos))) mustkick = true; else if (bw->type == BW_SINGLE) { size_t len = bw->word.length(); - if ((Config.BSCaseSensitive && nbuf == bw->word) || (!Config.BSCaseSensitive && (!stricmp(nbuf, bw->word.c_str())))) + if ((Config.BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config.BSCaseSensitive && bw->word.equals_ci(nbuf))) mustkick = true; - else if ((strchr(nbuf, ' ') == nbuf + len) && ((Config.BSCaseSensitive && nbuf == bw->word) || (!Config.BSCaseSensitive && (stristr(nbuf, bw->word.c_str()) == nbuf)))) + else if (nbuf.find(' ') == len && ((Config.BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config.BSCaseSensitive && bw->word.equals_ci(nbuf)))) mustkick = true; else { - if ((strrchr(nbuf, ' ') == nbuf + strlen(nbuf) - len - 1) && ((Config.BSCaseSensitive && (strstr(nbuf, bw->word.c_str()) == nbuf + strlen(nbuf) - len)) || (!Config.BSCaseSensitive && (stristr(nbuf, bw->word.c_str()) == nbuf + strlen(nbuf) - len)))) + if (nbuf.rfind(' ') == nbuf.length() - len - 1 && ((Config.BSCaseSensitive && nbuf.find(bw->word) == nbuf.length() - len) || (!Config.BSCaseSensitive && nbuf.find_ci(bw->word) == nbuf.length() - len))) mustkick = true; else { - char *wordbuf = new char[len + 3]; + Anope::string wordbuf = " " + bw->word + " "; - wordbuf[0] = ' '; - wordbuf[len + 1] = ' '; - wordbuf[len + 2] = '\0'; - memcpy(wordbuf + 1, bw->word.c_str(), len); - - if ((Config.BSCaseSensitive && strstr(nbuf, wordbuf)) || (!Config.BSCaseSensitive && stristr(nbuf, wordbuf))) + if ((Config.BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config.BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos)) mustkick = true; - - delete [] wordbuf; } } } @@ -244,40 +237,28 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) { size_t len = bw->word.length(); - if ((Config.BSCaseSensitive && !strncmp(nbuf, bw->word.c_str(), len)) || (!Config.BSCaseSensitive && !strnicmp(nbuf, bw->word.c_str(), len))) + if ((Config.BSCaseSensitive && nbuf.substr(0, len).equals_cs(bw->word)) || (!Config.BSCaseSensitive && nbuf.substr(0, len).equals_ci(bw->word))) mustkick = true; else { - char *wordbuf = new char[len + 2]; - - memcpy(wordbuf + 1, bw->word.c_str(), len); - wordbuf[0] = ' '; - wordbuf[len + 1] = '\0'; + Anope::string wordbuf = " " + bw->word; - if ((Config.BSCaseSensitive && strstr(nbuf, wordbuf)) || (!Config.BSCaseSensitive && stristr(nbuf, wordbuf))) + if ((Config.BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config.BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos)) mustkick = true; - - delete [] wordbuf; } } else if (bw->type == BW_END) { size_t len = bw->word.length(); - if ((Config.BSCaseSensitive && !strncmp(nbuf + strlen(nbuf) - len, bw->word.c_str(), len)) || (!Config.BSCaseSensitive && !strnicmp(nbuf + strlen(nbuf) - len, bw->word.c_str(), len))) + if ((Config.BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_cs(bw->word)) || (!Config.BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_ci(bw->word))) mustkick = true; else { - char *wordbuf = new char[len + 2]; - - memcpy(wordbuf, bw->word.c_str(), len); - wordbuf[len] = ' '; - wordbuf[len + 1] = '\0'; + Anope::string wordbuf = bw->word + " "; - if ((Config.BSCaseSensitive && strstr(nbuf, wordbuf)) || (!Config.BSCaseSensitive && stristr(nbuf, wordbuf))) + if ((Config.BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config.BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos)) mustkick = true; - - delete [] wordbuf; } } @@ -289,15 +270,9 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) else bot_kick(ci, u, BOT_REASON_BADWORD, bw->word.c_str()); - /* free the normalized buffer before return (#850) */ - delete [] nbuf; - return; } } - - /* Free the normalized buffer */ - delete [] nbuf; } /* Flood kicker */ @@ -331,16 +306,15 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) if (!ud) return; - if (ud->lastline && stricmp(ud->lastline, buf.c_str())) + if (!ud->lastline.empty() && !ud->lastline.equals_ci(buf)) { - delete [] ud->lastline; - ud->lastline = sstrdup(buf.c_str()); + ud->lastline = buf; ud->times = 0; } else { - if (!ud->lastline) - ud->lastline = sstrdup(buf.c_str()); + if (ud->lastline.empty()) + ud->lastline = buf; ++ud->times; } @@ -354,41 +328,35 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) } /* return if the user is on the ignore list */ - if (get_ignore(u->nick.c_str()) != NULL) + if (get_ignore(u->nick)) return; /* Fantaisist commands */ - if (ci->botflags.HasFlag(BS_FANTASY) && buf[0] == *Config.BSFantasyCharacter && !was_action) + if (ci->botflags.HasFlag(BS_FANTASY) && buf[0] == Config.BSFantasyCharacter[0] && !was_action) { spacesepstream sep(buf); - std::string token; + Anope::string token; - if (sep.GetToken(token) && token[0] == *Config.BSFantasyCharacter) + if (sep.GetToken(token) && token[0] == Config.BSFantasyCharacter[0]) { /* Strip off the fantasy character */ token.erase(token.begin()); if (check_access(u, ci, CA_FANTASIA)) { - Command *command = FindCommand(ChanServ, token.c_str()); + Command *command = FindCommand(ChanServ, token); /* Command exists and can not be called by fantasy */ if (command && !command->HasFlag(CFLAG_DISABLE_FANTASY)) { - std::string bbuf = std::string(token); + Anope::string bbuf = token; /* Some commands don't need the channel name added.. eg !help */ if (!command->HasFlag(CFLAG_STRIP_CHANNEL)) - { - bbuf += " "; - bbuf += ci->name; - } + bbuf += " " + ci->name; if (!sep.StreamEnd()) - { - bbuf += " "; - bbuf += sep.GetRemaining(); - } + bbuf += " " + sep.GetRemaining(); chanserv(u, bbuf); } @@ -405,21 +373,11 @@ void botchanmsgs(User *u, ChannelInfo *ci, const std::string &buf) /*************************************************************************/ -BotInfo *findbot(const char *nick) -{ - return findbot(ci::string(nick)); -} - -BotInfo *findbot(const std::string &nick) -{ - return findbot(ci::string(nick.c_str())); -} - -BotInfo *findbot(const ci::string &nick) +BotInfo *findbot(const Anope::string &nick) { if (isdigit(nick[0]) && ircd->ts6) { - botinfo_uid_map::const_iterator it = BotListByUID.find(nick.c_str()); + botinfo_uid_map::const_iterator it = BotListByUID.find(nick); if (it != BotListByUID.end()) return it->second; @@ -440,14 +398,13 @@ BotInfo *findbot(const ci::string &nick) static BanData *get_ban_data(Channel *c, User *u) { - char mask[BUFSIZE]; BanData *bd, *next; time_t now = time(NULL); if (!c || !u) return NULL; - snprintf(mask, sizeof(mask), "%s@%s", u->GetIdent().c_str(), u->GetDisplayedHost().c_str()); + Anope::string mask = u->GetIdent() + "@" + u->GetDisplayedHost(); for (bd = c->bd; bd; bd = next) { @@ -459,13 +416,11 @@ static BanData *get_ban_data(Channel *c, User *u) bd->prev->next = bd->next; else c->bd = bd->next; - if (bd->mask) - delete [] bd->mask; next = bd->next; delete bd; continue; } - if (!stricmp(bd->mask, mask)) + if (bd->mask.equals_ci(mask)) { bd->last_use = now; return bd; @@ -475,7 +430,7 @@ static BanData *get_ban_data(Channel *c, User *u) /* If we fall here it is that we haven't found the record */ bd = new BanData; - bd->mask = sstrdup(mask); + bd->mask = mask; bd->last_use = now; for (int x = 0; x < TTB_SIZE; ++x) bd->ttb[x] = 0; @@ -511,11 +466,9 @@ static UserData *get_user_data(Channel *c, User *u) /* Checks whether data is obsolete */ if (now - uc->ud.last_use > Config.BSKeepData) { - if (uc->ud.lastline) - delete [] uc->ud.lastline; /* We should not free and realloc, but reset to 0 instead. */ - memset(&uc->ud, 0, sizeof(UserData)); + uc->ud.Clear(); uc->ud.last_use = now; } @@ -550,11 +503,11 @@ static void check_ban(ChannelInfo *ci, User *u, int ttbtype) /* Should not use == here because bd->ttb[ttbtype] could possibly be > ci->ttb[ttbtype] * if the TTB was changed after it was not set (0) before and the user had already been * kicked a few times. Bug #1056 - Adam */ - char mask[BUFSIZE]; + Anope::string mask; bd->ttb[ttbtype] = 0; - get_idealban(ci, u, mask, sizeof(mask)); + get_idealban(ci, u, mask); if (ci->c) ci->c->SetMode(NULL, CMODE_BAN, mask); @@ -589,9 +542,9 @@ static void bot_kick(ChannelInfo *ci, User *u, int message, ...) /* Makes a simple ban and kicks the target */ -void bot_raw_ban(User *requester, ChannelInfo *ci, char *nick, const char *reason) +void bot_raw_ban(User *requester, ChannelInfo *ci, const Anope::string &nick, const Anope::string &reason) { - char mask[BUFSIZE]; + Anope::string mask; User *u = finduser(nick); if (!u) @@ -599,35 +552,35 @@ void bot_raw_ban(User *requester, ChannelInfo *ci, char *nick, const char *reaso if (ModeManager::FindUserModeByName(UMODE_PROTECTED) && u->IsProtected() && requester != u) { - ircdproto->SendPrivmsg(ci->bi, ci->name.c_str(), "%s", getstring(ACCESS_DENIED)); + ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", getstring(ACCESS_DENIED)); return; } - if (ci->HasFlag(CI_PEACE) && stricmp(requester->nick.c_str(), nick) && get_access(u, ci) >= get_access(requester, ci)) + if (ci->HasFlag(CI_PEACE) && !requester->nick.equals_ci(nick) && get_access(u, ci) >= get_access(requester, ci)) return; if (ModeManager::FindChannelModeByName(CMODE_EXCEPT) && is_excepted(ci, u) == 1) { - ircdproto->SendPrivmsg(ci->bi, ci->name.c_str(), "%s", getstring(BOT_EXCEPT)); + ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", getstring(BOT_EXCEPT)); return; } - get_idealban(ci, u, mask, sizeof(mask)); + get_idealban(ci, u, mask); ci->c->SetMode(NULL, CMODE_BAN, mask); /* Check if we need to do a signkick or not -GD */ if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !check_access(requester, ci, CA_SIGNKICK))) - ci->c->Kick(ci->bi, u, "%s (%s)", reason ? reason : ci->bi->nick.c_str(), requester->nick.c_str()); + ci->c->Kick(ci->bi, u, "%s (%s)", !reason.empty() ? reason.c_str() : ci->bi->nick.c_str(), requester->nick.c_str()); else - ci->c->Kick(ci->bi, u, "%s", reason ? reason : ci->bi->nick.c_str()); + ci->c->Kick(ci->bi, u, "%s", !reason.empty() ? reason.c_str() : ci->bi->nick.c_str()); } /*************************************************************************/ /* Makes a kick with a "dynamic" reason ;) */ -void bot_raw_kick(User *requester, ChannelInfo *ci, char *nick, const char *reason) +void bot_raw_kick(User *requester, ChannelInfo *ci, const Anope::string &nick, const Anope::string &reason) { User *u = finduser(nick); @@ -636,24 +589,24 @@ void bot_raw_kick(User *requester, ChannelInfo *ci, char *nick, const char *reas if (ModeManager::FindUserModeByName(UMODE_PROTECTED) && u->IsProtected() && requester != u) { - ircdproto->SendPrivmsg(ci->bi, ci->name.c_str(), "%s", getstring(ACCESS_DENIED)); + ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", getstring(ACCESS_DENIED)); return; } - if (ci->HasFlag(CI_PEACE) && stricmp(requester->nick.c_str(), nick) && get_access(u, ci) >= get_access(requester, ci)) + if (ci->HasFlag(CI_PEACE) && !requester->nick.equals_ci(nick) && get_access(u, ci) >= get_access(requester, ci)) return; if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !check_access(requester, ci, CA_SIGNKICK))) - ci->c->Kick(ci->bi, u, "%s (%s)", reason ? reason : ci->bi->nick.c_str(), requester->nick.c_str()); + ci->c->Kick(ci->bi, u, "%s (%s)", !reason.empty() ? reason.c_str() : ci->bi->nick.c_str(), requester->nick.c_str()); else - ci->c->Kick(ci->bi, u, "%s", reason ? reason : ci->bi->nick.c_str()); + ci->c->Kick(ci->bi, u, "%s", !reason.empty() ? reason.c_str() : ci->bi->nick.c_str()); } /*************************************************************************/ /* Makes a mode operation on a channel for a nick */ -void bot_raw_mode(User *requester, ChannelInfo *ci, const char *mode, char *nick) +void bot_raw_mode(User *requester, ChannelInfo *ci, const Anope::string &mode, const Anope::string &nick) { char buf[BUFSIZE] = ""; User *u; @@ -665,16 +618,16 @@ void bot_raw_mode(User *requester, ChannelInfo *ci, const char *mode, char *nick snprintf(buf, BUFSIZE - 1, "%ld", static_cast<long>(time(NULL))); - if (ModeManager::FindUserModeByName(UMODE_PROTECTED) && u->IsProtected() && *mode == '-' && requester != u) + if (ModeManager::FindUserModeByName(UMODE_PROTECTED) && u->IsProtected() && mode[0] == '-' && requester != u) { - ircdproto->SendPrivmsg(ci->bi, ci->name.c_str(), "%s", getstring(ACCESS_DENIED)); + ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", getstring(ACCESS_DENIED)); return; } - if (*mode == '-' && ci->HasFlag(CI_PEACE) && stricmp(requester->nick.c_str(), nick) && get_access(u, ci) >= get_access(requester, ci)) + if (mode[0] == '-' && ci->HasFlag(CI_PEACE) && !requester->nick.equals_ci(nick) && get_access(u, ci) >= get_access(requester, ci)) return; - ci->c->SetModes(NULL, "%s %s", mode, nick); + ci->c->SetModes(NULL, "%s %s", mode.c_str(), nick.c_str()); } /*************************************************************************/ @@ -683,15 +636,11 @@ void bot_raw_mode(User *requester, ChannelInfo *ci, const char *mode, char *nick * @param A string to be parsed for control and color codes * @return A string stripped of control and color codes */ -char *normalizeBuffer(const char *buf) +Anope::string normalizeBuffer(const Anope::string &buf) { - char *newbuf; - int i, len, j = 0; + Anope::string newbuf; - len = strlen(buf); - newbuf = new char[len + 1]; - - for (i = 0; i < len; ++i) + for (unsigned i = 0, end = buf.length(); i < end; ++i) { switch (buf[i]) { @@ -748,13 +697,9 @@ char *normalizeBuffer(const char *buf) break; /* A valid char gets copied into the new buffer */ default: - newbuf[j] = buf[i]; - ++j; + newbuf += buf[i]; } } - /* Terminate the string */ - newbuf[j] = 0; - return newbuf; } diff --git a/src/channels.cpp b/src/channels.cpp index e58655f58..862dfe152 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -19,17 +19,16 @@ channel_map ChannelList; * @param name The channel name * @param ts The time the channel was created */ -Channel::Channel(const std::string &name, time_t ts) +Channel::Channel(const Anope::string &name, time_t ts) { if (name.empty()) throw CoreException("A channel without a name ?"); this->name = name; - ChannelList[this->name.c_str()] = this; + ChannelList[this->name] = this; this->creation_time = ts; - this->topic = NULL; this->bans = this->excepts = this->invites = NULL; this->bd = NULL; this->server_modetime = this->chanserv_modetime = 0; @@ -54,8 +53,6 @@ Channel::~Channel() for (bd = this->bd; bd; bd = next) { - if (bd->mask) - delete [] bd->mask; next = bd->next; delete bd; } @@ -63,9 +60,6 @@ Channel::~Channel() if (this->ci) this->ci->c = NULL; - if (this->topic) - delete [] this->topic; - if (this->bans && this->bans->count) while (this->bans->entries) entry_delete(this->bans, this->bans->entries); @@ -78,7 +72,7 @@ Channel::~Channel() while (this->invites->entries) entry_delete(this->invites, this->invites->entries); - ChannelList.erase(this->name.c_str()); + ChannelList.erase(this->name); } void Channel::Sync() @@ -90,7 +84,7 @@ void Channel::Sync() } if (Me && Me->IsSynced() && !this->topic_sync) - restore_topic(name.c_str()); + restore_topic(name); } void Channel::JoinUser(User *user) @@ -106,7 +100,7 @@ void Channel::JoinUser(User *user) uc->Status = Status; this->users.push_back(uc); - if (!get_ignore(user->nick.c_str())) + if (!get_ignore(user->nick)) { if (this->ci && check_access(user, this->ci, CA_MEMO) && this->ci->memos.memos.size() > 0) { @@ -117,8 +111,8 @@ void Channel::JoinUser(User *user) } /* Added channelname to entrymsg - 30.03.2004, Certus */ /* Also, don't send the entrymsg when bursting -GD */ - if (this->ci && this->ci->entry_message && user->server->IsSynced()) - user->SendMessage(whosends(this->ci)->nick, "[%s] %s", this->name.c_str(), this->ci->entry_message); + if (this->ci && !this->ci->entry_message.empty() && user->server->IsSynced()) + user->SendMessage(whosends(this->ci)->nick, "[%s] %s", this->name.c_str(), this->ci->entry_message.c_str()); } /** @@ -129,16 +123,15 @@ void Channel::JoinUser(User *user) * But don't join the bot if the channel is persistant - Adam * But join persistant channels when syncing with our uplink- DP **/ - if (Config.s_BotServ && this->ci && this->ci->bi && (!Me->IsSynced() || !this->ci->HasFlag(CI_PERSIST)) && this->users.size() == Config.BSMinUsers) + if (!Config.s_BotServ.empty() && this->ci && this->ci->bi && (!Me->IsSynced() || !this->ci->HasFlag(CI_PERSIST)) && this->users.size() == Config.BSMinUsers) this->ci->bi->Join(this); /* Only display the greet if the main uplink we're connected * to has synced, or we'll get greet-floods when the net * recovers from a netsplit. -GD */ - if (Config.s_BotServ && this->ci && this->ci->bi && this->FindUser(this->ci->bi) && this->ci->botflags.HasFlag(BS_GREET) && user->Account() && user->Account()->greet && - check_access(user, this->ci, CA_GREET) && user->server->IsSynced()) + if (!Config.s_BotServ.empty() && this->ci && this->ci->bi && this->FindUser(this->ci->bi) && this->ci->botflags.HasFlag(BS_GREET) && user->Account() && !user->Account()->greet.empty() && check_access(user, this->ci, CA_GREET) && user->server->IsSynced()) { - ircdproto->SendPrivmsg(this->ci->bi, this->name.c_str(), "[%s] %s", user->Account()->display, user->Account()->greet); + ircdproto->SendPrivmsg(this->ci->bi, this->name, "[%s] %s", user->Account()->display.c_str(), user->Account()->greet.c_str()); this->ci->bi->lastmsg = time(NULL); } } @@ -150,7 +143,7 @@ void Channel::DeleteUser(User *user) { if (this->ci) update_cs_lastseen(user, this->ci); - + Alog(LOG_DEBUG) << user->nick << " leaves " << this->name; CUserList::iterator cit, cit_end = this->users.end(); @@ -190,7 +183,7 @@ void Channel::DeleteUser(User *user) if (this->ci && this->ci->HasFlag(CI_INHABIT)) return; - if (Config.s_BotServ && this->ci && this->ci->bi && this->FindUser(this->ci->bi)) + if (!Config.s_BotServ.empty() && this->ci && this->ci->bi && this->FindUser(this->ci->bi)) this->ci->bi->Part(this->ci->c); else if (this->users.empty()) delete this; @@ -257,7 +250,7 @@ bool Channel::HasMode(ChannelModeName Name) * @param param The param * @param EnforeMLock true if mlocks should be enforced, false to override mlock */ -void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool EnforceMLock) +void Channel::SetModeInternal(ChannelMode *cm, const Anope::string ¶m, bool EnforceMLock) { if (!cm) return; @@ -275,7 +268,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool En } BotInfo *bi = NULL; - if (Config.s_BotServ) + if (!Config.s_BotServ.empty()) bi = findbot(param); User *u = bi ? bi : finduser(param); @@ -306,7 +299,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool En } ChannelModeList *cml = dynamic_cast<ChannelModeList *>(cm); - cml->AddMask(this, param.c_str()); + cml->AddMask(this, param); return; } @@ -321,7 +314,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool En } /* They could be resetting the mode to change its params */ - std::map<ChannelModeName, std::string>::iterator it = Params.find(cm->Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(cm->Name); if (it != Params.end()) Params.erase(it); @@ -354,7 +347,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool En /* Remove the mode */ if (cm->Type == MODE_PARAM) { - std::string cparam; + Anope::string cparam; GetParam(cm->Name, cparam); RemoveMode(NULL, cm, cparam); } @@ -365,14 +358,14 @@ void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool En else if (cm->Type == MODE_PARAM && ci->HasMLock(cm->Name, true)) { ChannelModeParam *cmp = dynamic_cast<ChannelModeParam *>(cm); - std::string cparam, ciparam; + Anope::string cparam, ciparam; /* Get the param currently set on this channel */ GetParam(cmp->Name, cparam); /* Get the param set in mlock */ ci->GetParam(cmp->Name, ciparam); /* We have the wrong param set */ - if (cparam.empty() || ciparam.empty() || cparam != ciparam) + if (cparam.empty() || ciparam.empty() || !cparam.equals_cs(ciparam)) /* Reset the mode with the correct param */ SetMode(NULL, cm, ciparam); } @@ -383,7 +376,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const std::string ¶m, bool En * @param param The param * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool EnforceMLock) +void Channel::RemoveModeInternal(ChannelMode *cm, const Anope::string ¶m, bool EnforceMLock) { if (!cm) return; @@ -401,7 +394,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool } BotInfo *bi = NULL; - if (Config.s_BotServ) + if (!Config.s_BotServ.empty()) bi = findbot(param); User *u = bi ? bi : finduser(param); @@ -437,7 +430,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool } ChannelModeList *cml = dynamic_cast<ChannelModeList *>(cm); - cml->DelMask(this, param.c_str()); + cml->DelMask(this, param); return; } @@ -445,7 +438,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool if (cm->Type == MODE_PARAM) { - std::map<ChannelModeName, std::string>::iterator it = Params.find(cm->Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(cm->Name); if (it != Params.end()) Params.erase(it); } @@ -457,7 +450,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool if (ci) { ci->UnsetFlag(CI_PERSIST); - if (Config.s_BotServ && ci->bi && this->FindUser(ci->bi)) + if (!Config.s_BotServ.empty() && ci->bi && this->FindUser(ci->bi)) this->ci->bi->Part(this); } } @@ -486,7 +479,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool /* This is a param mode */ else if (cm->Type == MODE_PARAM) { - std::string cparam; + Anope::string cparam; /* Get the param stored in mlock for this mode */ if (ci->GetParam(cm->Name, cparam)) SetMode(NULL, cm, cparam); @@ -500,7 +493,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const std::string ¶m, bool * @param param Optional param arg for the mode * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::SetMode(BotInfo *bi, ChannelMode *cm, const std::string ¶m, bool EnforceMLock) +void Channel::SetMode(BotInfo *bi, ChannelMode *cm, const Anope::string ¶m, bool EnforceMLock) { if (!cm) return; @@ -509,8 +502,8 @@ void Channel::SetMode(BotInfo *bi, ChannelMode *cm, const std::string ¶m, bo return; else if (cm->Type == MODE_PARAM && HasMode(cm->Name)) { - std::string cparam; - if (GetParam(cm->Name, cparam) && cparam == param) + Anope::string cparam; + if (GetParam(cm->Name, cparam) && cparam.equals_cs(param)) return; } else if (cm->Type == MODE_STATUS) @@ -535,7 +528,7 @@ void Channel::SetMode(BotInfo *bi, ChannelMode *cm, const std::string ¶m, bo * @param param Optional param arg for the mode * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::SetMode(BotInfo *bi, ChannelModeName Name, const std::string ¶m, bool EnforceMLock) +void Channel::SetMode(BotInfo *bi, ChannelModeName Name, const Anope::string ¶m, bool EnforceMLock) { SetMode(bi, ModeManager::FindChannelModeByName(Name), param, EnforceMLock); } @@ -547,7 +540,7 @@ void Channel::SetMode(BotInfo *bi, ChannelModeName Name, const std::string ¶ * @param param Optional param arg for the mode * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::SetMode(BotInfo *bi, char Mode, const std::string ¶m, bool EnforceMLock) +void Channel::SetMode(BotInfo *bi, char Mode, const Anope::string ¶m, bool EnforceMLock) { SetMode(bi, ModeManager::FindChannelModeByChar(Mode), param, EnforceMLock); } @@ -558,7 +551,7 @@ void Channel::SetMode(BotInfo *bi, char Mode, const std::string ¶m, bool Enf * @param param Optional param arg for the mode * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::RemoveMode(BotInfo *bi, ChannelMode *cm, const std::string ¶m, bool EnforceMLock) +void Channel::RemoveMode(BotInfo *bi, ChannelMode *cm, const Anope::string ¶m, bool EnforceMLock) { if (!cm) return; @@ -597,7 +590,7 @@ void Channel::RemoveMode(BotInfo *bi, ChannelMode *cm, const std::string ¶m, * @param param Optional param arg for the mode * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::RemoveMode(BotInfo *bi, ChannelModeName Name, const std::string ¶m, bool EnforceMLock) +void Channel::RemoveMode(BotInfo *bi, ChannelModeName Name, const Anope::string ¶m, bool EnforceMLock) { RemoveMode(bi, ModeManager::FindChannelModeByName(Name), param, EnforceMLock); } @@ -609,7 +602,7 @@ void Channel::RemoveMode(BotInfo *bi, ChannelModeName Name, const std::string &p * @param param Optional param arg for the mode * @param EnforceMLock true if mlocks should be enforced, false to override mlock */ -void Channel::RemoveMode(BotInfo *bi, char Mode, const std::string ¶m, bool EnforceMLock) +void Channel::RemoveMode(BotInfo *bi, char Mode, const Anope::string ¶m, bool EnforceMLock) { RemoveMode(bi, ModeManager::FindChannelModeByChar(Mode), param, EnforceMLock); } @@ -619,9 +612,9 @@ void Channel::RemoveMode(BotInfo *bi, char Mode, const std::string ¶m, bool * @param Target a string to put the param into * @return true on success */ -const bool Channel::GetParam(ChannelModeName Name, std::string &Target) +const bool Channel::GetParam(ChannelModeName Name, Anope::string &Target) { - std::map<ChannelModeName, std::string>::iterator it = Params.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(Name); Target.clear(); @@ -639,7 +632,7 @@ const bool Channel::GetParam(ChannelModeName Name, std::string &Target) */ const bool Channel::HasParam(ChannelModeName Name) { - std::map<ChannelModeName, std::string>::iterator it = Params.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(Name); if (it != Params.end()) return true; @@ -666,7 +659,7 @@ void Channel::ClearModes(BotInfo *bi) this->RemoveMode(NULL, cm); else if (cm->Type == MODE_PARAM) { - std::string param; + Anope::string param; this->GetParam(cm->Name, param); this->RemoveMode(NULL, cm, param); } @@ -742,7 +735,7 @@ void Channel::SetModes(BotInfo *bi, bool EnforceMLock, const char *cmodes, ...) { char buf[BUFSIZE] = ""; va_list args; - std::string modebuf, sbuf; + Anope::string modebuf, sbuf; int add = -1; va_start(args, cmodes); vsnprintf(buf, BUFSIZE - 1, cmodes, args); @@ -750,7 +743,7 @@ void Channel::SetModes(BotInfo *bi, bool EnforceMLock, const char *cmodes, ...) spacesepstream sep(buf); sep.GetToken(modebuf); - for (unsigned i = 0, end = modebuf.size(); i < end; ++i) + for (unsigned i = 0, end = modebuf.length(); i < end; ++i) { ChannelMode *cm; @@ -859,10 +852,10 @@ void ChanSetInternalModes(Channel *c, int ac, const char **av) * @param nick The nick being kicked * @param reason The reason for the kick */ -void Channel::KickInternal(const std::string &source, const std::string &nick, const std::string &reason) +void Channel::KickInternal(const Anope::string &source, const Anope::string &nick, const Anope::string &reason) { BotInfo *bi = NULL; - if (Config.s_BotServ && this->ci) + if (!Config.s_BotServ.empty() && this->ci) bi = findbot(nick); User *user = bi ? bi : finduser(nick); if (!user) @@ -873,7 +866,7 @@ void Channel::KickInternal(const std::string &source, const std::string &nick, c Alog(LOG_DEBUG) << "Channel::KickInternal kicking " << user->nick << " from " << this->name; - std::string chname = this->name; + Anope::string chname = this->name; if (user->FindChannel(this)) { @@ -882,7 +875,7 @@ void Channel::KickInternal(const std::string &source, const std::string &nick, c } else Alog(LOG_DEBUG) << "Channel::KickInternal got kick for user " << user->nick << " who isn't on channel " << this->name << " ?"; - + /* Bots get rejoined */ if (bi) bi->Join(chname); @@ -923,12 +916,9 @@ bool Channel::Kick(BotInfo *bi, User *u, const char *reason, ...) * eventual parameters won't be added to the string. */ -char *chan_get_modes(Channel * chan, int complete, int plus) +Anope::string chan_get_modes(Channel *chan, int complete, int plus) { - static char res[BUFSIZE]; - char params[BUFSIZE]; - char *end = res, *value, *pend = params, *pend2 = params; - std::string param; + Anope::string res, params, param; if (chan->HasModes()) { @@ -941,7 +931,7 @@ char *chan_get_modes(Channel * chan, int complete, int plus) if (chan->HasMode(cm->Name)) { - *end++ = cm->ModeChar; + res += cm->ModeChar; if (complete) { @@ -954,42 +944,22 @@ char *chan_get_modes(Channel * chan, int complete, int plus) chan->GetParam(cmp->Name, param); if (!param.empty()) - { - value = const_cast<char *>(param.c_str()); - - *pend++ = ' '; - - while (*value) - *pend++ = *value++; - } + params += " " + param; } } } } } - while (*pend2) - *end++ = *pend2++; + res += params; } - *end = 0; - return res; } /*************************************************************************/ -Channel *findchan(const char *chan) -{ - return findchan(ci::string(chan)); -} - -Channel *findchan(const std::string &chan) -{ - return findchan(ci::string(chan.c_str())); -} - -Channel *findchan(const ci::string &chan) +Channel *findchan(const Anope::string &chan) { channel_map::const_iterator it = ChannelList.find(chan); @@ -1006,7 +976,7 @@ void get_channel_stats(long *nrec, long *memuse) { long count = 0, mem = 0; BanData *bd; - std::string buf; + Anope::string buf; for (channel_map::const_iterator cit = ChannelList.begin(); cit != ChannelList.end(); ++cit) { @@ -1014,8 +984,8 @@ void get_channel_stats(long *nrec, long *memuse) ++count; mem += sizeof(*chan); - if (chan->topic) - mem += strlen(chan->topic) + 1; + if (!chan->topic.empty()) + mem += chan->topic.length() + 1; if (chan->GetParam(CMODE_KEY, buf)) mem += buf.length() + 1; if (chan->GetParam(CMODE_FLOOD, buf)) @@ -1031,13 +1001,13 @@ void get_channel_stats(long *nrec, long *memuse) { mem += sizeof(*it); mem += sizeof((*it)->ud); - if ((*it)->ud.lastline) - mem += strlen((*it)->ud.lastline) + 1; + if (!(*it)->ud.lastline.empty()) + mem += (*it)->ud.lastline.length() + 1; } for (bd = chan->bd; bd; bd = bd->next) { - if (bd->mask) - mem += strlen(bd->mask) + 1; + if (!bd->mask.empty()) + mem += bd->mask.length() + 1; mem += sizeof(*bd); } } @@ -1050,7 +1020,7 @@ void get_channel_stats(long *nrec, long *memuse) /* Is the given nick on the given channel? This function supports links. */ -User *nc_on_chan(Channel *c, NickCore *nc) +User *nc_on_chan(Channel *c, const NickCore *nc) { if (!c || !nc) return NULL; @@ -1073,7 +1043,7 @@ User *nc_on_chan(Channel *c, NickCore *nc) * av[0] = channels to join */ -void do_join(const char *source, int ac, const char **av) +void do_join(const Anope::string &source, int ac, const char **av) { User *user; Channel *chan; @@ -1087,7 +1057,7 @@ void do_join(const char *source, int ac, const char **av) } commasepstream sep(av[0]); - ci::string buf; + Anope::string buf; while (sep.GetToken(buf)) { if (buf[0] == '0') @@ -1096,7 +1066,7 @@ void do_join(const char *source, int ac, const char **av) { ChannelContainer *cc = *it++; - std::string channame = cc->chan->name; + Anope::string channame = cc->chan->name; FOREACH_MOD(I_OnPrePartChannel, OnPrePartChannel(user, cc->chan)); cc->chan->DeleteUser(user); FOREACH_MOD(I_OnPartChannel, OnPartChannel(user, findchan(channame), channame, "")); @@ -1114,7 +1084,7 @@ void do_join(const char *source, int ac, const char **av) /* Join came with a TS */ if (ac == 2) { - time_t ts = atol(av[1]); + time_t ts = Anope::string(av[1]).is_number_only() ? convertTo<time_t>(av[1]) : 0; /* Their time is older, we lose */ if (chan->creation_time > ts) @@ -1161,7 +1131,7 @@ void do_join(const char *source, int ac, const char **av) * @param ac number of args * @param av The channel, nick(s) being kicked, and reason */ -void do_kick(const std::string &source, int ac, const char **av) +void do_kick(const Anope::string &source, int ac, const char **av) { Channel *c = findchan(av[0]); if (!c) @@ -1170,7 +1140,7 @@ void do_kick(const std::string &source, int ac, const char **av) return; } - std::string buf; + Anope::string buf; commasepstream sep(av[1]); while (sep.GetToken(buf)) c->KickInternal(source, buf, av[2]); @@ -1183,7 +1153,7 @@ void do_kick(const std::string &source, int ac, const char **av) * av[1] = reason (optional) */ -void do_part(const char *source, int ac, const char **av) +void do_part(const Anope::string &source, int ac, const char **av) { User *user = finduser(source); if (!user) @@ -1193,7 +1163,7 @@ void do_part(const char *source, int ac, const char **av) } commasepstream sep(av[0]); - ci::string buf; + Anope::string buf; while (sep.GetToken(buf)) { Channel *c = findchan(buf); @@ -1204,7 +1174,7 @@ void do_part(const char *source, int ac, const char **av) if (user->FindChannel(c)) { FOREACH_MOD(I_OnPrePartChannel, OnPrePartChannel(user, c)); - std::string ChannelName = c->name; + Anope::string ChannelName = c->name; c->DeleteUser(user); FOREACH_MOD(I_OnPartChannel, OnPartChannel(user, findchan(ChannelName), ChannelName, av[1] ? av[1] : "")); } @@ -1221,7 +1191,7 @@ void do_part(const char *source, int ac, const char **av) * @param ac Number of args in array.. * @param av Array of args */ -void do_cmode(const char *source, int ac, const char **av) +void do_cmode(const Anope::string &source, int ac, const char **av) { Channel *c; ChannelInfo *ci; @@ -1248,8 +1218,8 @@ void do_cmode(const char *source, int ac, const char **av) /* :42XAAAAAO TMODE 1106409026 #ircops +b *!*@*.aol.com */ if (ircd->ts6 && isdigit(av[0][0])) { - --ac; - ++av; + --ac; + ++av; } c = findchan(av[0]); @@ -1264,7 +1234,7 @@ void do_cmode(const char *source, int ac, const char **av) return; } - if (strchr(source, '.') && !av[1][strcspn(av[1], "bovahq")]) + if (source.find('.') != Anope::string::npos && Anope::string(av[1]).find_first_of("bovahq") == Anope::string::npos) { if (time(NULL) != c->server_modetime) { @@ -1283,23 +1253,11 @@ void do_cmode(const char *source, int ac, const char **av) /* Handle a TOPIC command. */ -void do_topic(const char *source, int ac, const char **av) +void do_topic(const Anope::string &source, int ac, const char **av) { Channel *c = findchan(av[0]); ChannelInfo *ci; - int ts; - time_t topic_time; - char *topicsetter; - - if (ircd->sjb64) - { - ts = base64dects(av[2]); - Alog(LOG_DEBUG) << "encoded TOPIC TS " << av[2] << " converted to " << ts; - } - else - ts = strtoul(av[2], NULL, 10); - - topic_time = ts; + time_t topic_time = Anope::string(av[2]).is_number_only() ? convertTo<time_t>(av[2]) : 0; if (!c) { @@ -1315,35 +1273,25 @@ void do_topic(const char *source, int ac, const char **av) /* For Unreal, cut off the ! and any futher part of the topic setter. * This way, nick!ident@host setters will only show the nick. -GD */ - topicsetter = myStrGetToken(av[1], '!', 0); + Anope::string topicsetter = myStrGetToken(av[1], '!', 0); /* If the current topic we have matches the last known topic for this * channel exactly, there's no need to update anything and we can as * well just return silently without updating anything. -GD */ - if (ac > 3 && *av[3] && ci && ci->last_topic && !strcmp(av[3], ci->last_topic) && !strcmp(topicsetter, ci->last_topic_setter.c_str())) - { - delete [] topicsetter; + if (ac > 3 && *av[3] && ci && !ci->last_topic.empty() && ci->last_topic.equals_cs(av[3]) && ci->last_topic_setter.equals_cs(topicsetter)) return; - } if (check_topiclock(c, topic_time)) - { - delete [] topicsetter; return; - } - if (c->topic) - { - delete [] c->topic; - c->topic = NULL; - } + if (!c->topic.empty()) + c->topic.clear(); if (ac > 3 && *av[3]) - c->topic = sstrdup(av[3]); + c->topic = av[3]; c->topic_setter = topicsetter; c->topic_time = topic_time; - delete [] topicsetter; record_topic(av[0]); @@ -1377,12 +1325,12 @@ void chan_set_correct_modes(User *user, Channel *c, int give_modes) if (!c || !(ci = c->ci)) return; - if (ci->HasFlag(CI_FORBIDDEN) || *(c->name.c_str()) == '+') + if (ci->HasFlag(CI_FORBIDDEN) || c->name[0] == '+') return; Alog(LOG_DEBUG) << "Setting correct user modes for " << user->nick << " on " << c->name << " (" << (give_modes ? "" : "not ") << "giving modes)"; - if (give_modes && !get_ignore(user->nick.c_str()) && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP))) + if (give_modes && !get_ignore(user->nick) && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP))) { if (owner && check_access(user, ci, CA_AUTOOWNER)) c->SetMode(NULL, CMODE_OWNER, user->nick); @@ -1420,7 +1368,7 @@ void chan_set_correct_modes(User *user, Channel *c, int give_modes) * @param bi The bot to send the modes from * @param modes The modes */ -void MassChannelModes(BotInfo *bi, const std::string &modes) +void MassChannelModes(BotInfo *bi, const Anope::string &modes) { for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it) { @@ -1428,7 +1376,7 @@ void MassChannelModes(BotInfo *bi, const std::string &modes) if (c->bouncy_modes) return; - c->SetModes(bi, false, modes.c_str()); + c->SetModes(bi, false, "%s", modes.c_str()); } } @@ -1441,7 +1389,7 @@ void restore_unsynced_topics() Channel *c = it->second; if (!c->topic_sync) - restore_topic(c->name.c_str()); + restore_topic(c->name); } } @@ -1453,60 +1401,52 @@ void restore_unsynced_topics() * @param mask Host/IP/CIDR mask to convert to an entry * @return Entry struct for the given mask, NULL if creation failed */ -Entry *entry_create(char *mask) +Entry *entry_create(const Anope::string &mask) { Entry *entry; - char *nick = NULL, *user, *host, *cidrhost; + Anope::string cidrhost; uint32 ip, cidr; entry = new Entry; entry->SetFlag(ENTRYTYPE_NONE); entry->prev = NULL; entry->next = NULL; - entry->nick = NULL; - entry->user = NULL; - entry->host = NULL; - entry->mask = sstrdup(mask); + entry->mask = mask; + + Anope::string newmask = mask, host, nick, user; - host = strchr(mask, '@'); - if (host) + size_t at = newmask.find('@'); + if (at != Anope::string::npos) { - *host++ = '\0'; + host = newmask.substr(at + 1); + newmask = newmask.substr(0, at); /* If the user is purely a wildcard, ignore it */ - if (str_is_pure_wildcard(mask)) - user = NULL; - else + if (!str_is_pure_wildcard(newmask)) { /* There might be a nick too */ - user = strchr(mask, '!'); - if (user) + //user = strchr(mask, '!'); + size_t ex = newmask.find('!'); + if (ex != Anope::string::npos) { - *user++ = '\0'; + user = newmask.substr(ex + 1); + newmask = newmask.substr(0, ex); /* If the nick is purely a wildcard, ignore it */ - if (str_is_pure_wildcard(mask)) - nick = NULL; - else - nick = mask; + if (!str_is_pure_wildcard(newmask)) + nick = newmask; } else - { - nick = NULL; - user = mask; - } + user = newmask; } } else - { /* It is possibly an extended ban/invite mask, but we do * not support these at this point.. ~ Viper */ /* If there's no user in the mask, assume a pure wildcard */ - user = NULL; - host = mask; - } + host = newmask; - if (nick) + if (!nick.empty()) { - entry->nick = sstrdup(nick); + entry->nick = nick; /* Check if we have a wildcard user */ if (str_is_wildcard(nick)) entry->SetFlag(ENTRYTYPE_NICK_WILD); @@ -1514,9 +1454,9 @@ Entry *entry_create(char *mask) entry->SetFlag(ENTRYTYPE_NICK); } - if (user) + if (!user.empty()) { - entry->user = sstrdup(user); + entry->user = user; /* Check if we have a wildcard user */ if (str_is_wildcard(user)) entry->SetFlag(ENTRYTYPE_USER_WILD); @@ -1525,16 +1465,16 @@ Entry *entry_create(char *mask) } /* Only check the host if it's not a pure wildcard */ - if (*host && !str_is_pure_wildcard(host)) + if (!host.empty() && !str_is_pure_wildcard(host)) { - if (ircd->cidrchanbei && str_is_cidr(host, &ip, &cidr, &cidrhost)) + if (ircd->cidrchanbei && str_is_cidr(host, &ip, &cidr, cidrhost)) { entry->cidr_ip = ip; entry->cidr_mask = cidr; entry->SetFlag(ENTRYTYPE_CIDR4); host = cidrhost; } - else if (ircd->cidrchanbei && strchr(host, '/')) + else if (ircd->cidrchanbei && host.find('/') != Anope::string::npos) { /* Most IRCd's don't enforce sane bans therefore it is not * so unlikely we will encounter this. @@ -1549,14 +1489,13 @@ Entry *entry_create(char *mask) } else { - entry->host = sstrdup(host); + entry->host = host; if (str_is_wildcard(host)) entry->SetFlag(ENTRYTYPE_HOST_WILD); else entry->SetFlag(ENTRYTYPE_HOST); } } - delete [] mask; return entry; } @@ -1567,13 +1506,11 @@ Entry *entry_create(char *mask) * @param mask The mask to parse and add to the list * @return Pointer to newly added entry. NULL if it fails. */ -Entry *entry_add(EList *list, const char *mask) +Entry *entry_add(EList *list, const Anope::string &mask) { Entry *e; - char *hostmask; - hostmask = sstrdup(mask); - e = entry_create(hostmask); + e = entry_create(mask); if (!e) return NULL; @@ -1607,13 +1544,6 @@ void entry_delete(EList *list, Entry *e) if (list->entries == e) list->entries = e->next; - if (e->nick) - delete [] e->nick; - if (e->user) - delete [] e->user; - if (e->host) - delete [] e->host; - delete [] e->mask; delete e; --list->count; @@ -1643,20 +1573,19 @@ EList *list_create() * @param ip IP to match against, set to 0 to not match this * @return 1 for a match, 0 for no match */ -int entry_match(Entry *e, const ci::string &nick, const ci::string &user, const ci::string &host, uint32 ip) +int entry_match(Entry *e, const Anope::string &nick, const Anope::string &user, const Anope::string &host, uint32 ip) { /* If we don't get an entry, or it s an invalid one, no match ~ Viper */ if (!e || !e->FlagCount()) return 0; - ci::string ci_nick(nick.c_str()), ci_user(user.c_str()), ci_host(host.c_str()); if (ircd->cidrchanbei && e->HasFlag(ENTRYTYPE_CIDR4) && (!ip || (ip && (ip & e->cidr_mask) != e->cidr_ip))) return 0; - if (e->HasFlag(ENTRYTYPE_NICK) && (nick.empty() || nick != e->nick)) + if (e->HasFlag(ENTRYTYPE_NICK) && (nick.empty() || e->nick.equals_ci(nick))) return 0; - if (e->HasFlag(ENTRYTYPE_USER) && (user.empty() || user != e->user)) + if (e->HasFlag(ENTRYTYPE_USER) && (user.empty() || e->user.equals_ci(user))) return 0; - if (e->HasFlag(ENTRYTYPE_HOST) && (host.empty() || host != e->host)) + if (e->HasFlag(ENTRYTYPE_HOST) && (host.empty() || e->host.equals_ci(host))) return 0; if (e->HasFlag(ENTRYTYPE_NICK_WILD) && !Anope::Match(nick, e->nick)) return 0; @@ -1675,40 +1604,30 @@ int entry_match(Entry *e, const ci::string &nick, const ci::string &user, const * @param ip IP to match against, set to 0 to not match this * @return 1 for a match, 0 for no match */ -int entry_match_mask(Entry *e, const char *mask, uint32 ip) +int entry_match_mask(Entry *e, const Anope::string &mask, uint32 ip) { - char *hostmask, *nick, *user, *host; int res; - hostmask = sstrdup(mask); + Anope::string hostmask = mask, host, user, nick; - host = strchr(hostmask, '@'); - if (host) + size_t at = hostmask.find('@'); + if (at != Anope::string::npos) { - *host++ = '\0'; - user = strchr(hostmask, '!'); - if (user) + host = hostmask.substr(at + 1); + hostmask = hostmask.substr(0, at); + size_t ex = hostmask.find('!'); + if (ex != Anope::string::npos) { - *user++ = '\0'; - nick = hostmask; + user = hostmask.substr(ex + 1); + nick = hostmask.substr(0, ex); } else - { - nick = NULL; user = hostmask; - } } else - { - nick = NULL; - user = NULL; host = hostmask; - } - res = entry_match(e, nick ? nick : "", user ? user : "", host ? host : "", ip); - - /* Free the destroyed mask. */ - delete [] hostmask; + res = entry_match(e, nick, user, host, ip); return res; } @@ -1722,7 +1641,7 @@ int entry_match_mask(Entry *e, const char *mask, uint32 ip) * @param ip The ip to match * @return Returns the first matching entry, if none, NULL is returned. */ -Entry *elist_match(EList *list, const char *nick, const char *user, const char *host, uint32 ip) +Entry *elist_match(EList *list, const Anope::string &nick, const Anope::string &user, const Anope::string &host, uint32 ip) { Entry *e; @@ -1730,7 +1649,7 @@ Entry *elist_match(EList *list, const char *nick, const char *user, const char * return NULL; for (e = list->entries; e; e = e->next) - if (entry_match(e, nick ? nick : "", user ? user : "", host ? host : "", ip)) + if (entry_match(e, nick, user, host, ip)) return e; /* We matched none */ @@ -1744,44 +1663,34 @@ Entry *elist_match(EList *list, const char *nick, const char *user, const char * * @param ip The ip to match * @return Returns the first matching entry, if none, NULL is returned. */ -Entry *elist_match_mask(EList *list, const char *mask, uint32 ip) +Entry *elist_match_mask(EList *list, const Anope::string &mask, uint32 ip) { - char *hostmask, *nick, *user, *host; Entry *res; - if (!list || !list->entries || !mask) + if (!list || !list->entries || mask.empty()) return NULL; - hostmask = sstrdup(mask); + Anope::string hostmask = mask, host, user, nick; - host = strchr(hostmask, '@'); - if (host) + size_t at = hostmask.find('@'); + if (at != Anope::string::npos) { - *host++ = '\0'; - user = strchr(hostmask, '!'); - if (user) + host = hostmask.substr(at + 1); + hostmask = hostmask.substr(0, at); + size_t ex = hostmask.find('!'); + if (ex != Anope::string::npos) { - *user++ = '\0'; - nick = hostmask; + user = hostmask.substr(ex + 1); + nick = hostmask.substr(0, ex); } else - { - nick = NULL; user = hostmask; - } } else - { - nick = NULL; - user = NULL; host = hostmask; - } res = elist_match(list, nick, user, host, ip); - /* Free the destroyed mask. */ - delete [] hostmask; - return res; } @@ -1794,36 +1703,33 @@ Entry *elist_match_mask(EList *list, const char *mask, uint32 ip) Entry *elist_match_user(EList *list, User *u) { Entry *res; - char *host; + Anope::string host; uint32 ip = 0; if (!list || !list->entries || !u) return NULL; - if (u->hostip == NULL) + if (u->hostip.empty()) { host = host_resolve(u->host); /* we store the just resolved hostname so we don't * need to do this again */ - if (host) - u->hostip = sstrdup(host); + if (!host.empty()) + u->hostip = host; } else - host = sstrdup(u->hostip); + host = u->hostip; /* Convert the host to an IP.. */ - if (host) + if (!host.empty()) ip = str_is_ip(host); /* Match what we ve got against the lists.. */ - res = elist_match(list, u->nick.c_str(), u->GetIdent().c_str(), u->host, ip); + res = elist_match(list, u->nick, u->GetIdent(), u->host, ip); if (!res) - res = elist_match(list, u->nick.c_str(), u->GetIdent().c_str(), u->GetDisplayedHost().c_str(), ip); - if (!res && !u->GetCloakedHost().empty() && u->GetCloakedHost() != u->GetDisplayedHost()) - res = elist_match(list, u->nick.c_str(), u->GetIdent().c_str(), u->GetCloakedHost().c_str(), ip); - - if (host) - delete [] host; + res = elist_match(list, u->nick, u->GetIdent(), u->GetDisplayedHost(), ip); + if (!res && !u->GetCloakedHost().empty() && !u->GetCloakedHost().equals_cs(u->GetDisplayedHost())) + res = elist_match(list, u->nick, u->GetIdent(), u->GetCloakedHost(), ip); return res; } @@ -1834,15 +1740,15 @@ Entry *elist_match_user(EList *list, User *u) * @param mask The *!*@* mask to match * @return Returns the first matching entry, if none, NULL is returned. */ -Entry *elist_find_mask(EList *list, const char *mask) +Entry *elist_find_mask(EList *list, const Anope::string &mask) { Entry *e; - if (!list || !list->entries || !mask) + if (!list || !list->entries || mask.empty()) return NULL; for (e = list->entries; e; e = e->next) - if (!stricmp(e->mask, mask)) + if (e->mask.equals_ci(mask)) return e; return NULL; @@ -1867,14 +1773,14 @@ long get_memuse(EList *list) { for (e = list->entries; e; e = e->next) { - if (e->nick) - mem += strlen(e->nick) + 1; - if (e->user) - mem += strlen(e->user) + 1; - if (e->host) - mem += strlen(e->host) + 1; - if (e->mask) - mem += strlen(e->mask) + 1; + if (!e->nick.empty()) + mem += e->nick.length() + 1; + if (!e->user.empty()) + mem += e->user.length() + 1; + if (!e->host.empty()) + mem += e->host.length() + 1; + if (!e->mask.empty()) + mem += e->mask.length() + 1; } } diff --git a/src/chanserv.cpp b/src/chanserv.cpp index 27cb159ce..bcfe239cd 100644 --- a/src/chanserv.cpp +++ b/src/chanserv.cpp @@ -66,16 +66,16 @@ LevelInfo levelinfo[] = { { CA_AUTOHALFOP, "AUTOHALFOP", CHAN_LEVEL_AUTOHALFOP }, { CA_AUTOOP, "AUTOOP", CHAN_LEVEL_AUTOOP }, { CA_AUTOPROTECT, "AUTOPROTECT", CHAN_LEVEL_AUTOPROTECT }, - { CA_AUTOVOICE, "AUTOVOICE", CHAN_LEVEL_AUTOVOICE }, + { CA_AUTOVOICE, "AUTOVOICE", CHAN_LEVEL_AUTOVOICE }, { CA_NOJOIN, "NOJOIN", CHAN_LEVEL_NOJOIN }, { CA_SIGNKICK, "SIGNKICK", CHAN_LEVEL_SIGNKICK }, { CA_ACCESS_LIST, "ACC-LIST", CHAN_LEVEL_ACCESS_LIST }, { CA_ACCESS_CHANGE, "ACC-CHANGE", CHAN_LEVEL_ACCESS_CHANGE }, - { CA_AKICK, "AKICK", CHAN_LEVEL_AKICK }, + { CA_AKICK, "AKICK", CHAN_LEVEL_AKICK }, { CA_SET, "SET", CHAN_LEVEL_SET }, { CA_BAN, "BAN", CHAN_LEVEL_BAN }, - { CA_BANME, "BANME", CHAN_LEVEL_BANME }, - { CA_CLEAR, "CLEAR", CHAN_LEVEL_CLEAR }, + { CA_BANME, "BANME", CHAN_LEVEL_BANME }, + { CA_CLEAR, "CLEAR", CHAN_LEVEL_CLEAR }, { CA_GETKEY, "GETKEY", CHAN_LEVEL_GETKEY }, { CA_HALFOP, "HALFOP", CHAN_LEVEL_HALFOP }, { CA_HALFOPME, "HALFOPME", CHAN_LEVEL_HALFOPME }, @@ -86,20 +86,20 @@ LevelInfo levelinfo[] = { { CA_OPDEOP, "OPDEOP", CHAN_LEVEL_OPDEOP }, { CA_OPDEOPME, "OPDEOPME", CHAN_LEVEL_OPDEOPME }, { CA_PROTECT, "PROTECT", CHAN_LEVEL_PROTECT }, - { CA_PROTECTME, "PROTECTME", CHAN_LEVEL_PROTECTME }, - { CA_TOPIC, "TOPIC", CHAN_LEVEL_TOPIC }, - { CA_UNBAN, "UNBAN", CHAN_LEVEL_UNBAN }, - { CA_VOICE, "VOICE", CHAN_LEVEL_VOICE }, + { CA_PROTECTME, "PROTECTME", CHAN_LEVEL_PROTECTME }, + { CA_TOPIC, "TOPIC", CHAN_LEVEL_TOPIC }, + { CA_UNBAN, "UNBAN", CHAN_LEVEL_UNBAN }, + { CA_VOICE, "VOICE", CHAN_LEVEL_VOICE }, { CA_VOICEME, "VOICEME", CHAN_LEVEL_VOICEME }, { CA_MEMO, "MEMO", CHAN_LEVEL_MEMO }, { CA_ASSIGN, "ASSIGN", CHAN_LEVEL_ASSIGN }, { CA_BADWORDS, "BADWORDS", CHAN_LEVEL_BADWORDS }, { CA_FANTASIA, "FANTASIA", CHAN_LEVEL_FANTASIA }, - { CA_GREET, "GREET", CHAN_LEVEL_GREET }, + { CA_GREET, "GREET", CHAN_LEVEL_GREET }, { CA_NOKICK, "NOKICK", CHAN_LEVEL_NOKICK }, { CA_SAY, "SAY", CHAN_LEVEL_SAY }, - { CA_AUTOOWNER, "AUTOOWNER", CHAN_LEVEL_AUTOOWNER }, - { CA_OWNER, "OWNER", CHAN_LEVEL_OWNER }, + { CA_AUTOOWNER, "AUTOOWNER", CHAN_LEVEL_AUTOOWNER }, + { CA_OWNER, "OWNER", CHAN_LEVEL_OWNER }, { CA_OWNERME, "OWNERME", CHAN_LEVEL_OWNERME }, { CA_FOUNDER, "FOUNDER", CHAN_LEVEL_FOUNDER }, { -1 } @@ -117,43 +117,38 @@ void moduleAddChanServCmds() /* Returns modes for mlock in a nice way. */ -char *get_mlock_modes(ChannelInfo *ci, int complete) +Anope::string get_mlock_modes(ChannelInfo *ci, int complete) { - static char res[BUFSIZE]; - char *end, *value; ChannelMode *cm; ChannelModeParam *cmp; std::map<char, ChannelMode *>::iterator it, it_end; - std::string param; - - memset(&res, '\0', sizeof(res)); - end = res; + Anope::string res, param; if (ci->GetMLockCount(true) || ci->GetMLockCount(false)) { if (ci->GetMLockCount(true)) { - *end++ = '+'; + res += '+'; for (it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) { cm = it->second; if (ci->HasMLock(cm->Name, true)) - *end++ = it->first; + res += it->first; } } if (ci->GetMLockCount(false)) { - *end++ = '-'; + res += '-'; for (it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) { cm = it->second; if (ci->HasMLock(cm->Name, false)) - *end++ = it->first; + res += it->first; } } @@ -170,13 +165,7 @@ char *get_mlock_modes(ChannelInfo *ci, int complete) ci->GetParam(cmp->Name, param); if (!param.empty()) - { - value = const_cast<char *>(param.c_str()); - - *end++ = ' '; - while (*value) - *end++ = *value++; - } + res += " " + param; } } } @@ -192,7 +181,7 @@ char *get_mlock_modes(ChannelInfo *ci, int complete) void get_chanserv_stats(long *nrec, long *memuse) { long count = 0, mem = 0; - std::string param; + Anope::string param; for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it) { @@ -200,8 +189,8 @@ void get_chanserv_stats(long *nrec, long *memuse) ++count; mem += sizeof(*ci); - if (ci->desc) - mem += strlen(ci->desc) + 1; + if (!ci->desc.empty()) + mem += ci->desc.length() + 1; mem += ci->GetAccessCount() * sizeof(ChanAccess); mem += ci->GetAkickCount() * sizeof(AutoKick); @@ -214,21 +203,21 @@ void get_chanserv_stats(long *nrec, long *memuse) if (ci->GetParam(CMODE_REDIRECT, param)) mem += param.length() + 1; - if (ci->last_topic) - mem += strlen(ci->last_topic) + 1; - if (ci->entry_message) - mem += strlen(ci->entry_message) + 1; - if (ci->forbidby) - mem += strlen(ci->forbidby) + 1; - if (ci->forbidreason) - mem += strlen(ci->forbidreason) + 1; + if (!ci->last_topic.empty()) + mem += ci->last_topic.length() + 1; + if (!ci->entry_message.empty()) + mem += ci->entry_message.length() + 1; + if (!ci->forbidby.empty()) + mem += ci->forbidby.length() + 1; + if (!ci->forbidreason.empty()) + mem += ci->forbidreason.length() + 1; if (ci->levels) mem += sizeof(*ci->levels) * CA_SIZE; unsigned memos = ci->memos.memos.size(); mem += memos * sizeof(Memo); for (unsigned j = 0; j < memos; ++j) - if (ci->memos.memos[j]->text) - mem += strlen(ci->memos.memos[j]->text) + 1; + if (!ci->memos.memos[j]->text.empty()) + mem += ci->memos.memos[j]->text.length() + 1; if (ci->ttb) mem += sizeof(*ci->ttb) * TTB_SIZE; mem += ci->GetBadWordCount() * sizeof(BadWord); @@ -251,17 +240,17 @@ void cs_init() /* Main ChanServ routine. */ -void chanserv(User *u, const std::string &buf) +void chanserv(User *u, const Anope::string &buf) { if (!u || buf.empty()) return; - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_ci("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string command = buf; + Anope::string command = buf; command.erase(command.begin()); command.erase(command.end()); - ircdproto->SendCTCP(ChanServ, u->nick.c_str(), "%s", command.c_str()); + ircdproto->SendCTCP(ChanServ, u->nick, "%s", command.c_str()); } else mod_run_cmd(ChanServ, u, buf); @@ -279,7 +268,7 @@ void check_modes(Channel *c) ChannelInfo *ci; ChannelMode *cm; std::map<char, ChannelMode *>::iterator it, it_end; - std::string param, ciparam; + Anope::string param, ciparam; if (!c) { @@ -326,8 +315,8 @@ void check_modes(Channel *c) /* Add the eventual parameter and modify the Channel structure */ if (cm->Type == MODE_PARAM) { - if (ci->GetParam(cm->Name, param)) - c->SetMode(NULL, cm, param); + if (ci->GetParam(cm->Name, ciparam)) + c->SetMode(NULL, cm, ciparam); } else c->SetMode(NULL, cm); @@ -339,7 +328,7 @@ void check_modes(Channel *c) ci->GetParam(cm->Name, ciparam); /* If the channel doesnt have the mode, or it does and it isn't set correctly */ - if (!c->HasMode(cm->Name) || (!param.empty() && !ciparam.empty() && param != ciparam)) + if (!c->HasMode(cm->Name) || (!param.empty() && !ciparam.empty() && !param.equals_cs(ciparam))) c->SetMode(NULL, cm, ciparam); } } @@ -386,7 +375,7 @@ int check_valid_admin(User *user, Channel *chan, int servermode) if (servermode && !check_access(user, chan->ci, CA_AUTOPROTECT)) { - notice_lang(Config.s_ChanServ, user, CHAN_IS_REGISTERED, Config.s_ChanServ); + notice_lang(Config.s_ChanServ, user, CHAN_IS_REGISTERED, Config.s_ChanServ.c_str()); chan->RemoveMode(NULL, CMODE_PROTECT, user->nick); return 0; } @@ -422,7 +411,7 @@ int check_valid_op(User *user, Channel *chan, int servermode) if (servermode && !check_access(user, chan->ci, CA_AUTOOP)) { - notice_lang(Config.s_ChanServ, user, CHAN_IS_REGISTERED, Config.s_ChanServ); + notice_lang(Config.s_ChanServ, user, CHAN_IS_REGISTERED, Config.s_ChanServ.c_str()); if (owner) chan->RemoveMode(NULL, CMODE_OWNER, user->nick); @@ -456,7 +445,7 @@ int check_valid_op(User *user, Channel *chan, int servermode) /* Record the current channel topic in the ChannelInfo structure. */ -void record_topic(const char *chan) +void record_topic(const Anope::string &chan) { Channel *c; ChannelInfo *ci; @@ -468,14 +457,7 @@ void record_topic(const char *chan) if (!c || !(ci = c->ci)) return; - if (ci->last_topic) - delete [] ci->last_topic; - - if (c->topic) - ci->last_topic = sstrdup(c->topic); - else - ci->last_topic = NULL; - + ci->last_topic = c->topic; ci->last_topic_setter = c->topic_setter; ci->last_topic_time = c->topic_time; } @@ -484,7 +466,7 @@ void record_topic(const char *chan) /* Restore the topic in a channel when it's created, if we should. */ -void restore_topic(const char *chan) +void restore_topic(const Anope::string &chan) { Channel *c = findchan(chan); ChannelInfo *ci; @@ -493,27 +475,25 @@ void restore_topic(const char *chan) return; /* We can be sure that the topic will be in sync when we return -GD */ c->topic_sync = 1; - if (!(ci->HasFlag(CI_KEEPTOPIC))) + if (!ci->HasFlag(CI_KEEPTOPIC)) { /* We need to reset the topic here, since it's currently empty and * should be updated with a TOPIC from the IRCd soon. -GD */ - ci->last_topic = NULL; + ci->last_topic.clear(); ci->last_topic_setter = whosends(ci)->nick; ci->last_topic_time = time(NULL); return; } - if (c->topic) - delete [] c->topic; - if (ci->last_topic) + if (!ci->last_topic.empty()) { - c->topic = sstrdup(ci->last_topic); + c->topic = ci->last_topic; c->topic_setter = ci->last_topic_setter; c->topic_time = ci->last_topic_time; } else { - c->topic = NULL; + c->topic.clear(); c->topic_setter = whosends(ci)->nick; } if (ircd->join2set && whosends(ci) == ChanServ) @@ -521,7 +501,7 @@ void restore_topic(const char *chan) ChanServ->Join(chan); c->SetMode(NULL, CMODE_OP, Config.s_ChanServ); } - ircdproto->SendTopic(whosends(ci), c, c->topic_setter.c_str(), c->topic ? c->topic : ""); + ircdproto->SendTopic(whosends(ci), c, c->topic_setter, c->topic); if (ircd->join2set && whosends(ci) == ChanServ) ChanServ->Part(c); } @@ -544,16 +524,14 @@ int check_topiclock(Channel *c, time_t topic_time) if (!(ci = c->ci) || !ci->HasFlag(CI_TOPICLOCK)) return 0; - if (c->topic) - delete [] c->topic; - if (ci->last_topic) + if (!ci->last_topic.empty()) { - c->topic = sstrdup(ci->last_topic); + c->topic = ci->last_topic; c->topic_setter = ci->last_topic_setter; } else { - c->topic = NULL; + c->topic.clear(); /* Bot assigned & Symbiosis ON?, the bot will set the topic - doc */ /* Altough whosends() also checks for Config.BSMinUsers -GD */ c->topic_setter = whosends(ci)->nick; @@ -571,7 +549,7 @@ int check_topiclock(Channel *c, time_t topic_time) else { /* If no last topic, we can't use last topic time! - doc */ - if (ci->last_topic) + if (!ci->last_topic.empty()) c->topic_time = ci->last_topic_time; else c->topic_time = time(NULL) + 1; @@ -583,7 +561,7 @@ int check_topiclock(Channel *c, time_t topic_time) c->SetMode(NULL, CMODE_OP, Config.s_ChanServ); } - ircdproto->SendTopic(whosends(ci), c, c->topic_setter.c_str(), c->topic ? c->topic : ""); + ircdproto->SendTopic(whosends(ci), c, c->topic_setter, c->topic); if (ircd->join2set && whosends(ci) == ChanServ) ChanServ->Part(c); @@ -613,11 +591,10 @@ void expire_chans() if (MOD_RESULT == EVENT_STOP) continue; - char *chname = sstrdup(ci->name.c_str()); + Anope::string chname = ci->name; Alog() << "Expiring channel " << ci->name << " (founder: " << (ci->founder ? ci->founder->display : "(none)") << " )"; delete ci; FOREACH_MOD(I_OnChanExpire, OnChanExpire(chname)); - delete [] chname; } } } @@ -651,7 +628,7 @@ void cs_remove_nick(const NickCore *nc) Alog() << Config.s_ChanServ << ": Transferring foundership of " << ci->name << " from deleted nick " << nc->display << " to successor " << nc2->display; ci->founder = nc2; ci->successor = NULL; - nc2->channelcount++; + ++nc2->channelcount; } } else @@ -692,17 +669,7 @@ void cs_remove_nick(const NickCore *nc) /*************************************************************************/ -ChannelInfo *cs_findchan(const char *chan) -{ - return cs_findchan(ci::string(chan)); -} - -ChannelInfo *cs_findchan(const std::string &chan) -{ - return cs_findchan(ci::string(chan.c_str())); -} - -ChannelInfo *cs_findchan(const ci::string &chan) +ChannelInfo *cs_findchan(const Anope::string &chan) { registered_channel_map::const_iterator it = RegisteredChannelList.find(chan); @@ -744,7 +711,7 @@ int check_access(User *user, ChannelInfo *ci, int what) return what == CA_AUTODEOP || what == CA_NOJOIN ? 0 : 1; /* Hacks to make flags work */ - if (what == CA_AUTODEOP && (ci->HasFlag(CI_SECUREOPS)) && !level) + if (what == CA_AUTODEOP && ci->HasFlag(CI_SECUREOPS) && !level) return 1; if (what == CA_AUTODEOP || what == CA_NOJOIN) @@ -829,7 +796,7 @@ int get_access(User *user, ChannelInfo *ci) NickAlias *na = findnick(user->nick); if (na) access = ci->GetAccess(na->nc); - if (access && user->IsRecognized() && !(ci->HasFlag(CI_SECURE))) + if (access && user->IsRecognized() && !ci->HasFlag(CI_SECURE)) return access->level; } @@ -855,34 +822,33 @@ void update_cs_lastseen(User *user, ChannelInfo *ci) /* Returns the best ban possible for an user depending of the bantype value. */ -int get_idealban(ChannelInfo *ci, User *u, char *ret, int retlen) +int get_idealban(ChannelInfo *ci, User *u, Anope::string &ret) { - char *mask; + Anope::string mask; - if (!ci || !u || !ret || retlen == 0) + if (!ci || !u) return 0; - std::string vident = u->GetIdent(); + Anope::string vident = u->GetIdent(); switch (ci->bantype) { case 0: - snprintf(ret, retlen, "*!%s@%s", vident.c_str(), u->GetDisplayedHost().c_str()); + ret = "*!" + vident + "@" + u->GetDisplayedHost(); return 1; case 1: if (vident[0] == '~') - snprintf(ret, retlen, "*!*%s@%s", vident.c_str(), u->GetDisplayedHost().c_str()); + ret = "*!*" + vident + "@" + u->GetDisplayedHost(); else - snprintf(ret, retlen, "*!%s@%s", vident.c_str(), u->GetDisplayedHost().c_str()); + ret = "*!" + vident + "@" + u->GetDisplayedHost(); return 1; case 2: - snprintf(ret, retlen, "*!*@%s", u->GetDisplayedHost().c_str()); + ret = "*!*@" + u->GetDisplayedHost(); return 1; case 3: mask = create_mask(u); - snprintf(ret, retlen, "*!%s", mask); - delete [] mask; + ret = "*!" + mask; return 1; default: @@ -892,17 +858,15 @@ int get_idealban(ChannelInfo *ci, User *u, char *ret, int retlen) /*************************************************************************/ -int get_access_level(ChannelInfo *ci, NickAlias *na) +int get_access_level(ChannelInfo *ci, NickCore *nc) { - ChanAccess *access; - - if (!ci || !na) + if (!ci || !nc) return 0; - if (na->nc == ci->founder) + if (nc == ci->founder) return ACCESS_FOUNDER; - access = ci->GetAccess(na->nc); + ChanAccess *access = ci->GetAccess(nc); if (!access) return 0; @@ -910,23 +874,15 @@ int get_access_level(ChannelInfo *ci, NickAlias *na) return access->level; } -int get_access_level(ChannelInfo *ci, NickCore *nc) +int get_access_level(ChannelInfo *ci, NickAlias *na) { - if (!ci || !nc) + if (!na) return 0; - if (nc == ci->founder) - return ACCESS_FOUNDER; - - ChanAccess *access = ci->GetAccess(nc); - - if (!access) - return 0; - else - return access->level; + return get_access_level(ci, na->nc); } -const char *get_xop_level(int level) +Anope::string get_xop_level(int level) { ChannelMode *halfop = ModeManager::FindChannelModeByName(CMODE_HALFOP); @@ -954,7 +910,7 @@ const char *get_xop_level(int level) /* Is the mask stuck? */ -AutoKick *is_stuck(ChannelInfo * ci, const char *mask) +AutoKick *is_stuck(ChannelInfo *ci, const Anope::string &mask) { if (!ci) return NULL; @@ -966,11 +922,11 @@ AutoKick *is_stuck(ChannelInfo * ci, const char *mask) if (akick->HasFlag(AK_ISNICK) || !akick->HasFlag(AK_STUCK)) continue; - if (Anope::Match(akick->mask, mask, false)) + if (Anope::Match(akick->mask, mask)) return akick; if (ircd->reversekickcheck) - if (Anope::Match(mask, akick->mask, false)) + if (Anope::Match(mask, akick->mask)) return akick; } @@ -992,21 +948,21 @@ void stick_mask(ChannelInfo *ci, AutoKick *akick) { /* If akick is already covered by a wider ban. Example: c->bans[i] = *!*@*.org and akick->u.mask = *!*@*.epona.org */ - if (entry_match_mask(ban, akick->mask.c_str(), 0)) + if (entry_match_mask(ban, akick->mask, 0)) return; if (ircd->reversekickcheck) { /* If akick is wider than a ban already in place. Example: c->bans[i] = *!*@irc.epona.org and akick->u.mask = *!*@*.epona.org */ - if (Anope::Match(ban->mask, akick->mask.c_str(), false)) + if (Anope::Match(ban->mask, akick->mask)) return; } } } /* Falling there means set the ban */ - ci->c->SetMode(NULL, CMODE_BAN, akick->mask.c_str()); + ci->c->SetMode(NULL, CMODE_BAN, akick->mask); } /* Ban the stuck mask in a safe manner. */ @@ -1023,7 +979,7 @@ void stick_all(ChannelInfo *ci) if (akick->HasFlag(AK_ISNICK) || !akick->HasFlag(AK_STUCK)) continue; - ci->c->SetMode(NULL, CMODE_BAN, akick->mask.c_str()); + ci->c->SetMode(NULL, CMODE_BAN, akick->mask); } } diff --git a/src/command.cpp b/src/command.cpp index 5c4bc4ee4..de9842d78 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -8,7 +8,7 @@ #include "services.h" #include "modules.h" -Command::Command(const ci::string &sname, size_t min_params, size_t max_params, const ci::string &spermission) : MaxParams(max_params), MinParams(min_params), name(sname), permission(spermission) +Command::Command(const Anope::string &sname, size_t min_params, size_t max_params, const Anope::string &spermission) : MaxParams(max_params), MinParams(min_params), name(sname), permission(spermission) { this->module = NULL; this->service = NULL; @@ -18,20 +18,18 @@ Command::~Command() { } -CommandReturn Command::Execute(User *u, const std::vector<ci::string> &) +CommandReturn Command::Execute(User *u, const std::vector<Anope::string> &) { return MOD_CONT; } void Command::OnServHelp(User *u) { } -bool Command::OnHelp(User *u, const ci::string &subcommand) { return false; } +bool Command::OnHelp(User *u, const Anope::string &subcommand) { return false; } -void Command::OnSyntaxError(User *u, const ci::string &subcommand) -{ -} +void Command::OnSyntaxError(User *u, const Anope::string &subcommand) { } -void Command::SetPermission(const ci::string &reststr) +void Command::SetPermission(const Anope::string &reststr) { this->permission = reststr; } @@ -41,7 +39,7 @@ bool Command::AddSubcommand(Command *c) return false; } -bool Command::DelSubcommand(const ci::string &cname) +bool Command::DelSubcommand(const Anope::string &cname) { return false; } diff --git a/src/commands.cpp b/src/commands.cpp index ebe189fd4..2647ea952 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -14,12 +14,12 @@ #include "language.h" #include "hashcomp.h" -Command *FindCommand(BotInfo *bi, const ci::string &name) +Command *FindCommand(BotInfo *bi, const Anope::string &name) { if (!bi || bi->Commands.empty() || name.empty()) return NULL; - std::map<ci::string, Command *>::iterator it = bi->Commands.find(name); + CommandMap::iterator it = bi->Commands.find(name); if (it != bi->Commands.end()) return it->second; @@ -27,16 +27,16 @@ Command *FindCommand(BotInfo *bi, const ci::string &name) return NULL; } -void mod_run_cmd(BotInfo *bi, User *u, const std::string &message) +void mod_run_cmd(BotInfo *bi, User *u, const Anope::string &message) { - spacesepstream sep(ci::string(message.c_str())); - ci::string cmd; + spacesepstream sep(message); + Anope::string cmd; if (sep.GetToken(cmd)) - mod_run_cmd(bi, u, FindCommand(bi, cmd), cmd, sep.GetRemaining().c_str()); + mod_run_cmd(bi, u, FindCommand(bi, cmd), cmd, sep.GetRemaining()); } -void mod_run_cmd(BotInfo *bi, User *u, Command *c, const ci::string &command, const ci::string &message) +void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command, const Anope::string &message) { if (!bi || !u) return; @@ -57,22 +57,19 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const ci::string &command, co // Command requires registered users only if (!c->HasFlag(CFLAG_ALLOW_UNREGISTERED) && !u->IsIdentified()) { - notice_lang(bi->nick, u, NICK_IDENTIFY_REQUIRED, Config.s_NickServ); + notice_lang(bi->nick, u, NICK_IDENTIFY_REQUIRED, Config.s_NickServ.c_str()); Alog() << "Access denied for unregistered user " << u->nick << " with service " << bi->nick << " and command " << command; return; } - std::vector<ci::string> params; - ci::string curparam, endparam; + std::vector<Anope::string> params; + Anope::string curparam, endparam; spacesepstream sep(message); while (sep.GetToken(curparam)) { // - 1 because params[0] corresponds with a maxparam of 1. - if (params.size() >= (c->MaxParams - 1)) - { - endparam += curparam; - endparam += " "; - } + if (params.size() >= c->MaxParams - 1) + endparam += curparam + " "; else params.push_back(curparam); } @@ -80,7 +77,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const ci::string &command, co if (!endparam.empty()) { // Remove trailing space - endparam.erase(endparam.size() - 1, endparam.size()); + endparam.erase(endparam.length() - 1); // Add it params.push_back(endparam); @@ -98,7 +95,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const ci::string &command, co if (params.size() > 0 && !c->HasFlag(CFLAG_STRIP_CHANNEL) && (bi == ChanServ || bi == BotServ)) { - if (ircdproto->IsChannelValid(params[0].c_str())) + if (ircdproto->IsChannelValid(params[0])) { ChannelInfo *ci = cs_findchan(params[0]); if (ci) @@ -142,7 +139,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const ci::string &command, co if (ret == MOD_CONT) { - FOREACH_MOD(I_OnPostCommand, OnPostCommand(u, c->service, c->name.c_str(), params)); + FOREACH_MOD(I_OnPostCommand, OnPostCommand(u, c->service, c->name, params)); } } @@ -154,18 +151,18 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const ci::string &command, co * @param cmd Command * @return void */ -void mod_help_cmd(BotInfo *bi, User *u, const ci::string &cmd) +void mod_help_cmd(BotInfo *bi, User *u, const Anope::string &cmd) { if (!bi || !u || cmd.empty()) return; spacesepstream tokens(cmd); - ci::string token; + Anope::string token; tokens.GetToken(token); Command *c = FindCommand(bi, token); - ci::string subcommand = tokens.StreamEnd() ? "" : tokens.GetRemaining().c_str(); + Anope::string subcommand = tokens.StreamEnd() ? "" : tokens.GetRemaining(); if (!c || (Config.HidePrivilegedCommands && !c->permission.empty() && (!u->Account() || !u->Account()->HasCommand(c->permission))) || !c->OnHelp(u, subcommand)) notice_lang(bi->nick, u, NO_HELP_AVAILABLE, cmd.c_str()); diff --git a/src/compat.cpp b/src/compat.cpp deleted file mode 100644 index 2fdb57b86..000000000 --- a/src/compat.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* Compatibility routines. - * - * (C) 2003-2010 Anope Team - * Contact us at team@anope.org - * - * Please read COPYING and README for further details. - * - * Based on the original code of Epona by Lara. - * Based on the original code of Services by Andy Church. - */ - -#include "services.h" - -/*************************************************************************/ - -#if !HAVE_STRICMP && !HAVE_STRCASECMP - -/* stricmp, strnicmp: Case-insensitive versions of strcmp() and - * strncmp(). - */ - -int stricmp(const char *s1, const char *s2) -{ - register int c; - - while ((c = tolower(*s1)) == tolower(*s2)) - { - if (!c) - return 0; - ++s1; - ++s2; - } - if (c < tolower(*s2)) - return -1; - return 1; -} - -int strnicmp(const char *s1, const char *s2, size_t len) -{ - register int c; - - if (!len) - return 0; - while ((c = tolower(*s1)) == tolower(*s2) && len > 0) - { - if (!c || !--len) - return 0; - ++s1; - ++s2; - } - if (c < tolower(*s2)) - return -1; - return 1; -} - -#endif - -/*************************************************************************/ diff --git a/src/config.cpp b/src/config.cpp index 61f9d586f..c9dcf426a 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -15,29 +15,28 @@ /*************************************************************************/ -ci::string services_conf = "services.conf"; // Services configuration file name +Anope::string services_conf = "services.conf"; // Services configuration file name ServerConfig Config; -static ci::string Modules; -static ci::string EncModules; -static ci::string DBModules; -static ci::string SocketEngineModule; -static ci::string HostCoreModules; -static ci::string MemoCoreModules; -static ci::string BotCoreModules; -static ci::string OperCoreModules; -static ci::string NickCoreModules; -static ci::string ChanCoreModules; -static ci::string DefCon1; -static ci::string DefCon2; -static ci::string DefCon3; -static ci::string DefCon4; -static char *UlineServers; -static ci::string OSNotifications; -static ci::string BSDefaults; -static ci::string CSDefaults; -static char *temp_nsuserhost; -static ci::string NSDefaults; +static Anope::string Modules; +static Anope::string EncModules; +static Anope::string DBModules; +static Anope::string HostCoreModules; +static Anope::string MemoCoreModules; +static Anope::string BotCoreModules; +static Anope::string OperCoreModules; +static Anope::string NickCoreModules; +static Anope::string ChanCoreModules; +static Anope::string DefCon1; +static Anope::string DefCon2; +static Anope::string DefCon3; +static Anope::string DefCon4; +static Anope::string UlineServers; +static Anope::string OSNotifications; +static Anope::string BSDefaults; +static Anope::string CSDefaults; +static Anope::string temp_nsuserhost; +static Anope::string NSDefaults; /*************************************************************************/ @@ -51,48 +50,43 @@ void ServerConfig::ClearStack() include_stack.clear(); } -bool ServerConfig::CheckOnce(const char *tag) +bool ServerConfig::CheckOnce(const Anope::string &tag) { int count = ConfValueEnum(config_data, tag); if (count > 1) - throw ConfigException(std::string("You have more than one <") + tag + "> tag, this is not permitted."); + throw ConfigException("You have more than one <" + tag + "> tag, this is not permitted."); if (count < 1) - throw ConfigException(std::string("You have not defined a <") + tag + "> tag, this is required."); + throw ConfigException("You have not defined a <" + tag + "> tag, this is required."); return true; } -bool NoValidation(ServerConfig *, const char *, const char *, ValueItem &) +bool NoValidation(ServerConfig *, const Anope::string &, const Anope::string &, ValueItem &) { return true; } -bool DoneConfItem(ServerConfig *, const char *) +void ServerConfig::ValidateNoSpaces(const Anope::string &p, const Anope::string &tag, const Anope::string &val) { - return true; -} - -void ServerConfig::ValidateNoSpaces(const char *p, const ci::string &tag, const ci::string &val) -{ - for (const char *ptr = p; *ptr; ++ptr) + for (Anope::string::const_iterator ptr = p.begin(), end = p.end(); ptr != end; ++ptr) if (*ptr == ' ') - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> cannot contain spaces"); + throw ConfigException("The value of <" + tag + ":" + val + "> cannot contain spaces"); } /* NOTE: Before anyone asks why we're not using inet_pton for this, it is because inet_pton and friends do not return so much detail, * even in strerror(errno). They just return 'yes' or 'no' to an address without such detail as to whats WRONG with the address. * Because ircd users arent as technical as they used to be (;)) we are going to give more of a useful error message. */ -void ServerConfig::ValidateIP(const char *p, const ci::string &tag, const ci::string &val, bool wild) +void ServerConfig::ValidateIP(const Anope::string &p, const Anope::string &tag, const Anope::string &val, bool wild) { int num_dots = 0, num_seps = 0; bool not_numbers = false, not_hex = false; - if (*p) + if (!p.empty()) { - if (*p == '.') - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is not an IP address"); + if (p[0] == '.') + throw ConfigException("The value of <" + tag + ":" + val + "> is not an IP address"); - for (const char *ptr = p; *ptr; ++ptr) + for (Anope::string::const_iterator ptr = p.begin(), end = p.end(); ptr != end; ++ptr) { if (wild && (*ptr == '*' || *ptr == '?' || *ptr == '/')) continue; @@ -106,7 +100,7 @@ void ServerConfig::ValidateIP(const char *p, const ci::string &tag, const ci::st switch (*ptr) { case ' ': - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is not an IP address"); + throw ConfigException("The value of <" + tag + ":" + val + "> is not an IP address"); case '.': ++num_dots; break; @@ -115,41 +109,41 @@ void ServerConfig::ValidateIP(const char *p, const ci::string &tag, const ci::st } } if (num_dots > 3) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is an IPv4 address with too many fields!"); + throw ConfigException("The value of <" + tag + ":" + val + "> is an IPv4 address with too many fields!"); if (num_seps > 8) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is an IPv6 address with too many fields!"); + throw ConfigException("The value of <" + tag + ":" + val + "> is an IPv6 address with too many fields!"); if (!num_seps && num_dots < 3 && !wild) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> looks to be a malformed IPv4 address"); + throw ConfigException("The value of <" + tag + ":" + val + "> looks to be a malformed IPv4 address"); if (!num_seps && num_dots == 3 && not_numbers) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> contains non-numeric characters in an IPv4 address"); + throw ConfigException("The value of <" + tag + ":" + val + "> contains non-numeric characters in an IPv4 address"); if (num_seps && not_hex) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> contains non-hexdecimal characters in an IPv6 address"); + throw ConfigException("The value of <" + tag + ":" + val + "> contains non-hexdecimal characters in an IPv6 address"); if (num_seps && num_dots != 3 && num_dots && !wild) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is a malformed IPv6 4in6 address"); + throw ConfigException("The value of <" + tag + ":" + val + "> is a malformed IPv6 4in6 address"); } } -void ServerConfig::ValidateHostname(const char *p, const ci::string &tag, const ci::string &val) +void ServerConfig::ValidateHostname(const Anope::string &p, const Anope::string &tag, const Anope::string &val) { - if (!strcasecmp(p, "localhost")) + if (p.equals_ci("localhost")) return; int num_dots = 0, num_seps = 0; - if (*p) + if (!p.empty()) { - if (*p == '.') - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is not a valid hostname"); - for (const char *ptr = p; *ptr; ++ptr) + if (p[0] == '.') + throw ConfigException("The value of <" + tag + ":" + val + "> is not a valid hostname"); + for (unsigned i = 0, end = p.length(); i < end; ++i) { - switch (*ptr) + switch (p[i]) { case ' ': - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is not a valid hostname"); + throw ConfigException("The value of <" + tag + ":" + val + "> is not a valid hostname"); case '.': ++num_dots; break; @@ -159,72 +153,70 @@ void ServerConfig::ValidateHostname(const char *p, const ci::string &tag, const } } if (!num_dots && !num_seps) - throw ConfigException(ci::string("The value of <") + tag + ":" + val + "> is not a valid hostname"); + throw ConfigException("The value of <" + tag + ":" + val + "> is not a valid hostname"); } } -bool ValidateNotEmpty(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateNotEmpty(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { if (data.GetValue().empty()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty!"); + throw ConfigException("The value for <" + tag + ":" + value + "> cannot be empty!"); return true; } -bool ValidateNotZero(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateNotZero(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { - if (!data.GetInteger()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be non-zero!"); + if (!data.GetInteger() && !dotime(data.GetValue())) + throw ConfigException("The value for <" + tag + ":" + value + "> must be non-zero!"); return true; } -bool ValidateEmailReg(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateEmailReg(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { if (Config.NSEmailReg) { - if (ci::string(value) == "preregexpire") + if (value.equals_ci("preregexpire")) { if (!data.GetInteger()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be non-zero when e-mail registration are enabled!"); + throw ConfigException("The value for <" + tag + ":" + value + "> must be non-zero when e-mail registration are enabled!"); } else { if (!data.GetBool()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be set to yes when e-mail registrations are enabled!"); + throw ConfigException("The value for <" + tag + ":" + value + "> must be set to yes when e-mail registrations are enabled!"); } } return true; } -bool ValidatePort(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidatePort(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { int port = data.GetInteger(); if (!port) return true; if (port < 1 || port > 65535) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> is not a value port, it must be between 1 and 65535!"); + throw ConfigException("The value for <" + tag + ":" + value + "> is not a value port, it must be between 1 and 65535!"); return true; } -bool ValidateLanguage(ServerConfig *, const char *, const char *, ValueItem &data) +bool ValidateLanguage(ServerConfig *, const Anope::string &, const Anope::string &, ValueItem &data) { int language = data.GetInteger(); - char maxlang[3]; - snprintf(maxlang, 3, "%d", USED_LANGS); if (language < 1 || language > USED_LANGS) - throw ConfigException(std::string("The value for <nickserv:defaultlanguage> must be between 1 and ") + maxlang + "!"); + throw ConfigException("The value for <nickserv:defaultlanguage> must be between 1 and " + stringify(USED_LANGS) + "!"); data.Set(--language); return true; } -bool ValidateGuestPrefix(ServerConfig *conf, const char *tag, const char *value, ValueItem &data) +bool ValidateGuestPrefix(ServerConfig *conf, const Anope::string &tag, const Anope::string &value, ValueItem &data) { ValidateNotEmpty(conf, tag, value, data); - if (data.GetValue().size() > 21) + if (data.GetValue().length() > 21) throw ConfigException("The value for <nickserv:guestnickprefix> cannot exceed 21 characters in length!"); return true; } -bool ValidateBantype(ServerConfig *, const char *, const char *, ValueItem &data) +bool ValidateBantype(ServerConfig *, const Anope::string &, const Anope::string &, ValueItem &data) { int bantype = data.GetInteger(); if (bantype < 0 || bantype > 3) @@ -232,53 +224,53 @@ bool ValidateBantype(ServerConfig *, const char *, const char *, ValueItem &data return true; } -bool ValidateBotServ(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateBotServ(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { - if (Config.s_BotServ) + if (!Config.s_BotServ.empty()) { - if (ci::string(value) == "description") + if (value.equals_ci("description")) { if (data.GetValue().empty()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when BotServ is enabled!"); + throw ConfigException("The value for <" + tag + ":" + value + "> cannot be empty when BotServ is enabled!"); } - else if (ci::string(value) == "minusers" || ci::string(value) == "badwordsmax" || ci::string(value) == "keepdata") + else if (value.equals_ci("minusers") || value.equals_ci("badwordsmax") || value.equals_ci("keepdata")) { - if (!data.GetInteger()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be non-zero when BotServ is enabled!"); + if (!data.GetInteger() && !dotime(data.GetValue())) + throw ConfigException("The value for <" + tag + ":" + value + "> must be non-zero when BotServ is enabled!"); } } return true; } -bool ValidateHostServ(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateHostServ(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { - if (Config.s_HostServ) + if (!Config.s_HostServ.empty()) { - if (ci::string(value) == "description") + if (value.equals_ci("description")) { if (data.GetValue().empty()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when HostServ is enabled!"); + throw ConfigException("The value for <" + tag + ":" + value + "> cannot be empty when HostServ is enabled!"); } } return true; } -bool ValidateLimitSessions(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateLimitSessions(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { if (Config.LimitSessions) { - if (ci::string(value) == "maxsessionlimit" || ci::string(value) == "exceptionexpiry") + if (value.equals_ci("maxsessionlimit") || value.equals_ci("exceptionexpiry")) { - if (!data.GetInteger()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be non-zero when session limiting is enabled!"); + if (!data.GetInteger() && !dotime(data.GetValue())) + throw ConfigException("The value for <" + tag + ":" + value + "> must be non-zero when session limiting is enabled!"); } } return true; } -bool ValidateDefCon(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateDefCon(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { - if (ci::string(value) == "defaultlevel") + if (value.equals_ci("defaultlevel")) { int level = data.GetInteger(); if (!level) @@ -288,26 +280,26 @@ bool ValidateDefCon(ServerConfig *, const char *tag, const char *value, ValueIte } else if (Config.DefConLevel) { - if ((ci::string(value).substr(0, 5) == "level" && isdigit(value[5])) || ci::string(value) == "chanmodes" || ci::string(value) == "akillreason") + if ((value.substr(0, 5).equals_ci("level") && isdigit(value[5])) || value.equals_ci("chanmodes") || value.equals_ci("akillreason")) { if (data.GetValue().empty()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when DefCon is enabled!"); + throw ConfigException("The value for <" + tag + ":" + value + "> cannot be empty when DefCon is enabled!"); } - else if (ci::string(value) == "message" && Config.GlobalOnDefconMore) + else if (value.equals_ci("message") && Config.GlobalOnDefconMore) { if (data.GetValue().empty()) throw ConfigException("The value for <defcon:message> cannot be empty when globalondefconmore is enabled!"); } - else if (ci::string(value) == "sessionlimit" || ci::string(value) == "akillexpire") + else if (value.equals_ci("sessionlimit") || value.equals_ci("akillexpire")) { - if (!data.GetInteger()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> must be non-zero when DefCon is enabled!"); + if (!data.GetInteger() && !dotime(data.GetValue())) + throw ConfigException("The value for <" + tag + ":" + value + "> must be non-zero when DefCon is enabled!"); } } return true; } -bool ValidateNickLen(ServerConfig *, const char *, const char *, ValueItem &data) +bool ValidateNickLen(ServerConfig *, const Anope::string &, const Anope::string &, ValueItem &data) { int nicklen = data.GetInteger(); if (!nicklen) @@ -324,20 +316,20 @@ bool ValidateNickLen(ServerConfig *, const char *, const char *, ValueItem &data return true; } -bool ValidateMail(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateMail(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { if (Config.UseMail) { - if (ci::string(value) == "sendmailpath" || ci::string(value) == "sendfrom") + if (value.equals_ci("sendmailpath") || value.equals_ci("sendfrom")) { if (data.GetValue().empty()) - throw ConfigException(std::string("The value for <") + tag + ":" + value + "> cannot be empty when e-mail is enabled!"); + throw ConfigException("The value for <" + tag + ":" + value + "> cannot be empty when e-mail is enabled!"); } } return true; } -bool ValidateGlobalOnCycle(ServerConfig *, const char *tag, const char *value, ValueItem &data) +bool ValidateGlobalOnCycle(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data) { if (Config.GlobalOnCycle) { @@ -350,7 +342,7 @@ bool ValidateGlobalOnCycle(ServerConfig *, const char *tag, const char *value, V return true; } -void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail) +void ServerConfig::ReportConfigError(const Anope::string &errormessage, bool bail) { Alog() << "There were errors in your configuration file: " << errormessage; if (bail) @@ -360,7 +352,7 @@ void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail) } } -bool InitUplinks(ServerConfig *, const char *, bool bail) +bool InitUplinks(ServerConfig *, const Anope::string &, bool bail) { // If bail is false, we were reloading, don't clear anything if (!bail) @@ -375,13 +367,13 @@ bool InitUplinks(ServerConfig *, const char *, bool bail) return true; } -bool DoUplink(ServerConfig *conf, const char *, const char **, ValueList &values, int *, bool bail) +bool DoUplink(ServerConfig *conf, const Anope::string &, const Anope::string *, ValueList &values, int *, bool bail) { // If bail is false, we were reloading, don't even try to add another uplink if (!bail) return true; // Validation variables - const char *host = values[0].GetString(), *password = values[3].GetString(); + Anope::string host = values[0].GetValue(), password = values[3].GetValue(); int port = values[2].GetInteger(); bool ipv6 = values[1].GetBool(); ValueItem vi_host(host), vi_port(port), vi_password(password); @@ -399,7 +391,7 @@ bool DoUplink(ServerConfig *conf, const char *, const char **, ValueList &values return true; } -bool DoneUplinks(ServerConfig *, const char *, bool bail) +bool DoneUplinks(ServerConfig *, const Anope::string &, bool bail) { // If bail is false, we were reloading, ignore this check if (!bail) @@ -409,7 +401,7 @@ bool DoneUplinks(ServerConfig *, const char *, bool bail) return true; } -static bool InitOperTypes(ServerConfig *, const char *, bool) +static bool InitOperTypes(ServerConfig *, const Anope::string &, bool) { for (std::list<OperType *>::iterator it = Config.MyOperTypes.begin(), it_end = Config.MyOperTypes.end(); it != it_end; ++it) delete *it; @@ -418,12 +410,12 @@ static bool InitOperTypes(ServerConfig *, const char *, bool) return true; } -static bool DoOperType(ServerConfig *conf, const char *, const char **, ValueList &values, int *, bool) +static bool DoOperType(ServerConfig *conf, const Anope::string &, const Anope::string *, ValueList &values, int *, bool) { - const char *name = values[0].GetString(); - const char *inherits = values[1].GetString(); - const char *commands = values[2].GetString(); - const char *privs = values[3].GetString(); + Anope::string name = values[0].GetValue(); + Anope::string inherits = values[1].GetValue(); + Anope::string commands = values[2].GetValue(); + Anope::string privs = values[3].GetValue(); ValueItem vi(name); if (!ValidateNotEmpty(conf, "opertype", "name", vi)) @@ -431,7 +423,7 @@ static bool DoOperType(ServerConfig *conf, const char *, const char **, ValueLis OperType *ot = new OperType(name); - ci::string tok; + Anope::string tok; spacesepstream cmdstr(commands); while (cmdstr.GetToken(tok)) ot->AddCommand(tok); @@ -444,11 +436,11 @@ static bool DoOperType(ServerConfig *conf, const char *, const char **, ValueLis while (inheritstr.GetToken(tok)) { /* Strip leading ' ' after , */ - if (tok.size() > 1 && tok[0] == ' ') + if (tok.length() > 1 && tok[0] == ' ') tok.erase(tok.begin()); for (std::list<OperType *>::iterator it = Config.MyOperTypes.begin(), it_end = Config.MyOperTypes.end(); it != it_end; ++it) { - if ((*it)->GetName() == tok) + if ((*it)->GetName().equals_ci(tok)) { Alog() << "Inheriting commands and privs from " << (*it)->GetName() << " to " << ot->GetName(); ot->Inherits(*it); @@ -461,14 +453,14 @@ static bool DoOperType(ServerConfig *conf, const char *, const char **, ValueLis return true; } -static bool DoneOperTypes(ServerConfig *, const char *, bool) +static bool DoneOperTypes(ServerConfig *, const Anope::string &, bool) { return true; } /*************************************************************************/ -static bool InitOpers(ServerConfig *, const char *, bool) +static bool InitOpers(ServerConfig *, const Anope::string &, bool) { for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it) it->second->ot = NULL; @@ -478,10 +470,10 @@ static bool InitOpers(ServerConfig *, const char *, bool) return true; } -static bool DoOper(ServerConfig *conf, const char *, const char **, ValueList &values, int *, bool) +static bool DoOper(ServerConfig *conf, const Anope::string &, const Anope::string *, ValueList &values, int *, bool) { - const char *name = values[0].GetString(); - const char *type = values[1].GetString(); + Anope::string name = values[0].GetValue(); + Anope::string type = values[1].GetValue(); ValueItem vi(name); if (!ValidateNotEmpty(conf, "oper", "name", vi)) @@ -495,12 +487,11 @@ static bool DoOper(ServerConfig *conf, const char *, const char **, ValueList &v return true; } -static bool DoneOpers(ServerConfig *, const char *, bool) +static bool DoneOpers(ServerConfig *, const Anope::string &, bool) { - // XXX: this is duplicated in config.c - for (std::list<std::pair<ci::string, ci::string> >::iterator it = Config.Opers.begin(), it_end = Config.Opers.end(); it != it_end; ++it) + for (std::list<std::pair<Anope::string, Anope::string> >::iterator it = Config.Opers.begin(), it_end = Config.Opers.end(); it != it_end; ++it) { - ci::string nick = it->first, type = it->second; + Anope::string nick = it->first, type = it->second; NickAlias *na = findnick(nick); if (!na) @@ -514,7 +505,7 @@ static bool DoneOpers(ServerConfig *, const char *, bool) for (std::list<OperType *>::iterator tit = Config.MyOperTypes.begin(), tit_end = Config.MyOperTypes.end(); tit != tit_end; ++tit) { OperType *ot = *tit; - if (ot->GetName() == type) + if (ot->GetName().equals_ci(type)) { Alog() << "Tied oper " << na->nc->display << " to type " << type; na->nc->ot = ot; @@ -526,16 +517,16 @@ static bool DoneOpers(ServerConfig *, const char *, bool) /*************************************************************************/ -bool InitModules(ServerConfig *, const char *, bool) +bool InitModules(ServerConfig *, const Anope::string &, bool) { Modules.clear(); return true; } -bool DoModule(ServerConfig *conf, const char *, const char **, ValueList &values, int *, bool) +bool DoModule(ServerConfig *conf, const Anope::string &, const Anope::string *, ValueList &values, int *, bool) { // First we validate that there was a name in the module block - const char *module = values[0].GetString(); + Anope::string module = values[0].GetValue(); ValueItem vi(module); if (!ValidateNotEmpty(conf, "module", "name", vi)) throw ConfigException("One or more values in your configuration file failed to validate. Please see your log for more information."); @@ -543,11 +534,11 @@ bool DoModule(ServerConfig *conf, const char *, const char **, ValueList &values if (!Modules.empty()) Modules += " "; // Add the module name to the string - Modules += values[0].GetString(); + Modules += values[0].GetValue(); return true; } -bool DoneModules(ServerConfig *, const char *, bool) +bool DoneModules(ServerConfig *, const Anope::string &, bool) { return true; } @@ -556,7 +547,7 @@ int ServerConfig::Read(bool bail) { errstr.clear(); // These tags MUST occur and must ONLY occur once in the config file - static const char *Once[] = {"serverinfo", "networkinfo", "options", "nickserv", "chanserv", "memoserv", "operserv", NULL}; + static const Anope::string Once[] = {"serverinfo", "networkinfo", "options", "nickserv", "chanserv", "memoserv", "operserv", ""}; // These tags can occur ONCE or not at all InitialConfig Values[] = { /* The following comments are from CyberBotX to w00t as examples to use: @@ -612,25 +603,25 @@ int ServerConfig::Read(bool bail) * * We may need to add some other validation functions to handle certain things, we can handle that later. * Any questions about these, w00t, feel free to ask. */ - {"serverinfo", "name", "", new ValueContainerChar(&Config.ServerName), DT_HOSTNAME | DT_NORELOAD, ValidateNotEmpty}, - {"serverinfo", "description", "", new ValueContainerChar(&Config.ServerDesc), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"serverinfo", "localhost", "", new ValueContainerChar(&Config.LocalHost), DT_HOSTNAME | DT_NORELOAD, NoValidation}, - {"serverinfo", "type", "", new ValueContainerChar(&Config.IRCDModule), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"serverinfo", "id", "", new ValueContainerChar(&Config.Numeric), DT_NOSPACES | DT_NORELOAD, NoValidation}, - {"serverinfo", "ident", "", new ValueContainerChar(&Config.ServiceUser), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"serverinfo", "hostname", "", new ValueContainerChar(&Config.ServiceHost), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"serverinfo", "pid", "services.pid", new ValueContainerChar(&Config.PIDFilename), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"serverinfo", "motd", "services.motd", new ValueContainerChar(&Config.MOTDFilename), DT_CHARPTR, ValidateNotEmpty}, - {"networkinfo", "logchannel", "", new ValueContainerChar(&Config.LogChannel), DT_CHARPTR, NoValidation}, + {"serverinfo", "name", "", new ValueContainerString(&Config.ServerName), DT_HOSTNAME | DT_NORELOAD, ValidateNotEmpty}, + {"serverinfo", "description", "", new ValueContainerString(&Config.ServerDesc), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"serverinfo", "localhost", "", new ValueContainerString(&Config.LocalHost), DT_HOSTNAME | DT_NORELOAD, NoValidation}, + {"serverinfo", "type", "", new ValueContainerString(&Config.IRCDModule), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"serverinfo", "id", "", new ValueContainerString(&Config.Numeric), DT_NOSPACES | DT_NORELOAD, NoValidation}, + {"serverinfo", "ident", "", new ValueContainerString(&Config.ServiceUser), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"serverinfo", "hostname", "", new ValueContainerString(&Config.ServiceHost), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"serverinfo", "pid", "services.pid", new ValueContainerString(&Config.PIDFilename), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"serverinfo", "motd", "services.motd", new ValueContainerString(&Config.MOTDFilename), DT_STRING, ValidateNotEmpty}, + {"networkinfo", "logchannel", "", new ValueContainerString(&Config.LogChannel), DT_STRING, NoValidation}, {"networkinfo", "logbot", "no", new ValueContainerBool(&Config.LogBot), DT_BOOLEAN, NoValidation}, - {"networkinfo", "networkname", "", new ValueContainerChar(&Config.NetworkName), DT_CHARPTR, ValidateNotEmpty}, + {"networkinfo", "networkname", "", new ValueContainerString(&Config.NetworkName), DT_STRING, ValidateNotEmpty}, {"networkinfo", "nicklen", "0", new ValueContainerUInt(&Config.NickLen), DT_UINTEGER | DT_NORELOAD, ValidateNickLen}, {"networkinfo", "userlen", "10", new ValueContainerUInt(&Config.UserLen), DT_UINTEGER | DT_NORELOAD, NoValidation}, {"networkinfo", "hostlen", "64", new ValueContainerUInt(&Config.HostLen), DT_UINTEGER | DT_NORELOAD, NoValidation}, - {"options", "encryption", "", new ValueContainerCIString(&EncModules), DT_CISTRING | DT_NORELOAD, ValidateNotEmpty}, + {"options", "encryption", "", new ValueContainerString(&EncModules), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, {"options", "passlen", "32", new ValueContainerUInt(&Config.PassLen), DT_UINTEGER | DT_NORELOAD, NoValidation}, - {"options", "database", "", new ValueContainerCIString(&DBModules), DT_CISTRING | DT_NORELOAD, ValidateNotEmpty}, - {"options", "socketengine", "", new ValueContainerCIString(&Config.SocketEngine), DT_CISTRING | DT_NORELOAD, ValidateNotEmpty}, + {"options", "database", "", new ValueContainerString(&DBModules), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"options", "socketengine", "", new ValueContainerString(&Config.SocketEngine), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, {"options", "userkey1", "0", new ValueContainerLUInt(&Config.UserKey1), DT_LUINTEGER, NoValidation}, {"options", "userkey2", "0", new ValueContainerLUInt(&Config.UserKey2), DT_LUINTEGER, NoValidation}, {"options", "userkey3", "0", new ValueContainerLUInt(&Config.UserKey3), DT_LUINTEGER, NoValidation}, @@ -652,25 +643,25 @@ int ServerConfig::Read(bool bail) {"options", "logusers", "no", new ValueContainerBool(&Config.LogUsers), DT_BOOLEAN, NoValidation}, {"options", "hidestatso", "no", new ValueContainerBool(&Config.HideStatsO), DT_BOOLEAN, NoValidation}, {"options", "globaloncycle", "no", new ValueContainerBool(&Config.GlobalOnCycle), DT_BOOLEAN, NoValidation}, - {"options", "globaloncycledown", "", new ValueContainerChar(&Config.GlobalOnCycleMessage), DT_CHARPTR, ValidateGlobalOnCycle}, - {"options", "globaloncycleup", "", new ValueContainerChar(&Config.GlobalOnCycleUP), DT_CHARPTR, ValidateGlobalOnCycle}, + {"options", "globaloncycledown", "", new ValueContainerString(&Config.GlobalOnCycleMessage), DT_STRING, ValidateGlobalOnCycle}, + {"options", "globaloncycleup", "", new ValueContainerString(&Config.GlobalOnCycleUP), DT_STRING, ValidateGlobalOnCycle}, {"options", "anonymousglobal", "no", new ValueContainerBool(&Config.AnonymousGlobal), DT_BOOLEAN, NoValidation}, {"options", "nickregdelay", "0", new ValueContainerUInt(&Config.NickRegDelay), DT_UINTEGER, NoValidation}, {"options", "restrictopernicks", "no", new ValueContainerBool(&Config.RestrictOperNicks), DT_BOOLEAN, NoValidation}, {"options", "newscount", "3", new ValueContainerUInt(&Config.NewsCount), DT_UINTEGER, NoValidation}, - {"options", "ulineservers", "", new ValueContainerChar(&UlineServers), DT_CHARPTR, NoValidation}, + {"options", "ulineservers", "", new ValueContainerString(&UlineServers), DT_STRING, NoValidation}, {"options", "enablelogchannel", "no", new ValueContainerBool(&LogChan), DT_BOOLEAN, NoValidation}, - {"options", "mlock", "+nrt", new ValueContainerCIString(&Config.MLock), DT_CISTRING, NoValidation}, - {"options", "botmodes", "", new ValueContainerCIString(&Config.BotModes), DT_CISTRING, NoValidation}, + {"options", "mlock", "+nrt", new ValueContainerString(&Config.MLock), DT_STRING, NoValidation}, + {"options", "botmodes", "", new ValueContainerString(&Config.BotModes), DT_STRING, NoValidation}, {"options", "maxretries", "10", new ValueContainerUInt(&Config.MaxRetries), DT_UINTEGER, NoValidation}, {"options", "retrywait", "60", new ValueContainerInt(&Config.RetryWait), DT_INTEGER, ValidateNotZero}, {"options", "hideprivilegedcommands", "no", new ValueContainerBool(&Config.HidePrivilegedCommands), DT_BOOLEAN, ValidateEmailReg}, - {"nickserv", "nick", "NickServ", new ValueContainerChar(&Config.s_NickServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"nickserv", "description", "Nickname Registration Service", new ValueContainerChar(&Config.desc_NickServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, + {"nickserv", "nick", "NickServ", new ValueContainerString(&Config.s_NickServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"nickserv", "description", "Nickname Registration Service", new ValueContainerString(&Config.desc_NickServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, {"nickserv", "emailregistration", "no", new ValueContainerBool(&Config.NSEmailReg), DT_BOOLEAN, NoValidation}, - {"nickserv", "modules", "", new ValueContainerCIString(&NickCoreModules), DT_CISTRING, NoValidation}, + {"nickserv", "modules", "", new ValueContainerString(&NickCoreModules), DT_STRING, NoValidation}, {"nickserv", "forceemail", "no", new ValueContainerBool(&Config.NSForceEmail), DT_BOOLEAN, ValidateEmailReg}, - {"nickserv", "defaults", "secure memosignon memoreceive", new ValueContainerCIString(&NSDefaults), DT_CISTRING, NoValidation}, + {"nickserv", "defaults", "secure memosignon memoreceive", new ValueContainerString(&NSDefaults), DT_STRING, NoValidation}, {"nickserv", "defaultlanguage", "0", new ValueContainerUInt(&Config.NSDefLanguage), DT_UINTEGER, ValidateLanguage}, {"nickserv", "regdelay", "0", new ValueContainerTime(&Config.NSRegDelay), DT_TIME, NoValidation}, {"nickserv", "resenddelay", "0", new ValueContainerTime(&Config.NSResendDelay), DT_TIME, NoValidation}, @@ -678,63 +669,63 @@ int ServerConfig::Read(bool bail) {"nickserv", "preregexpire", "0", new ValueContainerTime(&Config.NSRExpire), DT_TIME, ValidateEmailReg}, {"nickserv", "maxaliases", "0", new ValueContainerInt(&Config.NSMaxAliases), DT_INTEGER, NoValidation}, {"nickserv", "accessmax", "0", new ValueContainerUInt(&Config.NSAccessMax), DT_UINTEGER, ValidateNotZero}, - {"nickserv", "enforceruser", "", new ValueContainerChar(&temp_nsuserhost), DT_CHARPTR, ValidateNotEmpty}, + {"nickserv", "enforceruser", "", new ValueContainerString(&temp_nsuserhost), DT_STRING, ValidateNotEmpty}, {"nickserv", "releasetimeout", "0", new ValueContainerTime(&Config.NSReleaseTimeout), DT_TIME, ValidateNotZero}, {"nickserv", "allowkillimmed", "no", new ValueContainerBool(&Config.NSAllowKillImmed), DT_BOOLEAN | DT_NORELOAD, NoValidation}, {"nickserv", "nogroupchange", "no", new ValueContainerBool(&Config.NSNoGroupChange), DT_BOOLEAN, NoValidation}, {"nickserv", "listopersonly", "no", new ValueContainerBool(&Config.NSListOpersOnly), DT_BOOLEAN, NoValidation}, {"nickserv", "listmax", "0", new ValueContainerUInt(&Config.NSListMax), DT_UINTEGER, ValidateNotZero}, - {"nickserv", "guestnickprefix", "", new ValueContainerChar(&Config.NSGuestNickPrefix), DT_CHARPTR, ValidateGuestPrefix}, + {"nickserv", "guestnickprefix", "", new ValueContainerString(&Config.NSGuestNickPrefix), DT_STRING, ValidateGuestPrefix}, {"nickserv", "secureadmins", "no", new ValueContainerBool(&Config.NSSecureAdmins), DT_BOOLEAN, NoValidation}, {"nickserv", "strictprivileges", "no", new ValueContainerBool(&Config.NSStrictPrivileges), DT_BOOLEAN, NoValidation}, {"nickserv", "modeonid", "no", new ValueContainerBool(&Config.NSModeOnID), DT_BOOLEAN, NoValidation}, {"nickserv", "addaccessonreg", "no", new ValueContainerBool(&Config.NSAddAccessOnReg), DT_BOOLEAN, NoValidation}, {"mail", "usemail", "no", new ValueContainerBool(&Config.UseMail), DT_BOOLEAN, ValidateEmailReg}, - {"mail", "sendmailpath", "", new ValueContainerChar(&Config.SendMailPath), DT_CHARPTR, ValidateMail}, - {"mail", "sendfrom", "", new ValueContainerChar(&Config.SendFrom), DT_CHARPTR, ValidateMail}, + {"mail", "sendmailpath", "", new ValueContainerString(&Config.SendMailPath), DT_STRING, ValidateMail}, + {"mail", "sendfrom", "", new ValueContainerString(&Config.SendFrom), DT_STRING, ValidateMail}, {"mail", "restrict", "no", new ValueContainerBool(&Config.RestrictMail), DT_BOOLEAN, NoValidation}, {"mail", "delay", "0", new ValueContainerTime(&Config.MailDelay), DT_TIME, NoValidation}, {"mail", "dontquoteaddresses", "no", new ValueContainerBool(&Config.DontQuoteAddresses), DT_BOOLEAN, NoValidation}, - {"chanserv", "nick", "ChanServ", new ValueContainerChar(&Config.s_ChanServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"chanserv", "description", "Channel Registration Service", new ValueContainerChar(&Config.desc_ChanServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"chanserv", "modules", "", new ValueContainerCIString(&ChanCoreModules), DT_CISTRING, NoValidation}, - {"chanserv", "defaults", "keeptopic secure securefounder signkick", new ValueContainerCIString(&CSDefaults), DT_CISTRING, NoValidation}, + {"chanserv", "nick", "ChanServ", new ValueContainerString(&Config.s_ChanServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"chanserv", "description", "Channel Registration Service", new ValueContainerString(&Config.desc_ChanServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"chanserv", "modules", "", new ValueContainerString(&ChanCoreModules), DT_STRING, NoValidation}, + {"chanserv", "defaults", "keeptopic secure securefounder signkick", new ValueContainerString(&CSDefaults), DT_STRING, NoValidation}, {"chanserv", "maxregistered", "0", new ValueContainerUInt(&Config.CSMaxReg), DT_UINTEGER, NoValidation}, {"chanserv", "expire", "14d", new ValueContainerTime(&Config.CSExpire), DT_TIME, NoValidation}, {"chanserv", "defbantype", "2", new ValueContainerInt(&Config.CSDefBantype), DT_INTEGER, ValidateBantype}, {"chanserv", "accessmax", "0", new ValueContainerUInt(&Config.CSAccessMax), DT_UINTEGER, ValidateNotZero}, {"chanserv", "autokickmax", "0", new ValueContainerUInt(&Config.CSAutokickMax), DT_UINTEGER, ValidateNotZero}, - {"chanserv", "autokickreason", "User has been banned from the channel", new ValueContainerChar(&Config.CSAutokickReason), DT_CHARPTR, ValidateNotEmpty}, + {"chanserv", "autokickreason", "User has been banned from the channel", new ValueContainerString(&Config.CSAutokickReason), DT_STRING, ValidateNotEmpty}, {"chanserv", "inhabit", "0", new ValueContainerTime(&Config.CSInhabit), DT_TIME, ValidateNotZero}, {"chanserv", "listopersonly", "no", new ValueContainerBool(&Config.CSListOpersOnly), DT_BOOLEAN, NoValidation}, {"chanserv", "listmax", "0", new ValueContainerUInt(&Config.CSListMax), DT_UINTEGER, ValidateNotZero}, {"chanserv", "opersonly", "no", new ValueContainerBool(&Config.CSOpersOnly), DT_BOOLEAN, NoValidation}, - {"memoserv", "nick", "MemoServ", new ValueContainerChar(&Config.s_MemoServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"memoserv", "description", "Memo Service", new ValueContainerChar(&Config.desc_MemoServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"memoserv", "modules", "", new ValueContainerCIString(&MemoCoreModules), DT_CISTRING, NoValidation}, + {"memoserv", "nick", "MemoServ", new ValueContainerString(&Config.s_MemoServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"memoserv", "description", "Memo Service", new ValueContainerString(&Config.desc_MemoServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"memoserv", "modules", "", new ValueContainerString(&MemoCoreModules), DT_STRING, NoValidation}, {"memoserv", "maxmemos", "0", new ValueContainerUInt(&Config.MSMaxMemos), DT_UINTEGER, NoValidation}, {"memoserv", "senddelay", "0", new ValueContainerTime(&Config.MSSendDelay), DT_TIME, NoValidation}, {"memoserv", "notifyall", "no", new ValueContainerBool(&Config.MSNotifyAll), DT_BOOLEAN, NoValidation}, {"memoserv", "memoreceipt", "0", new ValueContainerUInt(&Config.MSMemoReceipt), DT_UINTEGER, NoValidation}, - {"botserv", "nick", "", new ValueContainerChar(&Config.s_BotServ), DT_CHARPTR | DT_NORELOAD, NoValidation}, - {"botserv", "description", "Bot Service", new ValueContainerChar(&Config.desc_BotServ), DT_CHARPTR | DT_NORELOAD, ValidateBotServ}, - {"botserv", "modules", "", new ValueContainerCIString(&BotCoreModules), DT_CISTRING, NoValidation}, - {"botserv", "defaults", "", new ValueContainerCIString(&BSDefaults), DT_CISTRING, NoValidation}, + {"botserv", "nick", "", new ValueContainerString(&Config.s_BotServ), DT_STRING | DT_NORELOAD, NoValidation}, + {"botserv", "description", "Bot Service", new ValueContainerString(&Config.desc_BotServ), DT_STRING | DT_NORELOAD, ValidateBotServ}, + {"botserv", "modules", "", new ValueContainerString(&BotCoreModules), DT_STRING, NoValidation}, + {"botserv", "defaults", "", new ValueContainerString(&BSDefaults), DT_STRING, NoValidation}, {"botserv", "minusers", "0", new ValueContainerUInt(&Config.BSMinUsers), DT_UINTEGER, ValidateBotServ}, {"botserv", "badwordsmax", "0", new ValueContainerUInt(&Config.BSBadWordsMax), DT_UINTEGER, ValidateBotServ}, {"botserv", "keepdata", "0", new ValueContainerTime(&Config.BSKeepData), DT_TIME, ValidateBotServ}, {"botserv", "smartjoin", "no", new ValueContainerBool(&Config.BSSmartJoin), DT_BOOLEAN, NoValidation}, {"botserv", "gentlebadwordreason", "no", new ValueContainerBool(&Config.BSGentleBWReason), DT_BOOLEAN, NoValidation}, {"botserv", "casesensitive", "no", new ValueContainerBool(&Config.BSCaseSensitive), DT_BOOLEAN, NoValidation}, - {"botserv", "fantasycharacter", "!", new ValueContainerChar(&Config.BSFantasyCharacter), DT_CHARPTR, NoValidation}, - {"hostserv", "nick", "", new ValueContainerChar(&Config.s_HostServ), DT_CHARPTR | DT_NORELOAD, NoValidation}, - {"hostserv", "description", "vHost Service", new ValueContainerChar(&Config.desc_HostServ), DT_CHARPTR | DT_NORELOAD, ValidateHostServ}, - {"hostserv", "modules", "", new ValueContainerCIString(&HostCoreModules), DT_CISTRING, NoValidation}, - {"operserv", "nick", "OperServ", new ValueContainerChar(&Config.s_OperServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"operserv", "description", "Operator Service", new ValueContainerChar(&Config.desc_OperServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"operserv", "globalnick", "Global", new ValueContainerChar(&Config.s_GlobalNoticer), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"operserv", "globaldescription", "Global Noticer", new ValueContainerChar(&Config.desc_GlobalNoticer), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty}, - {"operserv", "modules", "", new ValueContainerCIString(&OperCoreModules), DT_CISTRING, NoValidation}, + {"botserv", "fantasycharacter", "!", new ValueContainerString(&Config.BSFantasyCharacter), DT_STRING, NoValidation}, + {"hostserv", "nick", "", new ValueContainerString(&Config.s_HostServ), DT_STRING | DT_NORELOAD, NoValidation}, + {"hostserv", "description", "vHost Service", new ValueContainerString(&Config.desc_HostServ), DT_STRING | DT_NORELOAD, ValidateHostServ}, + {"hostserv", "modules", "", new ValueContainerString(&HostCoreModules), DT_STRING, NoValidation}, + {"operserv", "nick", "OperServ", new ValueContainerString(&Config.s_OperServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"operserv", "description", "Operator Service", new ValueContainerString(&Config.desc_OperServ), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"operserv", "globalnick", "Global", new ValueContainerString(&Config.s_GlobalNoticer), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"operserv", "globaldescription", "Global Noticer", new ValueContainerString(&Config.desc_GlobalNoticer), DT_STRING | DT_NORELOAD, ValidateNotEmpty}, + {"operserv", "modules", "", new ValueContainerString(&OperCoreModules), DT_STRING, NoValidation}, {"operserv", "superadmin", "no", new ValueContainerBool(&Config.SuperAdmin), DT_BOOLEAN, NoValidation}, {"operserv", "logmaxusers", "no", new ValueContainerBool(&Config.LogMaxUsers), DT_BOOLEAN, NoValidation}, {"operserv", "autokillexpiry", "0", new ValueContainerTime(&Config.AutokillExpiry), DT_TIME, ValidateNotZero}, @@ -745,60 +736,60 @@ int ServerConfig::Read(bool bail) {"operserv", "akillonadd", "no", new ValueContainerBool(&Config.AkillOnAdd), DT_BOOLEAN, NoValidation}, {"operserv", "killonsnline", "no", new ValueContainerBool(&Config.KillonSNline), DT_BOOLEAN, NoValidation}, {"operserv", "killonsqline", "no", new ValueContainerBool(&Config.KillonSQline), DT_BOOLEAN, NoValidation}, - {"operserv", "notifications", "", new ValueContainerCIString(&OSNotifications), DT_CISTRING, NoValidation}, + {"operserv", "notifications", "", new ValueContainerString(&OSNotifications), DT_STRING, NoValidation}, {"operserv", "limitsessions", "no", new ValueContainerBool(&Config.LimitSessions), DT_BOOLEAN, NoValidation}, {"operserv", "defaultsessionlimit", "0", new ValueContainerUInt(&Config.DefSessionLimit), DT_UINTEGER, NoValidation}, {"operserv", "maxsessionlimit", "0", new ValueContainerUInt(&Config.MaxSessionLimit), DT_UINTEGER, ValidateLimitSessions}, {"operserv", "exceptionexpiry", "0", new ValueContainerTime(&Config.ExceptionExpiry), DT_TIME, ValidateLimitSessions}, - {"operserv", "sessionlimitexceeded", "", new ValueContainerChar(&Config.SessionLimitExceeded), DT_CHARPTR, NoValidation}, - {"operserv", "sessionlimitdetailsloc", "", new ValueContainerChar(&Config.SessionLimitDetailsLoc), DT_CHARPTR, NoValidation}, + {"operserv", "sessionlimitexceeded", "", new ValueContainerString(&Config.SessionLimitExceeded), DT_STRING, NoValidation}, + {"operserv", "sessionlimitdetailsloc", "", new ValueContainerString(&Config.SessionLimitDetailsLoc), DT_STRING, NoValidation}, {"operserv", "maxsessionkill", "0", new ValueContainerInt(&Config.MaxSessionKill), DT_INTEGER, NoValidation}, {"operserv", "sessionautokillexpiry", "0", new ValueContainerTime(&Config.SessionAutoKillExpiry), DT_TIME, NoValidation}, {"operserv", "addakiller", "no", new ValueContainerBool(&Config.AddAkiller), DT_BOOLEAN, NoValidation}, {"operserv", "opersonly", "no", new ValueContainerBool(&Config.OSOpersOnly), DT_BOOLEAN, NoValidation}, {"defcon", "defaultlevel", "0", new ValueContainerInt(&DefConLevel), DT_INTEGER, ValidateDefCon}, - {"defcon", "level4", "", new ValueContainerCIString(&DefCon4), DT_CISTRING, ValidateDefCon}, - {"defcon", "level3", "", new ValueContainerCIString(&DefCon3), DT_CISTRING, ValidateDefCon}, - {"defcon", "level2", "", new ValueContainerCIString(&DefCon2), DT_CISTRING, ValidateDefCon}, - {"defcon", "level1", "", new ValueContainerCIString(&DefCon1), DT_CISTRING, ValidateDefCon}, + {"defcon", "level4", "", new ValueContainerString(&DefCon4), DT_STRING, ValidateDefCon}, + {"defcon", "level3", "", new ValueContainerString(&DefCon3), DT_STRING, ValidateDefCon}, + {"defcon", "level2", "", new ValueContainerString(&DefCon2), DT_STRING, ValidateDefCon}, + {"defcon", "level1", "", new ValueContainerString(&DefCon1), DT_STRING, ValidateDefCon}, {"defcon", "sessionlimit", "0", new ValueContainerInt(&Config.DefConSessionLimit), DT_INTEGER, ValidateDefCon}, {"defcon", "akillexpire", "0", new ValueContainerTime(&Config.DefConAKILL), DT_TIME, ValidateDefCon}, - {"defcon", "chanmodes", "", new ValueContainerChar(&Config.DefConChanModes), DT_CHARPTR, ValidateDefCon}, + {"defcon", "chanmodes", "", new ValueContainerString(&Config.DefConChanModes), DT_STRING, ValidateDefCon}, {"defcon", "timeout", "0", new ValueContainerTime(&Config.DefConTimeOut), DT_TIME, NoValidation}, {"defcon", "globalondefcon", "no", new ValueContainerBool(&Config.GlobalOnDefcon), DT_BOOLEAN, NoValidation}, {"defcon", "globalondefconmore", "no", new ValueContainerBool(&Config.GlobalOnDefconMore), DT_BOOLEAN, NoValidation}, - {"defcon", "message", "", new ValueContainerChar(&Config.DefconMessage), DT_CHARPTR, ValidateDefCon}, - {"defcon", "offmessage", "", new ValueContainerChar(&Config.DefConOffMessage), DT_CHARPTR, NoValidation}, - {"defcon", "akillreason", "", new ValueContainerChar(&Config.DefConAkillReason), DT_CHARPTR, ValidateDefCon}, - {NULL, NULL, NULL, NULL, DT_NOTHING, NoValidation} + {"defcon", "message", "", new ValueContainerString(&Config.DefconMessage), DT_STRING, ValidateDefCon}, + {"defcon", "offmessage", "", new ValueContainerString(&Config.DefConOffMessage), DT_STRING, NoValidation}, + {"defcon", "akillreason", "", new ValueContainerString(&Config.DefConAkillReason), DT_STRING, ValidateDefCon}, + {"", "", "", NULL, DT_NOTHING, NoValidation} }; /* These tags can occur multiple times, and therefore they have special code to read them * which is different to the code for reading the singular tags listed above. */ MultiConfig MultiValues[] = { {"uplink", - {"host", "ipv6", "port", "password", NULL}, - {"", "no", "0", "", NULL}, + {"host", "ipv6", "port", "password", ""}, + {"", "no", "0", "", ""}, {DT_HOSTNAME | DT_NORELOAD, DT_BOOLEAN | DT_NORELOAD, DT_UINTEGER | DT_NORELOAD, DT_NOSPACES | DT_NORELOAD}, InitUplinks, DoUplink, DoneUplinks}, {"module", - {"name", NULL}, - {"", NULL}, + {"name", ""}, + {"", ""}, {DT_CHARPTR}, InitModules, DoModule, DoneModules}, {"opertype", - {"name", "inherits", "commands", "privs", NULL}, - {"", "", "", "", NULL}, + {"name", "inherits", "commands", "privs", ""}, + {"", "", "", "", ""}, {DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR}, InitOperTypes, DoOperType, DoneOperTypes}, {"oper", - {"name", "type", NULL}, - {"", "", NULL}, + {"name", "type", ""}, + {"", "", ""}, {DT_CHARPTR, DT_CHARPTR}, InitOpers, DoOper, DoneOpers}, - {NULL, - {NULL}, - {NULL}, + {"", + {""}, + {""}, {0}, NULL, NULL, NULL} }; @@ -821,9 +812,9 @@ int ServerConfig::Read(bool bail) try { // Read the values of all the tags which occur once or not at all, and call their callbacks. - for (int Index = 0; Values[Index].tag; ++Index) + for (int Index = 0; !Values[Index].tag.empty(); ++Index) { - char item[BUFSIZE]; + Anope::string item; int dt = Values[Index].datatype; bool allow_newlines = dt & DT_ALLOW_NEWLINE, allow_wild = dt & DT_ALLOW_WILD, noreload = dt & DT_NORELOAD; dt &= ~DT_ALLOW_NEWLINE; @@ -837,7 +828,7 @@ int ServerConfig::Read(bool bail) continue; } - ConfValue(config_data, Values[Index].tag, Values[Index].value, Values[Index].default_value, 0, item, BUFSIZE, allow_newlines); + ConfValue(config_data, Values[Index].tag, Values[Index].value, Values[Index].default_value, 0, item, allow_newlines); ValueItem vi(item); if (!Values[Index].validation_function(this, Values[Index].tag, Values[Index].value, vi)) @@ -847,23 +838,23 @@ int ServerConfig::Read(bool bail) { case DT_NOSPACES: { - ValueContainerChar *vcc = dynamic_cast<ValueContainerChar *>(Values[Index].val); - ValidateNoSpaces(vi.GetString(), Values[Index].tag, Values[Index].value); - vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1); + ValueContainerString *vcs = dynamic_cast<ValueContainerString *>(Values[Index].val); + ValidateNoSpaces(vi.GetValue(), Values[Index].tag, Values[Index].value); + vcs->Set(vi.GetValue()); } break; case DT_HOSTNAME: { - ValueContainerChar *vcc = dynamic_cast<ValueContainerChar *>(Values[Index].val); - ValidateHostname(vi.GetString(), Values[Index].tag, Values[Index].value); - vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1); + ValueContainerString *vcs = dynamic_cast<ValueContainerString *>(Values[Index].val); + ValidateHostname(vi.GetValue(), Values[Index].tag, Values[Index].value); + vcs->Set(vi.GetValue()); } break; case DT_IPADDRESS: { - ValueContainerChar *vcc = dynamic_cast<ValueContainerChar *>(Values[Index].val); - ValidateIP(vi.GetString(), Values[Index].tag, Values[Index].value, allow_wild); - vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1); + ValueContainerString *vcs = dynamic_cast<ValueContainerString *>(Values[Index].val); + ValidateIP(vi.GetValue(), Values[Index].tag, Values[Index].value, allow_wild); + vcs->Set(vi.GetValue()); } break; case DT_CHARPTR: @@ -873,10 +864,10 @@ int ServerConfig::Read(bool bail) vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1); } break; - case DT_STRING: + case DT_CSSTRING: { - ValueContainerString *vcs = dynamic_cast<ValueContainerString *>(Values[Index].val); - vcs->Set(vi.GetValue()); + ValueContainerCSString *vcs = dynamic_cast<ValueContainerCSString *>(Values[Index].val); + vcs->Set(vi.GetCSValue()); } break; case DT_CISTRING: @@ -885,6 +876,12 @@ int ServerConfig::Read(bool bail) vcs->Set(vi.GetCIValue()); } break; + case DT_STRING: + { + ValueContainerString *vcs = dynamic_cast<ValueContainerString *>(Values[Index].val); + vcs->Set(vi.GetValue()); + } + break; case DT_INTEGER: { int val = vi.GetInteger(); @@ -908,7 +905,7 @@ int ServerConfig::Read(bool bail) break; case DT_TIME: { - time_t time = dotime(vi.GetString()); + time_t time = dotime(vi.GetValue()); ValueContainerTime *vci = dynamic_cast<ValueContainerTime *>(Values[Index].val); vci->Set(&time, sizeof(time_t)); } @@ -931,7 +928,7 @@ int ServerConfig::Read(bool bail) /* Read the multiple-tag items (class tags, connect tags, etc) * and call the callbacks associated with them. We have three * callbacks for these, a 'start', 'item' and 'end' callback. */ - for (int Index = 0; MultiValues[Index].tag; ++Index) + for (int Index = 0; !MultiValues[Index].tag.empty(); ++Index) { MultiValues[Index].init_function(this, MultiValues[Index].tag, bail); int number_of_tags = ConfValueEnum(config_data, MultiValues[Index].tag); @@ -939,7 +936,7 @@ int ServerConfig::Read(bool bail) { ValueList vl; vl.clear(); - for (int valuenum = 0; MultiValues[Index].items[valuenum]; ++valuenum) + for (int valuenum = 0; !MultiValues[Index].items[valuenum].empty(); ++valuenum) { int dt = MultiValues[Index].datatype[valuenum]; bool allow_newlines = dt & DT_ALLOW_NEWLINE, allow_wild = dt & DT_ALLOW_WILD, noreload = dt & DT_NORELOAD; @@ -953,47 +950,47 @@ int ServerConfig::Read(bool bail) { case DT_NOSPACES: { - char item[BUFSIZE]; - if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, BUFSIZE, allow_newlines)) + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem("")); - ValidateNoSpaces(vl[vl.size() - 1].GetString(), MultiValues[Index].tag, MultiValues[Index].items[valuenum]); + ValidateNoSpaces(vl[vl.size() - 1].GetValue(), MultiValues[Index].tag, MultiValues[Index].items[valuenum]); } break; case DT_HOSTNAME: { - char item[BUFSIZE]; - if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, BUFSIZE, allow_newlines)) + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem("")); - ValidateHostname(vl[vl.size() - 1].GetString(), MultiValues[Index].tag, MultiValues[Index].items[valuenum]); + ValidateHostname(vl[vl.size() - 1].GetValue(), MultiValues[Index].tag, MultiValues[Index].items[valuenum]); } break; case DT_IPADDRESS: { - char item[BUFSIZE]; - if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, BUFSIZE, allow_newlines)) + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem("")); - ValidateIP(vl[vl.size() - 1].GetString(), MultiValues[Index].tag, MultiValues[Index].items[valuenum], allow_wild); + ValidateIP(vl[vl.size() - 1].GetValue(), MultiValues[Index].tag, MultiValues[Index].items[valuenum], allow_wild); } break; case DT_CHARPTR: { - char item[BUFSIZE]; - if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, BUFSIZE, allow_newlines)) - vl.push_back(ValueItem(item)); + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) + vl.push_back(ValueItem(item.c_str())); else vl.push_back(ValueItem("")); } break; - case DT_STRING: + case DT_CSSTRING: { - ci::string item; - if (ConfValue(config_data, ci::string(MultiValues[Index].tag), ci::string(MultiValues[Index].items[valuenum]), ci::string(MultiValues[Index].items_default[valuenum]), tagnum, item, allow_newlines)) + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem("")); @@ -1001,8 +998,17 @@ int ServerConfig::Read(bool bail) break; case DT_CISTRING: { - ci::string item; - if (ConfValue(config_data, ci::string(MultiValues[Index].tag), ci::string(MultiValues[Index].items[valuenum]), ci::string(MultiValues[Index].items_default[valuenum]), tagnum, item, allow_newlines)) + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) + vl.push_back(ValueItem(item)); + else + vl.push_back(ValueItem("")); + } + break; + case DT_STRING: + { + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem("")); @@ -1021,13 +1027,13 @@ int ServerConfig::Read(bool bail) break; case DT_TIME: { - ci::string item; - if (ConfValue(config_data, ci::string(MultiValues[Index].tag), ci::string(MultiValues[Index].items[valuenum]), ci::string(MultiValues[Index].items_default[valuenum]), tagnum, item, allow_newlines)) + Anope::string item; + if (ConfValue(config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, allow_newlines)) { #ifdef _WIN32 - long time = static_cast<long>(dotime(item.c_str())); + long time = static_cast<long>(dotime(item)); #else - time_t time = dotime(item.c_str()); + time_t time = dotime(item); #endif vl.push_back(ValueItem(time)); } @@ -1042,7 +1048,7 @@ int ServerConfig::Read(bool bail) } } } - MultiValues[Index].validation_function(this, MultiValues[Index].tag, static_cast<const char **>(MultiValues[Index].items), vl, MultiValues[Index].datatype, bail); + MultiValues[Index].validation_function(this, MultiValues[Index].tag, MultiValues[Index].items, vl, MultiValues[Index].datatype, bail); } MultiValues[Index].finish_function(this, MultiValues[Index].tag, bail); } @@ -1052,7 +1058,7 @@ int ServerConfig::Read(bool bail) ReportConfigError(ce.GetReason(), bail); if (!CheckedAllValues) { - for (int Index = 0; Values[Index].tag; ++Index) + for (int Index = 0; !Values[Index].tag.empty(); ++Index) { if (Values[Index].val) delete Values[Index].val; @@ -1061,18 +1067,18 @@ int ServerConfig::Read(bool bail) return 0; } Alog(LOG_DEBUG) << "End config"; - for (int Index = 0; Once[Index]; ++Index) + for (int Index = 0; !Once[Index].empty(); ++Index) if (!CheckOnce(Once[Index])) return 0; Alog() << "Done reading configuration file."; return 1; } -bool ServerConfig::LoadConf(ConfigDataHash &target, const char *filename, std::ostringstream &errorstream) +bool ServerConfig::LoadConf(ConfigDataHash &target, const Anope::string &filename, std::ostringstream &errorstream) { - std::string line; - ci::string section, wordbuffer, itemname; - std::ifstream conf(filename); + Anope::string line; + Anope::string section, wordbuffer, itemname; + std::ifstream conf(filename.c_str()); int linenumber = 0; bool in_word = false, in_quote = false, in_ml_comment = false; KeyValList sectiondata; @@ -1083,10 +1089,10 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char *filename, std::o } Alog(LOG_DEBUG) << "Start to read conf " << filename; // Start reading characters... - while (getline(conf, line)) + while (getline(conf, line.str())) { ++linenumber; - unsigned c = 0, len = line.size(); + unsigned c = 0, len = line.length(); for (; c < len; ++c) { char ch = line[c]; @@ -1190,7 +1196,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char *filename, std::o wordbuffer.clear(); itemname.clear(); } - target.insert(std::pair<ci::string, KeyValList>(section, sectiondata)); + target.insert(std::pair<Anope::string, KeyValList>(section, sectiondata)); section.clear(); sectiondata.clear(); } @@ -1256,35 +1262,12 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char *filename, std::o return true; } -bool ServerConfig::LoadConf(ConfigDataHash &target, const std::string &filename, std::ostringstream &errorstream) -{ - return LoadConf(target, filename.c_str(), errorstream); -} - -bool ServerConfig::LoadConf(ConfigDataHash &target, const ci::string &filename, std::ostringstream &errorstream) -{ - return LoadConf(target, filename.c_str(), errorstream); -} - -bool ServerConfig::ConfValue(ConfigDataHash &target, const char *tag, const char *var, int index, char *result, int length, bool allow_linefeeds) -{ - return ConfValue(target, tag, var, "", index, result, length, allow_linefeeds); -} - -bool ServerConfig::ConfValue(ConfigDataHash &target, const char *tag, const char *var, const char *default_value, int index, char *result, int length, bool allow_linefeeds) -{ - ci::string value; - bool r = ConfValue(target, ci::string(tag), ci::string(var), ci::string(default_value), index, value, allow_linefeeds); - strlcpy(result, value.c_str(), length); - return r; -} - -bool ServerConfig::ConfValue(ConfigDataHash &target, const ci::string &tag, const ci::string &var, int index, ci::string &result, bool allow_linefeeds) +bool ServerConfig::ConfValue(ConfigDataHash &target, const Anope::string &tag, const Anope::string &var, int index, Anope::string &result, bool allow_linefeeds) { return ConfValue(target, tag, var, "", index, result, allow_linefeeds); } -bool ServerConfig::ConfValue(ConfigDataHash &target, const ci::string &tag, const ci::string &var, const ci::string &default_value, int index, ci::string &result, bool allow_linefeeds) +bool ServerConfig::ConfValue(ConfigDataHash &target, const Anope::string &tag, const Anope::string &var, const Anope::string &default_value, int index, Anope::string &result, bool allow_linefeeds) { ConfigDataHash::size_type pos = index; if (pos < target.count(tag)) @@ -1297,15 +1280,12 @@ bool ServerConfig::ConfValue(ConfigDataHash &target, const ci::string &tag, cons KeyValList::iterator j = iter->second.begin(), jend = iter->second.end(); for (; j != jend; ++j) { - if (j->first == var) + if (j->first.equals_ci(var)) { - if (!allow_linefeeds && j->second.find('\n') != std::string::npos) + if (!allow_linefeeds && j->second.find('\n') != Anope::string::npos) { Alog(LOG_DEBUG) << "Value of <" << tag << ":" << var << "> contains a linefeed, and linefeeds in this value are not permitted -- stripped to spaces."; - ci::string::iterator n = j->second.begin(), nend = j->second.end(); - for (; n != nend; ++n) - if (*n == '\n') - *n = ' '; + j->second.replace_all_cs("\n", " "); } else { @@ -1331,34 +1311,24 @@ bool ServerConfig::ConfValue(ConfigDataHash &target, const ci::string &tag, cons return false; } -bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const char *tag, const char *var, int index, int &result) -{ - return ConfValueInteger(target, ci::string(tag), ci::string(var), "", index, result); -} - -bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const char *tag, const char *var, const char *default_value, int index, int &result) -{ - return ConfValueInteger(target, ci::string(tag), ci::string(var), ci::string(default_value), index, result); -} - -bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const ci::string &tag, const ci::string &var, int index, int &result) +bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const Anope::string &tag, const Anope::string &var, int index, int &result) { return ConfValueInteger(target, tag, var, "", index, result); } -bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const ci::string &tag, const ci::string &var, const ci::string &default_value, int index, int &result) +bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const Anope::string &tag, const Anope::string &var, const Anope::string &default_value, int index, int &result) { - ci::string value; + Anope::string value; std::istringstream stream; bool r = ConfValue(target, tag, var, default_value, index, value); - stream.str(value.c_str()); + stream.str(value.str()); if (!(stream >> result)) return false; else { if (!value.empty()) { - if (value.substr(0, 2) == "0x") + if (value.substr(0, 2).equals_ci("0x")) { char *endptr; @@ -1392,51 +1362,26 @@ bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const ci::string &ta return r; } -bool ServerConfig::ConfValueBool(ConfigDataHash &target, const char *tag, const char *var, int index) -{ - return ConfValueBool(target, ci::string(tag), ci::string(var), "", index); -} - -bool ServerConfig::ConfValueBool(ConfigDataHash &target, const char *tag, const char *var, const char *default_value, int index) -{ - return ConfValueBool(target, ci::string(tag), ci::string(var), ci::string(default_value), index); -} - -bool ServerConfig::ConfValueBool(ConfigDataHash &target, const ci::string &tag, const ci::string &var, int index) +bool ServerConfig::ConfValueBool(ConfigDataHash &target, const Anope::string &tag, const Anope::string &var, int index) { return ConfValueBool(target, tag, var, "", index); } -bool ServerConfig::ConfValueBool(ConfigDataHash &target, const ci::string &tag, const ci::string &var, const ci::string &default_value, int index) +bool ServerConfig::ConfValueBool(ConfigDataHash &target, const Anope::string &tag, const Anope::string &var, const Anope::string &default_value, int index) { - ci::string result; + Anope::string result; if (!ConfValue(target, tag, var, default_value, index, result)) return false; - return result == "yes" || result == "true" || result == "1"; -} - -int ServerConfig::ConfValueEnum(ConfigDataHash &target, const char *tag) -{ - return target.count(tag); -} - -int ServerConfig::ConfValueEnum(ConfigDataHash &target, const std::string &tag) -{ - return target.count(tag.c_str()); + return result.equals_ci("yes") || result.equals_ci("true") || result.equals_ci("1"); } -int ServerConfig::ConfValueEnum(ConfigDataHash &target, const ci::string &tag) +int ServerConfig::ConfValueEnum(ConfigDataHash &target, const Anope::string &tag) { return target.count(tag); } -int ServerConfig::ConfVarEnum(ConfigDataHash &target, const char *tag, int index) -{ - return ConfVarEnum(target, ci::string(tag), index); -} - -int ServerConfig::ConfVarEnum(ConfigDataHash &target, const ci::string &tag, int index) +int ServerConfig::ConfVarEnum(ConfigDataHash &target, const Anope::string &tag, int index) { ConfigDataHash::size_type pos = index; @@ -1478,7 +1423,9 @@ ValueItem::ValueItem(const char *value) : v(value) { } ValueItem::ValueItem(const std::string &value) : v(value) { } -ValueItem::ValueItem(const ci::string &value) : v(value.c_str()) { } +ValueItem::ValueItem(const ci::string &value) : v(value) { } + +ValueItem::ValueItem(const Anope::string &value) : v(value) { } void ValueItem::Set(const char *value) { @@ -1492,7 +1439,12 @@ void ValueItem::Set(const std::string &value) void ValueItem::Set(const ci::string &value) { - v = value.c_str(); + v = value; +} + +void ValueItem::Set(const Anope::string &value) +{ + v = value; } void ValueItem::Set(int value) @@ -1504,9 +1456,9 @@ void ValueItem::Set(int value) int ValueItem::GetInteger() { - if (v.empty()) + if (v.empty() || !v.is_number_only()) return 0; - return atoi(v.c_str()); + return convertTo<int>(v); } const char *ValueItem::GetString() const @@ -1548,26 +1500,6 @@ void error(int linenum, const char *message, ...) /*************************************************************************/ -#define CHECK(v) \ -do \ -{ \ - if (!v) \ - {\ - error(0, #v " missing"); \ - retval = 0; \ - } \ -} while (0) - -#define CHEK2(v, n) \ -do \ -{ \ - if (!v) \ - { \ - error(0, #n " missing"); \ - retval = 0; \ - } \ -} while (0) - /* Read the entire configuration file. If an error occurs while reading * the file or a required directive is not found, print and log an * appropriate error message and return 0; otherwise, return 1. @@ -1579,24 +1511,24 @@ do \ int read_config(int reload) { int retval = 1; - char *s; int defconCount = 0; retval = Config.Read(reload ? false : true); - if (!retval) return 0; // Temporary until most of the below is modified to use the new parser -- CyberBotX + if (!retval) + return 0; // Temporary until most of the below is modified to use the new parser -- CyberBotX - if (temp_nsuserhost) + if (!temp_nsuserhost.empty()) { - if (!(s = strchr(temp_nsuserhost, '@'))) + size_t at = temp_nsuserhost.find('@'); + if (at == Anope::string::npos) { Config.NSEnforcerUser = temp_nsuserhost; Config.NSEnforcerHost = Config.ServiceHost; } else { - *s++ = 0; - Config.NSEnforcerUser = temp_nsuserhost; - Config.NSEnforcerHost = s; + Config.NSEnforcerUser = temp_nsuserhost.substr(0, at); + Config.NSEnforcerHost = temp_nsuserhost.substr(at + 1); } } @@ -1606,38 +1538,38 @@ int read_config(int reload) Config.NSDefFlags.SetFlag(NI_MEMO_SIGNON); Config.NSDefFlags.SetFlag(NI_MEMO_RECEIVE); } - else if (NSDefaults != "none") + else if (!NSDefaults.equals_ci("none")) { spacesepstream options(NSDefaults); - ci::string option; + Anope::string option; while (options.GetToken(option)) { - if (option == "kill") + if (option.equals_ci("kill")) Config.NSDefFlags.SetFlag(NI_KILLPROTECT); - else if (option == "killquick") + else if (option.equals_ci("killquick")) Config.NSDefFlags.SetFlag(NI_KILL_QUICK); - else if (option == "secure") + else if (option.equals_ci("secure")) Config.NSDefFlags.SetFlag(NI_SECURE); - else if (option == "private") + else if (option.equals_ci("private")) Config.NSDefFlags.SetFlag(NI_PRIVATE); - else if (option == "msg") + else if (option.equals_ci("msg")) { if (!Config.UsePrivmsg) Alog() << "msg in <nickserv:defaults> can only be used when UsePrivmsg is set"; else Config.NSDefFlags.SetFlag(NI_MSG); } - else if (option == "hideemail") + else if (option.equals_ci("hideemail")) Config.NSDefFlags.SetFlag(NI_HIDE_EMAIL); - else if (option == "hideusermask") + else if (option.equals_ci("hideusermask")) Config.NSDefFlags.SetFlag(NI_HIDE_MASK); - else if (option == "hidequit") + else if (option.equals_ci("hidequit")) Config.NSDefFlags.SetFlag(NI_HIDE_QUIT); - else if (option == "memosignon") + else if (option.equals_ci("memosignon")) Config.NSDefFlags.SetFlag(NI_MEMO_SIGNON); - else if (option == "memoreceive") + else if (option.equals_ci("memoreceive")) Config.NSDefFlags.SetFlag(NI_MEMO_RECEIVE); - else if (option == "autoop") + else if (option.equals_ci("autoop")) Config.NSDefFlags.SetFlag(NI_AUTOOP); } } @@ -1661,37 +1593,37 @@ int read_config(int reload) Config.CSDefFlags.SetFlag(CI_SECUREFOUNDER); Config.CSDefFlags.SetFlag(CI_SIGNKICK); } - else if (CSDefaults != "none") + else if (!CSDefaults.equals_ci("none")) { spacesepstream options(CSDefaults); - ci::string option; + Anope::string option; while (options.GetToken(option)) { - if (option == "keeptopic") + if (option.equals_ci("keeptopic")) Config.CSDefFlags.SetFlag(CI_KEEPTOPIC); - else if (option == "topiclock") + else if (option.equals_ci("topiclock")) Config.CSDefFlags.SetFlag(CI_TOPICLOCK); - else if (option == "private") + else if (option.equals_ci("private")) Config.CSDefFlags.SetFlag(CI_PRIVATE); - else if (option == "restricted") + else if (option.equals_ci("restricted")) Config.CSDefFlags.SetFlag(CI_RESTRICTED); - else if (option == "secure") + else if (option.equals_ci("secure")) Config.CSDefFlags.SetFlag(CI_SECURE); - else if (option == "secureops") + else if (option.equals_ci("secureops")) Config.CSDefFlags.SetFlag(CI_SECUREOPS); - else if (option == "securefounder") + else if (option.equals_ci("securefounder")) Config.CSDefFlags.SetFlag(CI_SECUREFOUNDER); - else if (option == "signkick") + else if (option.equals_ci("signkick")) Config.CSDefFlags.SetFlag(CI_SIGNKICK); - else if (option == "signkicklevel") + else if (option.equals_ci("signkicklevel")) Config.CSDefFlags.SetFlag(CI_SIGNKICK_LEVEL); - else if (option == "opnotice") + else if (option.equals_ci("opnotice")) Config.CSDefFlags.SetFlag(CI_OPNOTICE); - else if (option == "xop") + else if (option.equals_ci("xop")) Config.CSDefFlags.SetFlag(CI_XOP); - else if (option == "peace") + else if (option.equals_ci("peace")) Config.CSDefFlags.SetFlag(CI_PEACE); - else if (option == "persist") + else if (option.equals_ci("persist")) Config.CSDefFlags.SetFlag(CI_PERSIST); } } @@ -1699,18 +1631,18 @@ int read_config(int reload) if (!BSDefaults.empty()) { spacesepstream options(BSDefaults); - ci::string option; + Anope::string option; while (options.GetToken(option)) { - if (option == "dontkickops") + if (option.equals_ci("dontkickops")) Config.BSDefFlags.SetFlag(BS_DONTKICKOPS); - else if (option == "dontkickvoices") + else if (option.equals_ci("dontkickvoices")) Config.BSDefFlags.SetFlag(BS_DONTKICKVOICES); - else if (option == "greet") + else if (option.equals_ci("greet")) Config.BSDefFlags.SetFlag(BS_GREET); - else if (option == "fantasy") + else if (option.equals_ci("fantasy")) Config.BSDefFlags.SetFlag(BS_FANTASY); - else if (option == "symbiosis") + else if (option.equals_ci("symbiosis")) Config.BSDefFlags.SetFlag(BS_SYMBIOSIS); } } @@ -1721,82 +1653,75 @@ int read_config(int reload) if (!OSNotifications.empty()) { spacesepstream notifications(OSNotifications); - ci::string notice; + Anope::string notice; while (notifications.GetToken(notice)) { - if (notice == "oper") + if (notice.equals_ci("oper")) Config.WallOper = true; - else if (notice == "bados") + else if (notice.equals_ci("bados")) Config.WallBadOS = true; - else if (notice == "osglobal") + else if (notice.equals_ci("osglobal")) Config.WallOSGlobal = true; - else if (notice == "osmode") + else if (notice.equals_ci("osmode")) Config.WallOSMode = true; - else if (notice == "osclearmodes") + else if (notice.equals_ci("osclearmodes")) Config.WallOSClearmodes = true; - else if (notice == "oskick") + else if (notice.equals_ci("oskick")) Config.WallOSKick = true; - else if (notice == "osakill") + else if (notice.equals_ci("osakill")) Config.WallOSAkill = true; - else if (notice == "ossnline") + else if (notice.equals_ci("ossnline")) Config.WallOSSNLine = true; - else if (notice == "ossqline") + else if (notice.equals_ci("ossqline")) Config.WallOSSQLine = true; - else if (notice == "osszline") + else if (notice.equals_ci("osszline")) Config.WallOSSZLine = true; - else if (notice == "osnoop") + else if (notice.equals_ci("osnoop")) Config.WallOSNoOp = true; - else if (notice == "osjupe") + else if (notice.equals_ci("osjupe")) Config.WallOSJupe = true; - else if (notice == "akillexpire") + else if (notice.equals_ci("akillexpire")) Config.WallAkillExpire = true; - else if (notice == "snlineexpire") + else if (notice.equals_ci("snlineexpire")) Config.WallSNLineExpire = true; - else if (notice == "sqlineexpire") + else if (notice.equals_ci("sqlineexpire")) Config.WallSQLineExpire = true; - else if (notice == "szlineexpire") + else if (notice.equals_ci("szlineexpire")) Config.WallSZLineExpire = true; - else if (notice == "exceptionexpire") + else if (notice.equals_ci("exceptionexpire")) Config.WallExceptionExpire = true; - else if (notice == "getpass") + else if (notice.equals_ci("getpass")) Config.WallGetpass = true; - else if (notice == "setpass") + else if (notice.equals_ci("setpass")) Config.WallSetpass = true; - else if (notice == "forbid") + else if (notice.equals_ci("forbid")) Config.WallForbid = true; - else if (notice == "drop") + else if (notice.equals_ci("drop")) Config.WallDrop = true; } } /* Ulines */ - - if (UlineServers) + if (!UlineServers.empty()) { - Config.NumUlines = 0; + Config.Ulines.clear(); - s = strtok(UlineServers, " "); - do - { - if (s) - { - ++Config.NumUlines; - Config.Ulines = static_cast<char **>(realloc(Config.Ulines, sizeof(char *) * Config.NumUlines)); - Config.Ulines[Config.NumUlines - 1] = sstrdup(s); - } - } while ((s = strtok(NULL, " "))); + spacesepstream ulines(UlineServers); + Anope::string uline; + while (ulines.GetToken(uline)) + Config.Ulines.push_back(uline); } /* Modules Autoload building... :P */ - Config.ModulesAutoLoad = BuildStringList(!Modules.empty() ? Modules : ""); - Config.EncModuleList = BuildStringList(!EncModules.empty() ? EncModules : ""); - Config.DBModuleList = BuildStringList(!DBModules.empty() ? DBModules : ""); - Config.HostServCoreModules = BuildStringList(!HostCoreModules.empty() ? HostCoreModules : ""); - Config.MemoServCoreModules = BuildStringList(!MemoCoreModules.empty() ? MemoCoreModules : ""); - Config.BotServCoreModules = BuildStringList(!BotCoreModules.empty() ? BotCoreModules : ""); - Config.OperServCoreModules = BuildStringList(!OperCoreModules.empty() ? OperCoreModules : ""); - Config.ChanServCoreModules = BuildStringList(!ChanCoreModules.empty() ? ChanCoreModules : ""); - Config.NickServCoreModules = BuildStringList(!NickCoreModules.empty() ? NickCoreModules : ""); + Config.ModulesAutoLoad = BuildStringList(Modules); + Config.EncModuleList = BuildStringList(EncModules); + Config.DBModuleList = BuildStringList(DBModules); + Config.HostServCoreModules = BuildStringList(HostCoreModules); + Config.MemoServCoreModules = BuildStringList(MemoCoreModules); + Config.BotServCoreModules = BuildStringList(BotCoreModules); + Config.OperServCoreModules = BuildStringList(OperCoreModules); + Config.ChanServCoreModules = BuildStringList(ChanCoreModules); + Config.NickServCoreModules = BuildStringList(NickCoreModules); if (Config.LimitSessions) { @@ -1804,12 +1729,12 @@ int read_config(int reload) Config.SessionAutoKillExpiry = 1800; /* 30 minutes */ } - if (Config.s_BotServ) + if (!Config.s_BotServ.empty()) { - if (!Config.BSFantasyCharacter || !*Config.BSFantasyCharacter) - Config.BSFantasyCharacter = sstrdup("!"); - if (*Config.BSFantasyCharacter && strlen(Config.BSFantasyCharacter) > 1) - printf("*** Config.BSFantasyCharacter is more than 1 character long. Only the first\n*** character ('%c') will be used. The others will be ignored.\n", *Config.BSFantasyCharacter); + if (Config.BSFantasyCharacter.empty()) + Config.BSFantasyCharacter = "!"; + if (Config.BSFantasyCharacter.length() > 1) + printf("*** Config.BSFantasyCharacter is more than 1 character long. Only the first\n*** character ('%c') will be used. The others will be ignored.\n", Config.BSFantasyCharacter[0]); } /* Check the user keys */ @@ -1827,7 +1752,7 @@ int read_config(int reload) for (unsigned int level = 1; level < 5; ++level) { DefCon[level] = 0; - ci::string *levelDefinition = NULL; + Anope::string *levelDefinition = NULL; switch (level) { case 1: @@ -1843,28 +1768,28 @@ int read_config(int reload) levelDefinition = &DefCon4; } spacesepstream operations(*levelDefinition); - ci::string operation; + Anope::string operation; while (operations.GetToken(operation)) { - if (operation == "nonewchannels") + if (operation.equals_ci("nonewchannels")) AddDefCon(level, DEFCON_NO_NEW_CHANNELS); - else if (operation == "nonewnicks") + else if (operation.equals_ci("nonewnicks")) AddDefCon(level, DEFCON_NO_NEW_NICKS); - else if (operation == "nomlockchanges") + else if (operation.equals_ci("nomlockchanges")) AddDefCon(level, DEFCON_NO_MLOCK_CHANGE); - else if (operation == "forcechanmodes") + else if (operation.equals_ci("forcechanmodes")) AddDefCon(level, DEFCON_FORCE_CHAN_MODES); - else if (operation == "reducedsessions") + else if (operation.equals_ci("reducedsessions")) AddDefCon(level, DEFCON_REDUCE_SESSION); - else if (operation == "nonewclients") + else if (operation.equals_ci("nonewclients")) AddDefCon(level, DEFCON_NO_NEW_CLIENTS); - else if (operation == "operonly") + else if (operation.equals_ci("operonly")) AddDefCon(level, DEFCON_OPER_ONLY); - else if (operation == "silentoperonly") + else if (operation.equals_ci("silentoperonly")) AddDefCon(level, DEFCON_SILENT_OPER_ONLY); - else if (operation == "akillnewclients") + else if (operation.equals_ci("akillnewclients")) AddDefCon(level, DEFCON_AKILL_NEW_CLIENTS); - else if (operation == "nonewmemos") + else if (operation.equals_ci("nonewmemos")) AddDefCon(level, DEFCON_NO_NEW_MEMOS); } } @@ -1873,21 +1798,41 @@ int read_config(int reload) for (defconCount = 1; defconCount <= 5; ++defconCount) { if (CheckDefCon(defconCount, DEFCON_REDUCE_SESSION)) - CHECK(Config.DefConSessionLimit); + { + if (!Config.DefConSessionLimit) + { + error(0, "Config.DefConSessionLimit missing"); + retval = 0; + } + } if (CheckDefCon(defconCount, DEFCON_AKILL_NEW_CLIENTS)) { - CHECK(Config.DefConAKILL); - CHECK(Config.DefConAkillReason); + if (!Config.DefConAKILL) + { + error(0, "Config.DefConAKILL missing"); + retval = 0; + } + if (Config.DefConAkillReason.empty()) + { + error(0, "Config.DefConAkillReason missing"); + retval = 0; + } } if (CheckDefCon(defconCount, DEFCON_FORCE_CHAN_MODES)) - CHECK(Config.DefConChanModes); + { + if (Config.DefConChanModes.empty()) + { + error(0, "Config.DefConChanModes missing"); + retval = 0; + } + } } } SetDefaultMLock(); /* Disable the log channel if its defined in the conf, but not enabled */ - if (!Config.LogChannel && LogChan) + if (Config.LogChannel.empty() && LogChan) LogChan = false; if (!retval) diff --git a/src/configreader.cpp b/src/configreader.cpp index fc9a7cb28..9e17b34be 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -25,42 +25,42 @@ ConfigReader::~ConfigReader() delete this->data; } -ConfigReader::ConfigReader(const std::string &filename) : data(new ConfigDataHash), errorlog(new std::ostringstream(std::stringstream::in | std::stringstream::out)), privatehash(true), error(CONF_NO_ERROR) +ConfigReader::ConfigReader(const Anope::string &filename) : data(new ConfigDataHash), errorlog(new std::ostringstream(std::stringstream::in | std::stringstream::out)), privatehash(true), error(CONF_NO_ERROR) { Config.ClearStack(); } -std::string ConfigReader::ReadValue(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool allow_linefeeds) +Anope::string ConfigReader::ReadValue(const Anope::string &tag, const Anope::string &name, const Anope::string &default_value, int index, bool allow_linefeeds) { /* Don't need to strlcpy() tag and name anymore, ReadConf() takes const char* */ - ci::string result; + Anope::string result; - if (!Config.ConfValue(*this->data, ci::string(tag.c_str()), ci::string(name.c_str()), ci::string(default_value.c_str()), index, result, allow_linefeeds)) + if (!Config.ConfValue(*this->data, tag, name, default_value, index, result, allow_linefeeds)) this->error = CONF_VALUE_NOT_FOUND; - return result.c_str(); + return result; } -std::string ConfigReader::ReadValue(const std::string &tag, const std::string &name, int index, bool allow_linefeeds) +Anope::string ConfigReader::ReadValue(const Anope::string &tag, const Anope::string &name, int index, bool allow_linefeeds) { return ReadValue(tag, name, "", index, allow_linefeeds); } -bool ConfigReader::ReadFlag(const std::string &tag, const std::string &name, const std::string &default_value, int index) +bool ConfigReader::ReadFlag(const Anope::string &tag, const Anope::string &name, const Anope::string &default_value, int index) { - return Config.ConfValueBool(*this->data, ci::string(tag.c_str()), ci::string(name.c_str()), ci::string(default_value.c_str()), index); + return Config.ConfValueBool(*this->data, tag, name, default_value, index); } -bool ConfigReader::ReadFlag(const std::string &tag, const std::string &name, int index) +bool ConfigReader::ReadFlag(const Anope::string &tag, const Anope::string &name, int index) { return ReadFlag(tag, name, "", index); } -int ConfigReader::ReadInteger(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool need_positive) +int ConfigReader::ReadInteger(const Anope::string &tag, const Anope::string &name, const Anope::string &default_value, int index, bool need_positive) { int result; - if (!Config.ConfValueInteger(*this->data, ci::string(tag.c_str()), ci::string(name.c_str()), ci::string(default_value.c_str()), index, result)) + if (!Config.ConfValueInteger(*this->data, tag, name, default_value, index, result)) { this->error = CONF_VALUE_NOT_FOUND; return 0; @@ -75,7 +75,7 @@ int ConfigReader::ReadInteger(const std::string &tag, const std::string &name, c return result; } -int ConfigReader::ReadInteger(const std::string &tag, const std::string &name, int index, bool need_positive) +int ConfigReader::ReadInteger(const Anope::string &tag, const Anope::string &name, int index, bool need_positive) { return ReadInteger(tag, name, "", index, need_positive); } @@ -92,14 +92,14 @@ void ConfigReader::DumpErrors(bool bail) Config.ReportConfigError(this->errorlog->str(), bail); } -int ConfigReader::Enumerate(const std::string &tag) +int ConfigReader::Enumerate(const Anope::string &tag) { return Config.ConfValueEnum(*this->data, tag); } -int ConfigReader::EnumerateValues(const std::string &tag, int index) +int ConfigReader::EnumerateValues(const Anope::string &tag, int index) { - return Config.ConfVarEnum(*this->data, ci::string(tag.c_str()), index); + return Config.ConfVarEnum(*this->data, tag, index); } bool ConfigReader::Verify() diff --git a/src/encrypt.cpp b/src/encrypt.cpp index f70d8fa8c..0121c0c4a 100644 --- a/src/encrypt.cpp +++ b/src/encrypt.cpp @@ -18,7 +18,7 @@ * Encrypt string `src' of length `len', placing the result in buffer * `dest' of size `size'. Returns 0 on success, -1 on error. **/ -int enc_encrypt(const std::string &src, std::string &dest) +int enc_encrypt(const Anope::string &src, Anope::string &dest) { EventReturn MOD_RESULT; FOREACH_RESULT(I_OnEncrypt, OnEncrypt(src, dest)); @@ -33,15 +33,15 @@ int enc_encrypt(const std::string &src, std::string &dest) * allow decryption, and -1 if another failure occurred (e.g. destination * buffer too small). **/ -int enc_decrypt(const std::string &src, std::string &dest) +int enc_decrypt(const Anope::string &src, Anope::string &dest) { - size_t pos = src.find(":"); - if (pos == std::string::npos) + size_t pos = src.find(':'); + if (pos == Anope::string::npos) { Alog() << "Error: enc_decrypt() called with invalid password string (" << src << ")"; return -1; } - std::string hashm(src.begin(), src.begin() + pos); + Anope::string hashm(src.begin(), src.begin() + pos); EventReturn MOD_RESULT; FOREACH_RESULT(I_OnDecrypt, OnDecrypt(hashm, src, dest)); @@ -57,16 +57,15 @@ int enc_decrypt(const std::string &src, std::string &dest) * 0 if the password does not match * 0 if an error occurred while checking **/ -int enc_check_password(std::string &plaintext, std::string &password) +int enc_check_password(Anope::string &plaintext, Anope::string &password) { - std::string hashm; - size_t pos = password.find(":"); - if (pos == std::string::npos) + size_t pos = password.find(':'); + if (pos == Anope::string::npos) { Alog() << "Error: enc_check_password() called with invalid password string (" << password << ")"; return 0; } - hashm.assign(password.begin(), password.begin() + pos); + Anope::string hashm(password.begin(), password.begin() + pos); EventReturn MOD_RESULT; FOREACH_RESULT(I_OnCheckPassword, OnCheckPassword(hashm, plaintext, password)); diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index 3698ef565..72bcf0936 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -8,7 +8,7 @@ * for use in Anope. */ -#include "hashcomp.h" +#include "anope.h" /****************************************************** * @@ -103,33 +103,23 @@ const char *ci::ci_char_traits::find(const char *s1, int n, char c) return n >= 0 ? s1 : NULL; } -sepstream::sepstream(const std::string &source, char seperator) : tokens(source), sep(seperator) +sepstream::sepstream(const Anope::string &source, char seperator) : tokens(source), sep(seperator) { last_starting_position = n = tokens.begin(); } -sepstream::sepstream(const ci::string &source, char seperator) : tokens(source.c_str()), sep(seperator) +bool sepstream::GetToken(Anope::string &token) { - last_starting_position = n = tokens.begin(); -} - -sepstream::sepstream(const char *source, char seperator) : tokens(source), sep(seperator) -{ - last_starting_position = n = tokens.begin(); -} - -bool sepstream::GetToken(std::string &token) -{ - std::string::iterator lsp = last_starting_position; + Anope::string::iterator lsp = last_starting_position; while (n != tokens.end()) { if (*n == sep || n + 1 == tokens.end()) { last_starting_position = n + 1; - token = std::string(lsp, n + 1 == tokens.end() ? n + 1 : n); + token = Anope::string(lsp, n + 1 == tokens.end() ? n + 1 : n); - while (token.length() && token.find_last_of(sep) == token.length() - 1) + while (token.length() && token.rfind(sep) == token.length() - 1) token.erase(token.end() - 1); ++n; @@ -140,21 +130,13 @@ bool sepstream::GetToken(std::string &token) ++n; } - token = ""; + token.clear(); return false; } -bool sepstream::GetToken(ci::string &token) +const Anope::string sepstream::GetRemaining() { - std::string tmp_token; - bool result = GetToken(tmp_token); - token = tmp_token.c_str(); - return result; -} - -const std::string sepstream::GetRemaining() -{ - return std::string(n, tokens.end()); + return Anope::string(n, tokens.end()); } bool sepstream::StreamEnd() @@ -162,7 +144,6 @@ bool sepstream::StreamEnd() return n == tokens.end(); } -#if defined(_WIN32) && _MSV_VER < 1600 /** Compare two std::string's values for hashing in hash_map * @param s1 The first string * @param s2 The second string @@ -171,11 +152,16 @@ bool sepstream::StreamEnd() */ bool hash_compare_std_string::operator()(const std::string &s1, const std::string &s2) const { - if (s1.length() != s2.length()) - return true; - return (std::char_traits<char>::compare(s1.c_str(), s2.c_str(), s1.length()) < 0); + register int i = std::char_traits<char>::compare(s1.c_str(), s2.c_str(), s1.length() < s2.length() ? s1.length() : s2.length()); + if (!i) + return s1.length() < s2.length(); + return i < 0; +} + +bool hash_compare_std_string::operator()(const Anope::string &s1, const Anope::string &s2) const +{ + return operator()(s1.str(), s2.str()); } -#endif /** Return a hash value for a string * @param s The string @@ -191,7 +177,11 @@ size_t hash_compare_std_string::operator()(const std::string &s) const return t; } -#if defined(_WIN32) && _MSV_VER < 1600 +size_t hash_compare_std_string::operator()(const Anope::string &s) const +{ + return operator()(s.str()); +} + /** Compare two ci::string's values for hashing in hash_map * @param s1 The first string * @param s2 The second string @@ -200,11 +190,16 @@ size_t hash_compare_std_string::operator()(const std::string &s) const */ bool hash_compare_ci_string::operator()(const ci::string &s1, const ci::string &s2) const { - if (s1.length() != s2.length()) - return true; - return (ci::ci_char_traits::compare(s1.c_str(), s2.c_str(), s1.length()) < 0); + register int i = ci::ci_char_traits::compare(s1.c_str(), s2.c_str(), s1.length() < s2.length() ? s1.length() : s2.length()); + if (!i) + return s1.length() < s2.length(); + return i < 0; +} + +bool hash_compare_ci_string::operator()(const Anope::string &s1, const Anope::string &s2) const +{ + return operator()(s1.ci_str(), s2.ci_str()); } -#endif /** Return a hash value for a string using case insensitivity * @param s The string @@ -220,7 +215,11 @@ size_t hash_compare_ci_string::operator()(const ci::string &s) const return t; } -#if defined(_WIN32) && _MSV_VER < 1600 +size_t hash_compare_ci_string::operator()(const Anope::string &s) const +{ + return operator()(s.ci_str()); +} + /** Compare two irc::string's values for hashing in hash_map * @param s1 The first string * @param s2 The second string @@ -229,11 +228,16 @@ size_t hash_compare_ci_string::operator()(const ci::string &s) const */ bool hash_compare_irc_string::operator()(const irc::string &s1, const irc::string &s2) const { - if (s1.length() != s2.length()) - return true; - return (irc::irc_char_traits::compare(s1.c_str(), s2.c_str(), s1.length()) < 0); + register int i = irc::irc_char_traits::compare(s1.c_str(), s2.c_str(), s1.length() < s2.length() ? s1.length() : s2.length()); + if (!i) + return s1.length() < s2.length(); + return i < 0; +} + +bool hash_compare_irc_string::operator()(const Anope::string &s1, const Anope::string &s2) const +{ + return operator()(s1.irc_str(), s2.irc_str()); } -#endif /** Return a hash value for a string using RFC1459 case sensitivity rules * @param s The string @@ -248,3 +252,8 @@ size_t hash_compare_irc_string::operator()(const irc::string &s) const return t; } + +size_t hash_compare_irc_string::operator()(const Anope::string &s) const +{ + return operator()(s.irc_str()); +} diff --git a/src/hostserv.cpp b/src/hostserv.cpp index f59ac8c6e..b4ccabacb 100644 --- a/src/hostserv.cpp +++ b/src/hostserv.cpp @@ -13,8 +13,6 @@ #include "modules.h" #include "language.h" -E int do_hs_sync(NickCore *nc, char *vIdent, char *hostmask, char *creator, time_t time); - E void moduleAddHostServCmds(); /*************************************************************************/ @@ -43,11 +41,11 @@ void get_hostserv_stats(long *nrec, long *memuse) continue; if (!na->hostinfo.GetIdent().empty()) - mem += na->hostinfo.GetIdent().size(); + mem += na->hostinfo.GetIdent().length(); if (!na->hostinfo.GetHost().empty()) - mem += na->hostinfo.GetHost().size(); + mem += na->hostinfo.GetHost().length(); if (!na->hostinfo.GetCreator().empty()) - mem += na->hostinfo.GetCreator().size(); + mem += na->hostinfo.GetCreator().length(); ++count; } @@ -63,7 +61,7 @@ void get_hostserv_stats(long *nrec, long *memuse) */ void hostserv_init() { - if (Config.s_HostServ) + if (!Config.s_HostServ.empty()) moduleAddHostServCmds(); } @@ -75,20 +73,20 @@ void hostserv_init() * @param buf Buffer holding the message * @return void */ -void hostserv(User *u, const std::string &buf) +void hostserv(User *u, const Anope::string &buf) { if (!u || buf.empty()) return; - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_ci("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string command = buf; + Anope::string command = buf; command.erase(command.begin()); command.erase(command.end()); - ircdproto->SendCTCP(HostServ, u->nick.c_str(), "%s", command.c_str()); + ircdproto->SendCTCP(HostServ, u->nick, "%s", command.c_str()); } else if (!ircd->vhost) - notice_lang(Config.s_HostServ, u, SERVICE_OFFLINE, Config.s_HostServ); + notice_lang(Config.s_HostServ, u, SERVICE_OFFLINE, Config.s_HostServ.c_str()); else mod_run_cmd(HostServ, u, buf); } @@ -99,7 +97,7 @@ void hostserv(User *u, const std::string &buf) * @param creator Who created the vhost * @param time When the vhost was craated */ -void HostInfo::SetVhost(const std::string &ident, const std::string &host, const std::string &creator, time_t created) +void HostInfo::SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created) { Ident = ident; Host = host; @@ -128,7 +126,7 @@ bool HostInfo::HasVhost() const /** Retrieve the vhost ident * @return the ident */ -const std::string &HostInfo::GetIdent() const +const Anope::string &HostInfo::GetIdent() const { return Ident; } @@ -136,7 +134,7 @@ const std::string &HostInfo::GetIdent() const /** Retrieve the vhost host * @return the host */ -const std::string &HostInfo::GetHost() const +const Anope::string &HostInfo::GetHost() const { return Host; } @@ -144,7 +142,7 @@ const std::string &HostInfo::GetHost() const /** Retrieve the vhost creator * @return the creator */ -const std::string &HostInfo::GetCreator() const +const Anope::string &HostInfo::GetCreator() const { return Creator; } @@ -186,15 +184,11 @@ void do_on_id(User *u) if (!na || !na->hostinfo.HasVhost()) return; - if (!u->vhost || u->vhost != na->hostinfo.GetHost() || (!na->hostinfo.GetIdent().empty() && u->GetVIdent() != na->hostinfo.GetIdent())) + if (u->vhost.empty() || !u->vhost.equals_cs(na->hostinfo.GetHost()) || (!na->hostinfo.GetIdent().empty() && !u->GetVIdent().equals_cs(na->hostinfo.GetIdent()))) { ircdproto->SendVhost(u, na->hostinfo.GetIdent(), na->hostinfo.GetHost()); if (ircd->vhost) - { - if (u->vhost) - delete [] u->vhost; - u->vhost = sstrdup(na->hostinfo.GetHost().c_str()); - } + u->vhost = na->hostinfo.GetHost(); if (ircd->vident && !na->hostinfo.GetIdent().empty()) u->SetVIdent(na->hostinfo.GetIdent()); u->UpdateHost(); diff --git a/src/init.cpp b/src/init.cpp index 6ea0cab35..7388f7e79 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -19,7 +19,7 @@ extern void moduleAddIRCDMsgs(); /*************************************************************************/ -void introduce_user(const std::string &user) +void introduce_user(const Anope::string &user) { /* Watch out for infinite loops... */ #define LTSIZE 20 @@ -36,11 +36,10 @@ void introduce_user(const std::string &user) { BotInfo *bi = it->second; - ci::string ci_bi_nick(bi->nick.c_str()); - if (user.empty() || ci_bi_nick == user) + if (user.empty() || bi->nick.equals_ci(user)) { ircdproto->SendClientIntroduction(bi->nick, bi->GetIdent(), bi->host, bi->realname, ircd->pseudoclient_mode, bi->GetUID()); - XLine x(bi->nick.c_str(), "Reserved for services"); + XLine x(bi->nick, "Reserved for services"); ircdproto->SendSQLine(&x); } } @@ -58,7 +57,7 @@ static int set_group() struct group *gr; setgrent(); - while ((gr = getgrent()) != NULL) + while ((gr = getgrent())) { if (!strcmp(gr->gr_name, RUNGROUP)) break; @@ -82,7 +81,7 @@ static int set_group() /*************************************************************************/ /* Vector of pairs of command line arguments and their params */ -static std::vector<std::pair<std::string, std::string> > CommandLineArguments; +static std::vector<std::pair<Anope::string, Anope::string> > CommandLineArguments; /** Called on startup to organize our starting arguments in a better way * and check for errors @@ -93,12 +92,12 @@ static void ParseCommandLineArguments(int ac, char **av) { for (int i = 1; i < ac; ++i) { - std::string option = av[i]; - std::string param = ""; + Anope::string option = av[i]; + Anope::string param; while (!option.empty() && option[0] == '-') option.erase(option.begin()); size_t t = option.find('='); - if (t != std::string::npos) + if (t != Anope::string::npos) { param = option.substr(t + 1); option.erase(t); @@ -116,9 +115,9 @@ static void ParseCommandLineArguments(int ac, char **av) * @param shortname A shorter name, eg --debug and -d * @return true if name/shortname was found, false if not */ -bool GetCommandLineArgument(const std::string &name, char shortname) +bool GetCommandLineArgument(const Anope::string &name, char shortname) { - std::string Unused; + Anope::string Unused; return GetCommandLineArgument(name, shortname, Unused); } @@ -128,13 +127,13 @@ bool GetCommandLineArgument(const std::string &name, char shortname) * @param param A string to put the param, if any, of the argument * @return true if name/shortname was found, false if not */ -bool GetCommandLineArgument(const std::string &name, char shortname, std::string ¶m) +bool GetCommandLineArgument(const Anope::string &name, char shortname, Anope::string ¶m) { param.clear(); - for (std::vector<std::pair<std::string, std::string> >::iterator it = CommandLineArguments.begin(), it_end = CommandLineArguments.end(); it != it_end; ++it) + for (std::vector<std::pair<Anope::string, Anope::string> >::iterator it = CommandLineArguments.begin(), it_end = CommandLineArguments.end(); it != it_end; ++it) { - if (it->first == name || it->first[0] == shortname) + if (it->first.equals_ci(name) || it->first[0] == shortname) { param = it->second; return true; @@ -150,7 +149,7 @@ bool GetCommandLineArgument(const std::string &name, char shortname, std::string static void remove_pidfile() { - remove(Config.PIDFilename); + remove(Config.PIDFilename.c_str()); } /*************************************************************************/ @@ -161,7 +160,7 @@ static void write_pidfile() { FILE *pidfile; - pidfile = fopen(Config.PIDFilename, "w"); + pidfile = fopen(Config.PIDFilename.c_str(), "w"); if (pidfile) { #ifdef _WIN32 @@ -173,7 +172,7 @@ static void write_pidfile() atexit(remove_pidfile); } else - log_perror("Warning: cannot write to PID file %s", Config.PIDFilename); + log_perror("Warning: cannot write to PID file %s", Config.PIDFilename.c_str()); } /*************************************************************************/ @@ -246,12 +245,12 @@ int init_primary(int ac, char **av) if (GetCommandLineArgument("protocoldebug")) protocoldebug = 1; - std::string Arg; + Anope::string Arg; if (GetCommandLineArgument("debug", 'd', Arg)) { - if (!Arg.empty()) - { - int level = atoi(Arg.c_str()); + if (!Arg.empty()) + { + int level = Arg.is_number_only() ? convertTo<int>(Arg) : -1; if (level > 0) debug = level; else @@ -259,9 +258,9 @@ int init_primary(int ac, char **av) Alog(LOG_TERMINAL) << "Invalid option given to --debug"; return -1; } - } - else - ++debug; + } + else + ++debug; } if (GetCommandLineArgument("config", 'c', Arg)) @@ -271,7 +270,7 @@ int init_primary(int ac, char **av) Alog(LOG_TERMINAL) << "The --config option requires a file name"; return -1; } - services_conf = Arg.c_str(); + services_conf = Arg; } if (GetCommandLineArgument("dir", 0, Arg)) @@ -318,9 +317,9 @@ int init_primary(int ac, char **av) /* Add IRCD Protocol Module; exit if there are errors */ if (protocol_module_init()) return -1; - + /* Create me */ - Me = new Server(NULL, Config.ServerName, 0, Config.ServerDesc, (Config.Numeric ? Config.Numeric : "")); + Me = new Server(NULL, Config.ServerName, 0, Config.ServerDesc, Config.Numeric); /* First thing, add our core bots internally. Before modules are loaded and before the database is read * This is used for modules adding commands and for the BotInfo* poiners in the command classes. @@ -334,19 +333,19 @@ int init_primary(int ac, char **av) * Note that it is important this is after loading the protocol module. The ircd struct must exist for * the ts6_ functions */ - if (Config.s_OperServ) + if (!Config.s_OperServ.empty()) new BotInfo(Config.s_OperServ, Config.ServiceUser, Config.ServiceHost, Config.desc_OperServ); - if (Config.s_NickServ) + if (!Config.s_NickServ.empty()) new BotInfo(Config.s_NickServ, Config.ServiceUser, Config.ServiceHost, Config.desc_NickServ); - if (Config.s_ChanServ) + if (!Config.s_ChanServ.empty()) new BotInfo(Config.s_ChanServ, Config.ServiceUser, Config.ServiceHost, Config.desc_ChanServ); - if (Config.s_HostServ) + if (!Config.s_HostServ.empty()) new BotInfo(Config.s_HostServ, Config.ServiceUser, Config.ServiceHost, Config.desc_HostServ); - if (Config.s_MemoServ) + if (!Config.s_MemoServ.empty()) new BotInfo(Config.s_MemoServ, Config.ServiceUser, Config.ServiceHost, Config.desc_MemoServ); - if (Config.s_BotServ) + if (!Config.s_BotServ.empty()) new BotInfo(Config.s_BotServ, Config.ServiceUser, Config.ServiceHost, Config.desc_BotServ); - if (Config.s_GlobalNoticer) + if (!Config.s_GlobalNoticer.empty()) new BotInfo(Config.s_GlobalNoticer, Config.ServiceUser, Config.ServiceHost, Config.desc_GlobalNoticer); /* Add Encryption Modules */ @@ -399,11 +398,7 @@ int init_secondary(int ac, char **av) #else if (!SupportedWindowsVersion()) { - char *winver = GetWindowsVersion(); - - Alog() << winver << " is not a supported version of Windows"; - - delete [] winver; + Alog() << GetWindowsVersion() << " is not a supported version of Windows"; return -1; } diff --git a/src/ircd.cpp b/src/ircd.cpp index c06237a1b..e6ac76079 100644 --- a/src/ircd.cpp +++ b/src/ircd.cpp @@ -18,7 +18,7 @@ IRCDProto *ircdproto; * Globals we want from the protocol file **/ IRCDVar *ircd; -char *version_protocol; +Anope::string version_protocol; int UseTSMODE; void pmodule_ircd_proto(IRCDProto *proto) @@ -26,19 +26,6 @@ void pmodule_ircd_proto(IRCDProto *proto) ircdproto = proto; } -void anope_SendNumeric(const char *source, int numeric, const char *dest, const char *fmt, ...) -{ - va_list args; - char buf[BUFSIZE] = ""; - if (fmt) - { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - ircdproto->SendNumeric(source, numeric, dest, buf); -} - /** * Set routines for modules to set the prefered function for dealing with things. **/ @@ -47,9 +34,9 @@ void pmodule_ircd_var(IRCDVar *ircdvar) ircd = ircdvar; } -void pmodule_ircd_version(const char *version) +void pmodule_ircd_version(const Anope::string &version) { - version_protocol = sstrdup(version); + version_protocol = version; } void pmodule_ircd_useTSMode(int use) diff --git a/src/language.cpp b/src/language.cpp index 473df39e8..558363f17 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -172,7 +172,7 @@ void lang_sanitize() strnrepl(tmp, sizeof(tmp), "%R", "/"); else strnrepl(tmp, sizeof(tmp), "%R", "/msg "); - newstr = sstrdup(tmp); + newstr = strdup(tmp); delete [] langtexts[i][j]; langtexts[i][j] = newstr; } @@ -303,7 +303,7 @@ int strftime_lang(char *buf, int size, User *u, int format, struct tm *tm) /* Send a syntax-error message to the user. */ -void syntax_error(char *service, User *u, const char *command, int msgnum) +void syntax_error(const Anope::string &service, User *u, const Anope::string &command, int msgnum) { const char *str; @@ -312,7 +312,7 @@ void syntax_error(char *service, User *u, const char *command, int msgnum) str = getstring(u, msgnum); notice_lang(service, u, SYNTAX_ERROR, str); - notice_lang(service, u, MORE_INFO, service, command); + notice_lang(service, u, MORE_INFO, service.c_str(), command.c_str()); } const char *getstring(NickAlias *na, int index) @@ -327,7 +327,7 @@ const char *getstring(NickAlias *na, int index) return langtexts[langidx][index]; } -const char *getstring(NickCore *nc, int index) +const char *getstring(const NickCore *nc, int index) { // Default to config int langidx = Config.NSDefLanguage; diff --git a/src/log.cpp b/src/log.cpp index 3ce47c526..9f5e05ebc 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -17,7 +17,7 @@ static int curday = 0; /*************************************************************************/ -static int get_logname(char *name, int count, struct tm *tm) +static int get_logname(Anope::string &name, struct tm *tm) { char timestamp[32]; time_t t; @@ -30,7 +30,7 @@ static int get_logname(char *name, int count, struct tm *tm) /* fix bug 577 */ strftime(timestamp, sizeof(timestamp), "%Y%m%d", tm); - snprintf(name, count, "logs/%s.%s", timestamp, log_filename.c_str()); + name = Anope::string("logs/") + timestamp + "." + log_filename; curday = tm->tm_yday; return 1; @@ -43,7 +43,7 @@ static void remove_log() time_t t; struct tm tm; - char name[PATH_MAX]; + Anope::string name; if (!Config.KeepLogs) return; @@ -53,8 +53,8 @@ static void remove_log() tm = *localtime(&t); /* removed if from here cause get_logchan is always 1 */ - get_logname(name, sizeof(name), &tm); - DeleteFile(name); + get_logname(name, &tm); + DeleteFile(name.c_str()); } /*************************************************************************/ @@ -82,18 +82,18 @@ static void checkday() int open_log() { - char name[PATH_MAX]; + Anope::string name; if (logfile) return 0; /* if removed again.. get_logname is always 1 */ - get_logname(name, sizeof(name), NULL); - logfile = fopen(name, "a"); + get_logname(name, NULL); + logfile = fopen(name.c_str(), "a"); if (logfile) setbuf(logfile, NULL); - return logfile != NULL ? 0 : -1; + return logfile ? 0 : -1; } /*************************************************************************/ @@ -111,11 +111,11 @@ void close_log() /*************************************************************************/ /* added cause this is used over and over in the code */ -char *log_gettimestamp() +Anope::string log_gettimestamp() { time_t t; struct tm tm; - static char tbuf[256]; + char tbuf[256]; time(&t); tm = *localtime(&t); @@ -145,7 +145,6 @@ char *log_gettimestamp() void log_perror(const char *fmt, ...) { va_list args; - char *buf; int errno_save = errno; char str[BUFSIZE]; @@ -158,12 +157,12 @@ void log_perror(const char *fmt, ...) vsnprintf(str, sizeof(str), fmt, args); va_end(args); - buf = log_gettimestamp(); + Anope::string buf = log_gettimestamp(); if (logfile) - fprintf(logfile, "%s %s : %s\n", buf, str, strerror(errno_save)); + fprintf(logfile, "%s %s : %s\n", buf.c_str(), str, strerror(errno_save)); if (nofork) - fprintf(stderr, "%s %s : %s\n", buf, str, strerror(errno_save)); + fprintf(stderr, "%s %s : %s\n", buf.c_str(), str, strerror(errno_save)); errno = errno_save; } @@ -176,7 +175,6 @@ void log_perror(const char *fmt, ...) void fatal(const char *fmt, ...) { va_list args; - char *buf; char buf2[4096]; checkday(); @@ -188,12 +186,12 @@ void fatal(const char *fmt, ...) vsnprintf(buf2, sizeof(buf2), fmt, args); va_end(args); - buf = log_gettimestamp(); + Anope::string buf = log_gettimestamp(); if (logfile) - fprintf(logfile, "%s FATAL: %s\n", buf, buf2); + fprintf(logfile, "%s FATAL: %s\n", buf.c_str(), buf2); if (nofork) - fprintf(stderr, "%s FATAL: %s\n", buf, buf2); + fprintf(stderr, "%s FATAL: %s\n", buf.c_str(), buf2); if (UplinkSock) ircdproto->SendGlobops(NULL, "FATAL ERROR! %s", buf2); @@ -210,7 +208,6 @@ void fatal(const char *fmt, ...) void fatal_perror(const char *fmt, ...) { va_list args; - char *buf; char buf2[4096]; int errno_save = errno; @@ -223,12 +220,12 @@ void fatal_perror(const char *fmt, ...) vsnprintf(buf2, sizeof(buf2), fmt, args); va_end(args); - buf = log_gettimestamp(); + Anope::string buf = log_gettimestamp(); if (logfile) - fprintf(logfile, "%s FATAL: %s: %s\n", buf, buf2, strerror(errno_save)); + fprintf(logfile, "%s FATAL: %s: %s\n", buf.c_str(), buf2, strerror(errno_save)); if (nofork) - fprintf(stderr, "%s FATAL: %s: %s\n", buf, buf2, strerror(errno_save)); + fprintf(stderr, "%s FATAL: %s: %s\n", buf.c_str(), buf2, strerror(errno_save)); if (UplinkSock) ircdproto->SendGlobops(NULL, "FATAL ERROR! %s: %s", buf2, strerror(errno_save)); @@ -249,20 +246,19 @@ Alog::~Alog() if (Level >= LOG_DEBUG && (Level - LOG_DEBUG + 1) > debug) return; - char *tbuf; int errno_save = errno; checkday(); - tbuf = log_gettimestamp(); + Anope::string tbuf = log_gettimestamp(); if (logfile) - fprintf(logfile, "%s %s\n", tbuf, buf.str().c_str()); + fprintf(logfile, "%s %s\n", tbuf.c_str(), buf.str().c_str()); if (nofork) std::cout << tbuf << " " << buf.str() << std::endl; else if (Level == LOG_TERMINAL) // XXX dont use this yet unless you know we're at terminal and not daemonized std::cout << buf.str() << std::endl; - if (Config.LogChannel && LogChan && !debug && findchan(Config.LogChannel)) + if (!Config.LogChannel.empty() && LogChan && !debug && findchan(Config.LogChannel)) ircdproto->SendPrivmsg(Global, Config.LogChannel, "%s", buf.str().c_str()); errno = errno_save; } diff --git a/src/mail.cpp b/src/mail.cpp index c7c8ebda7..b5e2149f9 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -11,12 +11,12 @@ MailThread::~MailThread() void MailThread::Run() { - FILE *pipe = popen(Config.SendMailPath, "w"); + FILE *pipe = popen(Config.SendMailPath.c_str(), "w"); if (!pipe) return; - fprintf(pipe, "From: %s\n", Config.SendFrom); + fprintf(pipe, "From: %s\n", Config.SendFrom.c_str()); if (Config.DontQuoteAddresses) fprintf(pipe, "To: %s <%s>\n", MailTo.c_str(), Addr.c_str()); else @@ -30,7 +30,7 @@ void MailThread::Run() Success = true; } -bool Mail(User *u, NickRequest *nr, const std::string &service, const std::string &subject, const std::string &message) +bool Mail(User *u, NickRequest *nr, const Anope::string &service, const Anope::string &subject, const Anope::string &message) { if (!u || !nr || subject.empty() || service.empty() || message.empty()) return false; @@ -38,11 +38,11 @@ bool Mail(User *u, NickRequest *nr, const std::string &service, const std::strin time_t t = time(NULL); if (!Config.UseMail) - notice_lang(service.c_str(), u, MAIL_DISABLED); + notice_lang(service, u, MAIL_DISABLED); else if (t - u->lastmail < Config.MailDelay) - notice_lang(service.c_str(), u, MAIL_DELAYED, t - u->lastmail); - else if (!nr->email) - notice_lang(service.c_str(), u, MAIL_INVALID, nr->nick); + notice_lang(service, u, MAIL_DELAYED, t - u->lastmail); + else if (nr->email.empty()) + notice_lang(service, u, MAIL_INVALID, nr->nick.c_str()); else { u->lastmail = nr->lastmail = t; @@ -53,7 +53,7 @@ bool Mail(User *u, NickRequest *nr, const std::string &service, const std::strin return false; } -bool Mail(User *u, NickCore *nc, const std::string &service, const std::string &subject, const std::string &message) +bool Mail(User *u, NickCore *nc, const Anope::string &service, const Anope::string &subject, const Anope::string &message) { if (!u || !nc || subject.empty() || service.empty() || message.empty()) return false; @@ -61,11 +61,11 @@ bool Mail(User *u, NickCore *nc, const std::string &service, const std::string & time_t t = time(NULL); if (!Config.UseMail) - notice_lang(service.c_str(), u, MAIL_DISABLED); + notice_lang(service, u, MAIL_DISABLED); else if (t - u->lastmail < Config.MailDelay) - notice_lang(service.c_str(), u, MAIL_DELAYED, t - u->lastmail); - else if (!nc->email) - notice_lang(service.c_str(), u, MAIL_INVALID, nc->display); + notice_lang(service, u, MAIL_DELAYED, t - u->lastmail); + else if (nc->email.empty()) + notice_lang(service, u, MAIL_INVALID, nc->display.c_str()); else { u->lastmail = nc->lastmail = t; @@ -76,9 +76,9 @@ bool Mail(User *u, NickCore *nc, const std::string &service, const std::string & return false; } -bool Mail(NickCore *nc, const std::string &subject, const std::string &message) +bool Mail(NickCore *nc, const Anope::string &subject, const Anope::string &message) { - if (!Config.UseMail || !nc || !nc->email || subject.empty() || message.empty()) + if (!Config.UseMail || !nc || nc->email.empty() || subject.empty() || message.empty()) return false; nc->lastmail = time(NULL); @@ -96,28 +96,28 @@ bool Mail(NickCore *nc, const std::string &subject, const std::string &message) * @param email Email to Validate * @return bool */ -bool MailValidate(const std::string &email) +bool MailValidate(const Anope::string &email) { bool has_period = false; - char copy[BUFSIZE]; static char specials[] = {'(', ')', '<', '>', '@', ',', ';', ':', '\\', '\"', '[', ']', ' '}; if (email.empty()) return false; - strlcpy(copy, email.c_str(), sizeof(copy)); + Anope::string copy = email; - char *domain = strchr(copy, '@'); - if (!domain) + size_t at = copy.find('@'); + if (at == Anope::string::npos) return false; - *domain++ = '\0'; + Anope::string domain = copy.substr(at + 1); + copy = copy.substr(0, at); - /* Don't accept NULL copy or domain. */ - if (!*copy || !*domain) + /* Don't accept empty copy or domain. */ + if (copy.empty() || domain.empty()) return false; /* Check for forbidden characters in the name */ - for (unsigned int i = 0; i < strlen(copy); ++i) + for (unsigned i = 0, end = copy.length(); i < end; ++i) { if (copy[i] <= 31 || copy[i] >= 127) return false; @@ -127,7 +127,7 @@ bool MailValidate(const std::string &email) } /* Check for forbidden characters in the domain */ - for (unsigned int i = 0; i < strlen(domain); ++i) + for (unsigned i = 0, end = domain.length(); i < end; ++i) { if (domain[i] <= 31 || domain[i] >= 127) return false; @@ -136,7 +136,7 @@ bool MailValidate(const std::string &email) return false; if (domain[i] == '.') { - if (!i || i == strlen(domain) - 1) + if (!i || i == end - 1) return false; has_period = true; } diff --git a/src/main.cpp b/src/main.cpp index dccfcc15f..5e29db9f8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,15 +34,13 @@ # include <sys/resource.h> #endif -const char * const Anope::compiled = __TIME__ " " __DATE__; - /******** Global variables! ********/ /* Command-line options: (note that configuration variables are in config.c) */ -std::string services_dir; /* -dir dirname */ -std::string services_bin; /* Binary as specified by the user */ -std::string orig_cwd; /* Original current working directory */ -std::string log_filename = "services.log"; /* -log filename */ +Anope::string services_dir; /* -dir dirname */ +Anope::string services_bin; /* Binary as specified by the user */ +Anope::string orig_cwd; /* Original current working directory */ +Anope::string log_filename = "services.log"; /* -log filename */ int debug = 0; /* -debug */ int readonly = 0; /* -readonly */ bool LogChan = false; /* -logchan */ @@ -52,7 +50,7 @@ int nothird = 0; /* -nothrid */ int noexpire = 0; /* -noexpire */ int protocoldebug = 0; /* -protocoldebug */ -std::string binary_dir; /* Used to store base path for Anope */ +Anope::string binary_dir; /* Used to store base path for Anope */ #ifdef _WIN32 # include <process.h> # define execve _execve @@ -65,7 +63,7 @@ int quitting = 0; int shutting_down = 0; /* Contains a message as to why services is terminating */ -const char *quitmsg = NULL; +Anope::string quitmsg; /* Should we update the databases now? */ int save_data = 0; @@ -112,7 +110,7 @@ Socket *UplinkSock = NULL; class UplinkSocket : public ClientSocket { public: - UplinkSocket(const std::string &nTargetHost, int nPort, const std::string &nBindHost = "", bool nIPv6 = false) : ClientSocket(nTargetHost, nPort, nBindHost, nIPv6) + UplinkSocket(const Anope::string &nTargetHost, int nPort, const Anope::string &nBindHost = "", bool nIPv6 = false) : ClientSocket(nTargetHost, nPort, nBindHost, nIPv6) { UplinkSock = this; } @@ -124,7 +122,7 @@ class UplinkSocket : public ClientSocket UplinkSock = NULL; } - bool Read(const std::string &buf) + bool Read(const Anope::string &buf) { process(buf); return true; @@ -178,7 +176,7 @@ void do_restart_services() FOREACH_MOD(I_OnPreRestart, OnPreRestart()); - if (!quitmsg) + if (quitmsg.empty()) quitmsg = "Restarting"; /* Send a quit for all of our bots */ for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it) @@ -186,9 +184,9 @@ void do_restart_services() /* Don't use quitmsg here, it may contain information you don't want people to see */ ircdproto->SendQuit(it->second, "Restarting"); /* Erase bots from the user list so they don't get nuked later on */ - UserListByNick.erase(it->second->nick.c_str()); + UserListByNick.erase(it->second->nick); if (!it->second->GetUID().empty()) - UserListByUID.erase(it->second->GetUID().c_str()); + UserListByUID.erase(it->second->GetUID()); } ircdproto->SendSquit(Config.ServerName, quitmsg); delete UplinkSock; @@ -218,7 +216,7 @@ static void services_shutdown() { FOREACH_MOD(I_OnPreShutdown, OnPreShutdown()); - if (!quitmsg) + if (quitmsg.empty()) quitmsg = "Terminating, reason unknown"; Alog() << quitmsg; if (started && UplinkSock) @@ -229,7 +227,7 @@ static void services_shutdown() /* Don't use quitmsg here, it may contain information you don't want people to see */ ircdproto->SendQuit(it->second, "Shutting down"); /* Erase bots from the user list so they don't get nuked later on */ - UserListByNick.erase(it->second->nick.c_str()); + UserListByNick.erase(it->second->nick); if (!it->second->GetUID().empty()) UserListByUID.erase(it->second->GetUID()); } @@ -258,7 +256,7 @@ void sighandler(int signum) * always set when we need it. It seems some signals slip through to the * QUIT code without having a valid quitmsg. -GD */ - if (!quitmsg) + if (quitmsg.empty()) quitmsg = "Services terminating via a signal."; if (started) @@ -324,7 +322,7 @@ void sighandler(int signum) else { if (isatty(2)) - fprintf(stderr, "%s\n", quitmsg); + fprintf(stderr, "%s\n", quitmsg.c_str()); else Alog() << quitmsg; @@ -336,7 +334,7 @@ void sighandler(int signum) /** The following comes from InspIRCd to get the full path of the Anope executable */ -std::string GetFullProgDir(char *argv0) +Anope::string GetFullProgDir(const Anope::string &argv0) { char buffer[PATH_MAX]; #ifdef _WIN32 @@ -346,31 +344,31 @@ std::string GetFullProgDir(char *argv0) */ if (GetModuleFileName(NULL, buffer, PATH_MAX)) { - std::string fullpath = buffer; - std::string::size_type n = fullpath.rfind("\\" SERVICES_BIN); - services_bin = fullpath.substr(n + 1, fullpath.size()); - return std::string(fullpath, 0, n); + Anope::string fullpath = buffer; + Anope::string::size_type n = fullpath.rfind("\\" SERVICES_BIN); + services_bin = fullpath.substr(n + 1, fullpath.length()); + return fullpath.substr(0, n); } #else // Get the current working directory if (getcwd(buffer, PATH_MAX)) { - std::string remainder = argv0; + Anope::string remainder = argv0; /* Does argv[0] start with /? If so, it's a full path, use it */ if (remainder[0] == '/') { - std::string::size_type n = remainder.rfind("/" SERVICES_BIN); - services_bin = remainder.substr(n + 1, remainder.size()); - return std::string(remainder, 0, n); + Anope::string::size_type n = remainder.rfind("/" SERVICES_BIN); + services_bin = remainder.substr(n + 1, remainder.length()); + return remainder.substr(0, n); } services_bin = remainder; - if (services_bin.substr(0, 2) == "./") + if (services_bin.substr(0, 2).equals_cs("./")) services_bin = services_bin.substr(2); - std::string fullpath = std::string(buffer) + "/" + remainder; - std::string::size_type n = fullpath.rfind("/" SERVICES_BIN); - return std::string(fullpath, 0, n); + Anope::string fullpath = Anope::string(buffer) + "/" + remainder; + Anope::string::size_type n = fullpath.rfind("/" SERVICES_BIN); + return fullpath.substr(0, n); } #endif return "/"; @@ -397,7 +395,7 @@ static bool Connect() try { - new UplinkSocket(uplink_server->host, uplink_server->port, Config.LocalHost ? Config.LocalHost : "", uplink_server->ipv6); + new UplinkSocket(uplink_server->host, uplink_server->port, Config.LocalHost, uplink_server->ipv6); } catch (const SocketException &ex) { @@ -444,13 +442,13 @@ int main(int ac, char **av, char **envp) #endif binary_dir = GetFullProgDir(av[0]); - if (binary_dir[binary_dir.size() - 1] == '.') - binary_dir = binary_dir.substr(0, binary_dir.size() - 2); + if (binary_dir[binary_dir.length() - 1] == '.') + binary_dir = binary_dir.substr(0, binary_dir.length() - 2); #ifdef _WIN32 - std::string::size_type n = binary_dir.rfind("\\"); + Anope::string::size_type n = binary_dir.rfind('\\'); services_dir = binary_dir.substr(0, n) + "\\data"; #else - std::string::size_type n = binary_dir.rfind("/"); + Anope::string::size_type n = binary_dir.rfind('/'); services_dir = binary_dir.substr(0, n) + "/data"; #endif @@ -580,12 +578,12 @@ int main(int ac, char **av, char **envp) return 0; } -inline std::string Anope::Version() +inline Anope::string Anope::Version() { return stringify(VERSION_MAJOR) + "." + stringify(VERSION_MINOR) + "." + stringify(VERSION_PATCH) + VERSION_EXTRA + " (" + stringify(VERSION_BUILD) + ")"; } -inline std::string Anope::Build() +inline Anope::string Anope::Build() { - return std::string("build #") + stringify(BUILD) + ", compiled " + compiled; + return "build #" + stringify(BUILD) + ", compiled " + Anope::compiled; } diff --git a/src/memory.cpp b/src/memory.cpp index 1fb1d2b21..12e0a1d08 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -21,25 +21,6 @@ /*************************************************************************/ /** - * malloc, replacement so we can trap for "out of memory" - * @param size to allocate - * @return void - */ -void *smalloc(long size) -{ - void *buf; - - if (!size) - size = 1; - buf = malloc(size); - if (!buf) - abort(); - return buf; -} - -/*************************************************************************/ - -/** * calloc, replacement so we can trap for "out of memory" * @param elsize to allocate * @param els size of members @@ -78,33 +59,6 @@ void *srealloc(void *oldptr, long newsize) } /*************************************************************************/ - -/** - * strdup, replacement so we can trap for "out of memory" - * @param oldptr Old Pointer - * @param newsize Size of new pointer - * @return void - */ -char *sstrdup(const char *src) -{ - char *ret = NULL; - if (src) - { - ret = new char[strlen(src) + 1]; - if (!ret) - abort(); - strcpy(ret, src); - } - else - { - Alog() << "sstrdup() called with NULL-arg"; - abort(); - } - - return ret; -} - -/*************************************************************************/ /*************************************************************************/ /* In the future: malloc() replacements that tell us if we're leaking and diff --git a/src/memoserv.cpp b/src/memoserv.cpp index 5ceca0c7a..cc7ee5db4 100644 --- a/src/memoserv.cpp +++ b/src/memoserv.cpp @@ -50,17 +50,17 @@ void ms_init() * @param buf Buffer containing the privmsg * @return void */ -void memoserv(User *u, const std::string &buf) +void memoserv(User *u, const Anope::string &buf) { if (!u || buf.empty()) return; - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_ci("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string command = buf; + Anope::string command = buf; command.erase(command.begin()); command.erase(command.end()); - ircdproto->SendCTCP(MemoServ, u->nick.c_str(), "%s", command.c_str()); + ircdproto->SendCTCP(MemoServ, u->nick, "%s", command.c_str()); } else mod_run_cmd(MemoServ, u, buf); @@ -70,14 +70,14 @@ void memoserv(User *u, const std::string &buf) /** * check_memos: See if the given user has any unread memos, and send a - * NOTICE to that user if so (and if the appropriate flag is - * set). + * NOTICE to that user if so (and if the appropriate flag is + * set). * @param u User Struct * @return void */ void check_memos(User *u) { - NickCore *nc; + const NickCore *nc; unsigned i, newcnt = 0; if (!u) @@ -86,7 +86,7 @@ void check_memos(User *u) return; } - if (!(nc = u->Account()) || !u->IsRecognized() || !(nc->HasFlag(NI_MEMO_SIGNON))) + if (!(nc = u->Account()) || !u->IsRecognized() || !nc->HasFlag(NI_MEMO_SIGNON)) return; for (i = 0; i < nc->memos.memos.size(); ++i) @@ -98,7 +98,7 @@ void check_memos(User *u) { notice_lang(Config.s_MemoServ, u, newcnt == 1 ? MEMO_HAVE_NEW_MEMO : MEMO_HAVE_NEW_MEMOS, newcnt); if (newcnt == 1 && (nc->memos.memos[i - 1]->HasFlag(MF_UNREAD))) - notice_lang(Config.s_MemoServ, u, MEMO_TYPE_READ_LAST, Config.s_MemoServ); + notice_lang(Config.s_MemoServ, u, MEMO_TYPE_READ_LAST, Config.s_MemoServ.c_str()); else if (newcnt == 1) { for (i = 0; i < nc->memos.memos.size(); ++i) @@ -106,10 +106,10 @@ void check_memos(User *u) if (nc->memos.memos[i]->HasFlag(MF_UNREAD)) break; } - notice_lang(Config.s_MemoServ, u, MEMO_TYPE_READ_NUM, Config.s_MemoServ, nc->memos.memos[i]->number); + notice_lang(Config.s_MemoServ, u, MEMO_TYPE_READ_NUM, Config.s_MemoServ.c_str(), nc->memos.memos[i]->number); } else - notice_lang(Config.s_MemoServ, u, MEMO_TYPE_LIST_NEW, Config.s_MemoServ); + notice_lang(Config.s_MemoServ, u, MEMO_TYPE_LIST_NEW, Config.s_MemoServ.c_str()); } if (nc->memos.memomax > 0 && nc->memos.memos.size() >= nc->memos.memomax) { @@ -132,9 +132,9 @@ void check_memos(User *u) * @return `ischan' 1 if the name was a channel name, else 0. * @return `isforbid' 1 if the name is forbidden, else 0. */ -MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid) +MemoInfo *getmemoinfo(const Anope::string &name, int *ischan, int *isforbid) { - if (*name == '#') + if (name[0] == '#') { ChannelInfo *ci; if (ischan) @@ -200,19 +200,19 @@ MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid) * 3 - reply to user and request read receipt * @return void */ -void memo_send(User *u, const char *name, const char *text, int z) +void memo_send(User *u, const Anope::string &name, const Anope::string &text, int z) { int ischan; int isforbid; Memo *m; MemoInfo *mi; time_t now = time(NULL); - char *source = u->Account()->display; + Anope::string source = u->Account()->display; int is_servoper = u->Account() && u->Account()->IsServicesOper(); if (readonly) notice_lang(Config.s_MemoServ, u, MEMO_SEND_DISABLED); - else if (!text) + else if (text.empty()) { if (!z) syntax_error(Config.s_MemoServ, u, "SEND", MEMO_SEND_SYNTAX); @@ -223,16 +223,16 @@ void memo_send(User *u, const char *name, const char *text, int z) else if (!u->IsIdentified() && !u->IsRecognized()) { if (!z || z == 3) - notice_lang(Config.s_MemoServ, u, NICK_IDENTIFY_REQUIRED, Config.s_NickServ); + notice_lang(Config.s_MemoServ, u, NICK_IDENTIFY_REQUIRED, Config.s_NickServ.c_str()); } else if (!(mi = getmemoinfo(name, &ischan, &isforbid))) { if (!z || z == 3) { if (isforbid) - notice_lang(Config.s_MemoServ, u, ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, name); + notice_lang(Config.s_MemoServ, u, ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, name.c_str()); else - notice_lang(Config.s_MemoServ, u, ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, name); + notice_lang(Config.s_MemoServ, u, ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, name.c_str()); } } else if (z != 2 && Config.MSSendDelay > 0 && u && u->lastmemosend + Config.MSSendDelay > now) @@ -247,12 +247,12 @@ void memo_send(User *u, const char *name, const char *text, int z) else if (!mi->memomax && !is_servoper) { if (!z || z == 3) - notice_lang(Config.s_MemoServ, u, MEMO_X_GETS_NO_MEMOS, name); + notice_lang(Config.s_MemoServ, u, MEMO_X_GETS_NO_MEMOS, name.c_str()); } else if (mi->memomax > 0 && mi->memos.size() >= mi->memomax && !is_servoper) { if (!z || z == 3) - notice_lang(Config.s_MemoServ, u, MEMO_X_HAS_TOO_MANY_MEMOS, name); + notice_lang(Config.s_MemoServ, u, MEMO_X_HAS_TOO_MANY_MEMOS, name.c_str()); } else { @@ -272,7 +272,7 @@ void memo_send(User *u, const char *name, const char *text, int z) else m->number = 1; m->time = time(NULL); - m->text = sstrdup(text); + m->text = text; m->SetFlag(MF_UNREAD); /* Set notify sent flag - DrStein */ if (z == 2) @@ -281,10 +281,10 @@ void memo_send(User *u, const char *name, const char *text, int z) if (z == 3) m->SetFlag(MF_RECEIPT); if (!z || z == 3) - notice_lang(Config.s_MemoServ, u, MEMO_SENT, name); + notice_lang(Config.s_MemoServ, u, MEMO_SENT, name.c_str()); if (!ischan) { - NickCore *nc = (findnick(name))->nc; + NickCore *nc = findnick(name)->nc; FOREACH_MOD(I_OnMemoSend, OnMemoSend(u, nc, m)); @@ -297,13 +297,13 @@ void memo_send(User *u, const char *name, const char *text, int z) NickAlias *na = *it; User *user = finduser(na->nick); if (user && user->IsIdentified()) - notice_lang(Config.s_MemoServ, user, MEMO_NEW_MEMO_ARRIVED, source, Config.s_MemoServ, m->number); + notice_lang(Config.s_MemoServ, user, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config.s_MemoServ.c_str(), m->number); } } else { if ((u = finduser(name)) && u->IsIdentified() && nc->HasFlag(NI_MEMO_RECEIVE)) - notice_lang(Config.s_MemoServ, u, MEMO_NEW_MEMO_ARRIVED, source, Config.s_MemoServ, m->number); + notice_lang(Config.s_MemoServ, u, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config.s_MemoServ.c_str(), m->number); } /* if (flags & MEMO_RECEIVE) */ } /* if (MSNotifyAll) */ @@ -325,8 +325,8 @@ void memo_send(User *u, const char *name, const char *text, int z) if (check_access(cu->user, c->ci, CA_MEMO)) { - if (cu->user->Account() && cu->user->Account()->HasFlag(NI_MEMO_RECEIVE) && !get_ignore(cu->user->nick.c_str())) - notice_lang(Config.s_MemoServ, cu->user, MEMO_NEW_X_MEMO_ARRIVED, c->ci->name.c_str(), Config.s_MemoServ, c->ci->name.c_str(), m->number); + if (cu->user->Account() && cu->user->Account()->HasFlag(NI_MEMO_RECEIVE) && !get_ignore(cu->user->nick)) + notice_lang(Config.s_MemoServ, cu->user, MEMO_NEW_X_MEMO_ARRIVED, c->ci->name.c_str(), Config.s_MemoServ.c_str(), c->ci->name.c_str(), m->number); } } } /* MSNotifyAll */ @@ -354,9 +354,8 @@ int delmemo(MemoInfo *mi, int num) } if (i < mi->memos.size()) { - delete [] mi->memos[i]->text; /* Deallocate memo text memory */ delete mi->memos[i]; /* Deallocate the memo itself */ - mi->memos.erase(mi->memos.begin() + i); /* Remove the memo pointer from the vector */ + mi->memos.erase(mi->memos.begin() + i); /* Remove the memo pointer from the vector */ return 1; } else @@ -369,7 +368,7 @@ static bool SendMemoMail(NickCore *nc, Memo *m) { char message[BUFSIZE]; - snprintf(message, sizeof(message), getstring(NICK_MAIL_TEXT), nc->display, m->sender.c_str(), m->number, m->text); + snprintf(message, sizeof(message), getstring(NICK_MAIL_TEXT), nc->display.c_str(), m->sender.c_str(), m->number, m->text.c_str()); return Mail(nc, getstring(MEMO_MAIL_SUBJECT), message); } @@ -378,7 +377,7 @@ static bool SendMemoMail(NickCore *nc, Memo *m) /* Send receipt notification to sender. */ -void rsend_notify(User *u, Memo *m, const char *chan) +void rsend_notify(User *u, Memo *m, const Anope::string &chan) { NickAlias *na; NickCore *nc; @@ -402,10 +401,10 @@ void rsend_notify(User *u, Memo *m, const char *chan) /* Text of the memo varies if the recepient was a nick or channel */ - if (chan) + if (!chan.empty()) { fmt = getstring(na, MEMO_RSEND_CHAN_MEMO_TEXT); - snprintf(text, sizeof(text), fmt, chan); + snprintf(text, sizeof(text), fmt, chan.c_str()); } else { @@ -414,11 +413,11 @@ void rsend_notify(User *u, Memo *m, const char *chan) } /* Send notification */ - memo_send(u, m->sender.c_str(), text, 2); + memo_send(u, m->sender, text, 2); /* Notify recepient of the memo that a notification has been sent to the sender */ - notice_lang(Config.s_MemoServ, u, MEMO_RSEND_USER_NOTIFICATION, nc->display); + notice_lang(Config.s_MemoServ, u, MEMO_RSEND_USER_NOTIFICATION, nc->display.c_str()); } /* Remove receipt flag from the original memo */ diff --git a/src/messages.cpp b/src/messages.cpp index 857229f65..49188ce93 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -15,7 +15,7 @@ /*************************************************************************/ -int m_nickcoll(const char *user) +int m_nickcoll(const Anope::string &user) { introduce_user(user); return MOD_CONT; @@ -23,25 +23,25 @@ int m_nickcoll(const char *user) /*************************************************************************/ -int m_away(const char *source, const char *msg) +int m_away(const Anope::string &source, const Anope::string &msg) { User *u; u = finduser(source); - if (u && !msg) /* un-away */ + if (u && msg.empty()) /* un-away */ check_memos(u); return MOD_CONT; } /*************************************************************************/ -int m_kill(const std::string &nick, const char *msg) +int m_kill(const Anope::string &nick, const Anope::string &msg) { BotInfo *bi; /* Recover if someone kills us. */ - if (Config.s_BotServ && (bi = findbot(nick))) + if (!Config.s_BotServ.empty() && (bi = findbot(nick))) { introduce_user(nick); bi->RejoinAll(); @@ -54,36 +54,36 @@ int m_kill(const std::string &nick, const char *msg) /*************************************************************************/ -int m_time(const char *source, int ac, const char **av) +int m_time(const Anope::string &source, int ac, const char **av) { time_t t; struct tm *tm; char buf[64]; - if (!source) + if (source.empty()) return MOD_CONT; time(&t); tm = localtime(&t); strftime(buf, sizeof(buf), "%a %b %d %H:%M:%S %Y %Z", tm); - ircdproto->SendNumeric(Config.ServerName, 391, source, "%s :%s", Config.ServerName, buf); + ircdproto->SendNumeric(Config.ServerName, 391, source, "%s :%s", Config.ServerName.c_str(), buf); return MOD_CONT; } /*************************************************************************/ -int m_motd(const char *source) +int m_motd(const Anope::string &source) { FILE *f; char buf[BUFSIZE]; - if (!source) + if (source.empty()) return MOD_CONT; - f = fopen(Config.MOTDFilename, "r"); + f = fopen(Config.MOTDFilename.c_str(), "r"); if (f) { - ircdproto->SendNumeric(Config.ServerName, 375, source, ":- %s Message of the Day", Config.ServerName); + ircdproto->SendNumeric(Config.ServerName, 375, source, ":- %s Message of the Day", Config.ServerName.c_str()); while (fgets(buf, sizeof(buf), f)) { buf[strlen(buf) - 1] = 0; @@ -99,9 +99,8 @@ int m_motd(const char *source) /*************************************************************************/ -int m_privmsg(const std::string &source, const std::string &receiver, const std::string &message) +int m_privmsg(const Anope::string &source, const Anope::string &receiver, const Anope::string &message) { - char *target; time_t starttime, stoptime; /* When processing started and finished */ if (source.empty() || receiver.empty() || message.empty()) @@ -115,12 +114,12 @@ int m_privmsg(const std::string &source, const std::string &receiver, const std: BotInfo *bi = findbot(receiver); if (bi) - ircdproto->SendMessage(bi, source.c_str(), "%s", getstring(USER_RECORD_NOT_FOUND)); + ircdproto->SendMessage(bi, source, "%s", getstring(USER_RECORD_NOT_FOUND)); return MOD_CONT; } - if (receiver[0] == '#' && Config.s_BotServ) + if (receiver[0] == '#' && !Config.s_BotServ.empty()) { ChannelInfo *ci = cs_findchan(receiver); if (ci) @@ -135,30 +134,29 @@ int m_privmsg(const std::string &source, const std::string &receiver, const std: /* Check if we should ignore. Operators always get through. */ if (allow_ignore && !is_oper(u)) { - if (get_ignore(source.c_str())) + if (get_ignore(source)) { - target = myStrGetToken(message.c_str(), ' ', 0); + Anope::string target = myStrGetToken(message, ' ', 0); Alog() << "Ignored message from " << source << " to " << receiver << " using command " << target; - delete [] target; return MOD_CONT; } } /* If a server is specified (nick@server format), make sure it matches * us, and strip it off. */ - std::string botname = receiver; + Anope::string botname = receiver; size_t s = receiver.find('@'); - if (s != std::string::npos) + if (s != Anope::string::npos) { - ci::string servername(receiver.begin() + s + 1, receiver.end()); - botname = botname.erase(s); - if (servername != Config.ServerName) + Anope::string servername(receiver.begin() + s + 1, receiver.end()); + botname = botname.substr(0, s); + if (!servername.equals_ci(Config.ServerName)) return MOD_CONT; } else if (Config.UseStrictPrivMsg) { Alog(LOG_DEBUG) << "Ignored PRIVMSG without @ from " << source; - notice_lang(receiver, u, INVALID_TARGET, receiver.c_str(), receiver.c_str(), Config.ServerName, receiver.c_str()); + notice_lang(receiver, u, INVALID_TARGET, receiver.c_str(), receiver.c_str(), Config.ServerName.c_str(), receiver.c_str()); return MOD_CONT; } @@ -169,32 +167,31 @@ int m_privmsg(const std::string &source, const std::string &receiver, const std: if (bi) { - ci::string ci_bi_nick(bi->nick.c_str()); - if (ci_bi_nick == Config.s_OperServ) + if (bi->nick.equals_ci(Config.s_OperServ)) { if (!is_oper(u) && Config.OSOpersOnly) { notice_lang(Config.s_OperServ, u, ACCESS_DENIED); if (Config.WallBadOS) - ircdproto->SendGlobops(OperServ, "Denied access to %s from %s!%s@%s (non-oper)", Config.s_OperServ, u->nick.c_str(), u->GetIdent().c_str(), u->host); + ircdproto->SendGlobops(OperServ, "Denied access to %s from %s!%s@%s (non-oper)", Config.s_OperServ.c_str(), u->nick.c_str(), u->GetIdent().c_str(), u->host.c_str()); } else operserv(u, message); } - else if (ci_bi_nick == Config.s_NickServ) + else if (bi->nick.equals_ci(Config.s_NickServ)) nickserv(u, message); - else if (ci_bi_nick == Config.s_ChanServ) + else if (bi->nick.equals_ci(Config.s_ChanServ)) { if (!is_oper(u) && Config.CSOpersOnly) notice_lang(Config.s_ChanServ, u, ACCESS_DENIED); else chanserv(u, message); } - else if (ci_bi_nick == Config.s_MemoServ) + else if (bi->nick.equals_ci(Config.s_MemoServ)) memoserv(u, message); - else if (Config.s_HostServ && ci_bi_nick == Config.s_HostServ) + else if (!Config.s_HostServ.empty() && bi->nick.equals_ci(Config.s_HostServ)) hostserv(u, message); - else if (Config.s_BotServ) + else if (!Config.s_BotServ.empty() && bi->nick.equals_ci(Config.s_BotServ)) botserv(u, bi, message); } @@ -202,8 +199,8 @@ int m_privmsg(const std::string &source, const std::string &receiver, const std: if (allow_ignore) { stoptime = time(NULL); - if (stoptime > starttime && source.find('.') == std::string::npos) - add_ignore(source.c_str(), stoptime - starttime); + if (stoptime > starttime && source.find('.') == Anope::string::npos) + add_ignore(source, stoptime - starttime); } } @@ -212,7 +209,7 @@ int m_privmsg(const std::string &source, const std::string &receiver, const std: /*************************************************************************/ -int m_stats(const char *source, int ac, const char **av) +int m_stats(const Anope::string &source, int ac, const char **av) { User *u; @@ -227,7 +224,7 @@ int m_stats(const char *source, int ac, const char **av) if (u && is_oper(u)) { ircdproto->SendNumeric(Config.ServerName, 211, source, "Server SendBuf SentBytes SentMsgs RecvBuf RecvBytes RecvMsgs ConnTime"); - ircdproto->SendNumeric(Config.ServerName, 211, source, "%s %d %d %d %d %d %d %ld", uplink_server->host, UplinkSock->WriteBufferLen(), TotalWritten, -1, UplinkSock->ReadBufferLen(), TotalRead, -1, time(NULL) - start_time); + ircdproto->SendNumeric(Config.ServerName, 211, source, "%s %d %d %d %d %d %d %ld", uplink_server->host.c_str(), UplinkSock->WriteBufferLen(), TotalWritten, -1, UplinkSock->ReadBufferLen(), TotalRead, -1, time(NULL) - start_time); } ircdproto->SendNumeric(Config.ServerName, 219, source, "%c :End of /STATS report.", *av[0] ? *av[0] : '*'); @@ -240,11 +237,11 @@ int m_stats(const char *source, int ac, const char **av) ircdproto->SendNumeric(Config.ServerName, 219, source, "%c :End of /STATS report.", *av[0] ? *av[0] : '*'); else { - std::list<std::pair<ci::string, ci::string> >::iterator it, it_end; + std::list<std::pair<Anope::string, Anope::string> >::iterator it, it_end; for (it = Config.Opers.begin(), it_end = Config.Opers.end(); it != it_end; ++it) { - ci::string nick = it->first, type = it->second; + Anope::string nick = it->first, type = it->second; NickCore *nc = findcore(nick); if (nc) @@ -273,28 +270,28 @@ int m_stats(const char *source, int ac, const char **av) /*************************************************************************/ -int m_version(const char *source, int ac, const char **av) +int m_version(const Anope::string &source, int ac, const char **av) { - if (source) - ircdproto->SendNumeric(Config.ServerName, 351, source, "Anope-%s %s :%s -(%s) -- %s", Anope::Version().c_str(), Config.ServerName, ircd->name, Config.EncModuleList.begin()->c_str(), Anope::Build().c_str()); + if (!source.empty()) + ircdproto->SendNumeric(Config.ServerName, 351, source, "Anope-%s %s :%s -(%s) -- %s", Anope::Version().c_str(), Config.ServerName.c_str(), ircd->name, Config.EncModuleList.begin()->c_str(), Anope::Build().c_str()); return MOD_CONT; } /*************************************************************************/ -int m_whois(const char *source, const char *who) +int m_whois(const Anope::string &source, const Anope::string &who) { - if (source && who) + if (!source.empty() && !who.empty()) { NickAlias *na; BotInfo *bi = findbot(who); if (bi) { - ircdproto->SendNumeric(Config.ServerName, 311, source, "%s %s %s * :%s", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host, bi->realname); + ircdproto->SendNumeric(Config.ServerName, 311, source, "%s %s %s * :%s", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str()); ircdproto->SendNumeric(Config.ServerName, 307, source, "%s :is a registered nick", bi->nick.c_str()); - ircdproto->SendNumeric(Config.ServerName, 312, source, "%s %s :%s", bi->nick.c_str(), Config.ServerName, Config.ServerDesc); + ircdproto->SendNumeric(Config.ServerName, 312, source, "%s %s :%s", bi->nick.c_str(), Config.ServerName.c_str(), Config.ServerDesc.c_str()); ircdproto->SendNumeric(Config.ServerName, 317, source, "%s %ld %ld :seconds idle, signon time", bi->nick.c_str(), time(NULL) - bi->lastmsg, start_time); - ircdproto->SendNumeric(Config.ServerName, 318, source, "%s :End of /WHOIS list.", who); + ircdproto->SendNumeric(Config.ServerName, 318, source, "%s :End of /WHOIS list.", who.c_str()); } else if (!ircd->svshold && (na = findnick(who)) && na->HasFlag(NS_HELD)) { @@ -302,12 +299,12 @@ int m_whois(const char *source, const char *who) * We can't just say it doesn't exist here, even tho it does for * other servers :) -GD */ - ircdproto->SendNumeric(Config.ServerName, 311, source, "%s %s %s * :Services Enforcer", na->nick, Config.NSEnforcerUser, Config.NSEnforcerHost); - ircdproto->SendNumeric(Config.ServerName, 312, source, "%s %s :%s", na->nick, Config.ServerName, Config.ServerDesc); - ircdproto->SendNumeric(Config.ServerName, 318, source, "%s :End of /WHOIS list.", who); + ircdproto->SendNumeric(Config.ServerName, 311, source, "%s %s %s * :Services Enforcer", na->nick.c_str(), Config.NSEnforcerUser.c_str(), Config.NSEnforcerHost.c_str()); + ircdproto->SendNumeric(Config.ServerName, 312, source, "%s %s :%s", na->nick.c_str(), Config.ServerName.c_str(), Config.ServerDesc.c_str()); + ircdproto->SendNumeric(Config.ServerName, 318, source, "%s :End of /WHOIS list.", who.c_str()); } else - ircdproto->SendNumeric(Config.ServerName, 401, source, "%s :No such service.", who); + ircdproto->SendNumeric(Config.ServerName, 401, source, "%s :No such service.", who.c_str()); } return MOD_CONT; } diff --git a/src/misc.cpp b/src/misc.cpp index eb8b28f83..0e838695d 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -30,7 +30,7 @@ struct arc4_stream * @param filename The file * @return true if the file exists, false if it doens't */ -bool IsFile(const std::string &filename) +bool IsFile(const Anope::string &filename) { struct stat fileinfo; if (!stat(filename.c_str(), &fileinfo)) @@ -72,29 +72,8 @@ int tolower(char c) /*************************************************************************/ /** - * Simple function to convert binary data to hex. - * Taken from hybrid-ircd ( http://ircd-hybrid.com/ ) - */ -void binary_to_hex(unsigned char *bin, char *hex, int length) -{ - static const char trans[] = "0123456789ABCDEF"; - int i; - - for (i = 0; i < length; ++i) - { - hex[i << 1] = trans[bin[i] >> 4]; - hex[(i << 1) + 1] = trans[bin[i] & 0xf]; - } - - hex[i << 1] = '\0'; -} - - -/*************************************************************************/ - -/** * strscpy: Copy at most len-1 characters from a string to a buffer, and - * add a null terminator after the last character copied. + * add a null terminator after the last character copied. * @param d Buffer to copy into * @param s Data to copy int * @param len Length of data @@ -114,38 +93,6 @@ char *strscpy(char *d, const char *s, size_t len) /*************************************************************************/ /** - * stristr: Search case-insensitively for string s2 within string s1, - * returning the first occurrence of s2 or NULL if s2 was not - * found. - * @param s1 String 1 - * @param s2 String 2 - * @return first occurrence of s2 - */ -const char *stristr(const char *s1, const char *s2) -{ - register const char *s = s1, *d = s2; - - while (*s1) - { - if (tolower(*s1) == tolower(*d)) - { - ++s1; - ++d; - if (!*d) - return s; - } - else - { - s = ++s1; - d = s2; - } - } - return NULL; -} - -/*************************************************************************/ - -/** * strnrepl: Replace occurrences of `old' with `new' in string `s'. Stop * replacing if a replacement would cause the string to exceed * `size' bytes (including the null terminator). Return the @@ -223,11 +170,11 @@ const char *merge_args(int argc, char **argv) /*************************************************************************/ -NumberList::NumberList(const std::string &list, bool descending) : desc(descending), is_valid(true) +NumberList::NumberList(const Anope::string &list, bool descending) : is_valid(true), desc(descending) { - char *error; + Anope::string error; commasepstream sep(list); - std::string token; + Anope::string token; sep.GetToken(token); if (token.empty()) @@ -236,10 +183,10 @@ NumberList::NumberList(const std::string &list, bool descending) : desc(descendi { size_t t = token.find('-'); - if (t == std::string::npos) + if (t == Anope::string::npos) { - unsigned num = strtol(token.c_str(), &error, 10); - if (!*error) + unsigned num = convertTo<unsigned>(token, error, false); + if (error.empty()) numbers.insert(num); else { @@ -252,10 +199,10 @@ NumberList::NumberList(const std::string &list, bool descending) : desc(descendi } else { - char *error2; - unsigned num1 = strtol(token.substr(0, t).c_str(), &error, 10); - unsigned num2 = strtol(token.substr(t + 1).c_str(), &error2, 10); - if (!*error && !*error2) + Anope::string error2; + unsigned num1 = convertTo<unsigned>(token.substr(0, t), error, false); + unsigned num2 = convertTo<unsigned>(token.substr(t + 1), error2, false); + if (error.empty() && error2.empty()) { for (unsigned i = num1; i <= num2; ++i) numbers.insert(i); @@ -299,7 +246,7 @@ void NumberList::HandleNumber(unsigned) { } -bool NumberList::InvalidRange(const std::string &) +bool NumberList::InvalidRange(const Anope::string &) { return true; } @@ -315,17 +262,18 @@ bool NumberList::InvalidRange(const std::string &) * @param s String to convert * @return time_t */ -time_t dotime(const char *s) +time_t dotime(const Anope::string &s) { int amount; - if (!s || !*s) + if (s.empty()) return -1; - amount = strtol(s, const_cast<char **>(&s), 10); - if (*s) + Anope::string end; + amount = convertTo<int>(s, end, false); + if (!end.empty()) { - switch (*s) + switch (end[0]) { case 's': return amount; @@ -353,17 +301,16 @@ time_t dotime(const char *s) * Expresses in a string the period of time represented by a given amount * of seconds (with days/hours/minutes). * @param na Nick Alias - * @param buf buffer to store result into - * @param bufsize Size of the buffer * @param seconds time in seconds * @return buffer */ -const char *duration(NickCore *nc, char *buf, int bufsize, time_t seconds) +Anope::string duration(const NickCore *nc, time_t seconds) { int days = 0, hours = 0, minutes = 0; int need_comma = 0; - char buf2[64], *end; + char buf[64]; + Anope::string buffer; const char *comma = getstring(nc, COMMA_SPACE); /* We first calculate everything */ @@ -374,31 +321,32 @@ const char *duration(NickCore *nc, char *buf, int bufsize, time_t seconds) minutes = seconds / 60; if (!days && !hours && !minutes) - snprintf(buf, bufsize, getstring(nc, seconds <= 1 ? DURATION_SECOND : DURATION_SECONDS), seconds); + { + snprintf(buf, sizeof(buf), getstring(nc, seconds <= 1 ? DURATION_SECOND : DURATION_SECONDS), seconds); + buffer = buf; + } else { - end = buf; if (days) { - snprintf(buf2, sizeof(buf2), getstring(nc, days == 1 ? DURATION_DAY : DURATION_DAYS), days); - end += snprintf(end, bufsize - (end - buf), "%s", buf2); + snprintf(buf, sizeof(buf), getstring(nc, days == 1 ? DURATION_DAY : DURATION_DAYS), days); + buffer = buf; need_comma = 1; } if (hours) { - snprintf(buf2, sizeof(buf2), getstring(nc, hours == 1 ? DURATION_HOUR : DURATION_HOURS), hours); - end += snprintf(end, bufsize - (end - buf), "%s%s", need_comma ? comma : "", buf2); + snprintf(buf, sizeof(buf), getstring(nc, hours == 1 ? DURATION_HOUR : DURATION_HOURS), hours); + buffer += Anope::string(need_comma ? comma : "") + buf; need_comma = 1; } if (minutes) { - snprintf(buf2, sizeof(buf2), getstring(nc, minutes == 1 ? DURATION_MINUTE : DURATION_MINUTES), minutes); - end += snprintf(end, bufsize - (end - buf), "%s%s", need_comma ? comma : "", buf2); - need_comma = 1; + snprintf(buf, sizeof(buf), getstring(nc, minutes == 1 ? DURATION_MINUTE : DURATION_MINUTES), minutes); + buffer += Anope::string(need_comma ? comma : "") + buf; } } - return buf; + return buffer; } /*************************************************************************/ @@ -406,19 +354,19 @@ const char *duration(NickCore *nc, char *buf, int bufsize, time_t seconds) /** * Generates a human readable string of type "expires in ..." * @param na Nick Alias - * @param buf buffer to store result into - * @param bufsize Size of the buffer * @param seconds time in seconds * @return buffer */ -const char *expire_left(NickCore *nc, char *buf, int len, time_t expires) +Anope::string expire_left(const NickCore *nc, time_t expires) { time_t now = time(NULL); + char buf[256]; + if (!expires) - strlcpy(buf, getstring(nc, NO_EXPIRE), len); + strlcpy(buf, getstring(nc, NO_EXPIRE), sizeof(buf)); else if (expires <= now) - strlcpy(buf, getstring(nc, EXPIRES_SOON), len); + strlcpy(buf, getstring(nc, EXPIRES_SOON), sizeof(buf)); else { time_t diff = expires - now + 59; @@ -426,21 +374,21 @@ const char *expire_left(NickCore *nc, char *buf, int len, time_t expires) if (diff >= 86400) { int days = diff / 86400; - snprintf(buf, len, getstring(nc, days == 1 ? EXPIRES_1D : EXPIRES_D), days); + snprintf(buf, sizeof(buf), getstring(nc, days == 1 ? EXPIRES_1D : EXPIRES_D), days); } else { if (diff <= 3600) { int minutes = diff / 60; - snprintf(buf, len, getstring(nc, minutes == 1 ? EXPIRES_1M : EXPIRES_M), minutes); + snprintf(buf, sizeof(buf), getstring(nc, minutes == 1 ? EXPIRES_1M : EXPIRES_M), minutes); } else { int hours = diff / 3600, minutes; diff -= hours * 3600; minutes = diff / 60; - snprintf(buf, len, getstring(nc, hours == 1 && minutes == 1 ? EXPIRES_1H1M : (hours == 1 && minutes != 1 ? EXPIRES_1HM : (hours != 1 && minutes == 1 ? EXPIRES_H1M : EXPIRES_HM))), hours, minutes); + snprintf(buf, sizeof(buf), getstring(nc, hours == 1 && minutes == 1 ? EXPIRES_1H1M : (hours == 1 && minutes != 1 ? EXPIRES_1HM : (hours != 1 && minutes == 1 ? EXPIRES_H1M : EXPIRES_HM))), hours, minutes); } } } @@ -448,19 +396,18 @@ const char *expire_left(NickCore *nc, char *buf, int len, time_t expires) return buf; } - /*************************************************************************/ /** * Validate the host * shortname = ( letter / digit ) *( letter / digit / "-" ) *( letter / digit ) * hostname = shortname *( "." shortname ) - * ip4addr = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit + * ip4addr = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit * @param host = string to check * @param type = format, 1 = ip4addr, 2 = hostname * @return 1 if a host is valid, 0 if it isnt. */ -int doValidHost(const char *host, int type) +int doValidHost(const Anope::string &host, int type) { int idx = 0; int len = 0; @@ -468,10 +415,10 @@ int doValidHost(const char *host, int type) int dots = 1; if (type != 1 && type != 2) return 0; - if (!host) + if (host.empty()) return 0; - len = strlen(host); + len = host.length(); if (len > Config.HostLen) return 0; @@ -539,7 +486,7 @@ int doValidHost(const char *host, int type) * @param type = format, 1 = ip4addr, 2 = hostname * @return 1 if a host is valid, 0 if it isnt. */ -int isValidHost(const char *host, int type) +int isValidHost(const Anope::string &host, int type) { int status = 0; if (type == 3) @@ -576,54 +523,18 @@ int isvalidchar(const char c) * @param token_number the token number * @return token */ -char *myStrGetToken(const char *str, const char dilim, int token_number) +Anope::string myStrGetToken(const Anope::string &str, char delim, int token_number) { - int len, idx, counter = 0, start_pos = 0; - char *substring = NULL; - if (!str) - return NULL; - len = strlen(str); - for (idx = 0; idx <= len; ++idx) - { - if (str[idx] == dilim || idx == len) - { - if (counter == token_number) - substring = myStrSubString(str, start_pos, idx); - else - start_pos = idx + 1; - ++counter; - } - } - return substring; -} + if (str.empty()) + return ""; -/*************************************************************************/ - -/** - * Get the token only - * @param str String to search in - * @param dilim Character to search for - * @param token_number the token number - * @return token - */ -char *myStrGetOnlyToken(const char *str, const char dilim, int token_number) -{ - int len, idx, counter = 0, start_pos = 0; - char *substring = NULL; - if (!str) - return NULL; - len = strlen(str); - for (idx = 0; idx <= len; ++idx) + Anope::string substring; + for (size_t idx = 0, len = str.length(), start_pos = 0, counter = 0; idx <= len; ++idx) { - if (str[idx] == dilim) + if (str[idx] == delim || idx == len) { if (counter == token_number) - { - if (str[idx] == '\r') - substring = myStrSubString(str, start_pos, idx - 1); - else - substring = myStrSubString(str, start_pos, idx); - } + substring = str.substr(start_pos, idx - start_pos - 1); else start_pos = idx + 1; ++counter; @@ -641,20 +552,18 @@ char *myStrGetOnlyToken(const char *str, const char dilim, int token_number) * @param token_number the token number * @return token */ -char *myStrGetTokenRemainder(const char *str, const char dilim, int token_number) +Anope::string myStrGetTokenRemainder(const Anope::string &str, const char dilim, int token_number) { - int len, idx, counter = 0, start_pos = 0; - char *substring = NULL; - if (!str) - return NULL; - len = strlen(str); + if (str.empty()) + return ""; - for (idx = 0; idx <= len; ++idx) + Anope::string substring; + for (size_t idx = 0, len = str.length(), start_pos = 0, counter = 0; idx <= len; ++idx) { if (str[idx] == dilim || idx == len) { if (counter == token_number) - substring = myStrSubString(str, start_pos, len); + substring = str.substr(start_pos); else start_pos = idx + 1; ++counter; @@ -666,32 +575,6 @@ char *myStrGetTokenRemainder(const char *str, const char dilim, int token_number /*************************************************************************/ /** - * Get the string between point A and point B - * @param str String to search in - * @param start Point A - * @param end Point B - * @return the string in between - */ -char *myStrSubString(const char *src, int start, int end) -{ - char *substring = NULL; - int len, idx; - if (!src) - return NULL; - len = strlen(src); - if (start >= 0 && end <= len && end > start) - { - substring = new char[(end - start) + 1]; - for (idx = 0; idx <= end - start; ++idx) - substring[idx] = src[start + idx]; - substring[end - start] = '\0'; - } - return substring; -} - -/*************************************************************************/ - -/** * Clean up the buffer for extra spaces * @param str to clean up * @return void @@ -733,17 +616,17 @@ void doCleanBuffer(char *str) * @param killer whom is doing the killing * @return void */ -void EnforceQlinedNick(const std::string &nick, const char *killer) +void EnforceQlinedNick(const Anope::string &nick, const Anope::string &killer) { if (findbot(nick)) return; - + User *u2 = finduser(nick); if (u2) { Alog() << "Killed Q-lined nick: " << u2->GetMask(); - kill_user(killer, u2->nick.c_str(), "This nick is reserved for Services. Please use a non Q-Lined nick."); + kill_user(killer, u2->nick, "This nick is reserved for Services. Please use a non Q-Lined nick."); } } @@ -755,49 +638,45 @@ void EnforceQlinedNick(const std::string &nick, const char *killer) * @param int Check if botserv bots * @return int */ -int nickIsServices(const char *tempnick, int bot) +int nickIsServices(const Anope::string &tempnick, int bot) { int found = 0; - char *s, *nick; - if (!tempnick) + if (tempnick.empty()) return found; - nick = sstrdup(tempnick); + Anope::string nick = tempnick; - s = strchr(nick, '@'); - if (s) + size_t at = nick.find('@'); + if (at != Anope::string::npos) { - *s++ = 0; - if (stricmp(s, Config.ServerName)) - { - delete [] nick; + Anope::string servername = nick.substr(at + 1); + if (!servername.equals_ci(Config.ServerName)) return found; - } + nick = nick.substr(0, at); } - if (Config.s_NickServ && !stricmp(nick, Config.s_NickServ)) + if (!Config.s_NickServ.empty() && nick.equals_ci(Config.s_NickServ)) ++found; - else if (Config.s_ChanServ && !stricmp(nick, Config.s_ChanServ)) + else if (!Config.s_ChanServ.empty() && nick.equals_ci(Config.s_ChanServ)) ++found; - else if (Config.s_HostServ && !stricmp(nick, Config.s_HostServ)) + else if (!Config.s_HostServ.empty() && nick.equals_ci(Config.s_HostServ)) ++found; - else if (Config.s_MemoServ && !stricmp(nick, Config.s_MemoServ)) + else if (!Config.s_MemoServ.empty() && nick.equals_ci(Config.s_MemoServ)) ++found; - else if (Config.s_BotServ && !stricmp(nick, Config.s_BotServ)) + else if (!Config.s_BotServ.empty() && nick.equals_ci(Config.s_BotServ)) ++found; - else if (Config.s_OperServ && !stricmp(nick, Config.s_OperServ)) + else if (!Config.s_OperServ.empty() && nick.equals_ci(Config.s_OperServ)) ++found; - else if (Config.s_GlobalNoticer && !stricmp(nick, Config.s_GlobalNoticer)) + else if (!Config.s_GlobalNoticer.empty() && nick.equals_ci(Config.s_GlobalNoticer)) ++found; - else if (Config.s_BotServ && bot) + else if (!Config.s_BotServ.empty() && bot) { for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it) { BotInfo *bi = it->second; - ci::string ci_bi_nick(bi->nick.c_str()); - if (ci_bi_nick == nick) + if (nick.equals_ci(bi->nick)) { ++found; break; @@ -805,9 +684,6 @@ int nickIsServices(const char *tempnick, int bot) } } - /* Somehow, something tells me we should free this :) -GD */ - delete [] nick; - return found; } @@ -967,20 +843,14 @@ uint32 getrandom32() * @param dilim Dilimiter * @return number of tokens */ -int myNumToken(const char *str, const char dilim) +int myNumToken(const Anope::string &str, char dilim) { - int len, idx, counter = 0, start_pos = 0; - if (!str) + if (str.empty()) return 0; - len = strlen(str); - for (idx = 0; idx <= len; ++idx) - { + int counter = 0; + for (size_t idx = 0, len = str.length(); idx <= len; ++idx) if (str[idx] == dilim || idx == len) - { - start_pos = idx + 1; ++counter; - } - } return counter; } @@ -991,24 +861,22 @@ int myNumToken(const char *str, const char dilim) * @param host to convert * @return ip address */ -char *host_resolve(char *host) +Anope::string host_resolve(const Anope::string &host) { struct hostent *hentp = NULL; uint32 ip = INADDR_NONE; char ipbuf[16]; - char *ipreturn; + Anope::string ipreturn; struct in_addr addr; - ipreturn = NULL; - - hentp = gethostbyname(host); + hentp = gethostbyname(host.c_str()); if (hentp) { memcpy(&ip, hentp->h_addr, sizeof(hentp->h_length)); addr.s_addr = ip; ntoa(addr, ipbuf, sizeof(ipbuf)); - ipreturn = sstrdup(ipbuf); + ipreturn = ipbuf; Alog(LOG_DEBUG) << "resolved " << host << " to " << ipbuf; } return ipreturn; @@ -1020,11 +888,11 @@ char *host_resolve(char *host) * @param src The source string * @return a list of strings */ -std::list<std::string> BuildStringList(const std::string &src) +std::list<Anope::string> BuildStringList(const Anope::string &src) { spacesepstream tokens(src); - std::string token; - std::list<std::string> Ret; + Anope::string token; + std::list<Anope::string> Ret; while (tokens.GetToken(token)) Ret.push_back(token); @@ -1032,23 +900,11 @@ std::list<std::string> BuildStringList(const std::string &src) return Ret; } -std::list<ci::string> BuildStringList(const ci::string &src) +std::vector<Anope::string> BuildStringVector(const Anope::string &src) { spacesepstream tokens(src); - ci::string token; - std::list<ci::string> Ret; - - while (tokens.GetToken(token)) - Ret.push_back(token); - - return Ret; -} - -std::vector<std::string> BuildStringVector(const std::string &src) -{ - spacesepstream tokens(src); - std::string token; - std::vector<std::string> Ret; + Anope::string token; + std::vector<Anope::string> Ret; while (tokens.GetToken(token)) Ret.push_back(token); @@ -1073,25 +929,13 @@ char *str_signed(unsigned char *str) while (*str) { *nstr = static_cast<char>(*str); - str++; - nstr++; + ++str; + ++nstr; } return nstr; } -/** - * Strip the mode prefix from the given string. - * Useful for using the modes stored in things like ircd->ownerset etc.. - **/ - -char *stripModePrefix(const char *str) -{ - if (str && (*str == '+' || *str == '-')) - return sstrdup(str + 1); - return NULL; -} - /* Equivalent to inet_ntoa */ void ntoa(struct in_addr addr, char *ipaddr, int len) @@ -1194,36 +1038,32 @@ size_t strlcpy(char *dst, const char *src, size_t siz) #endif #ifdef _WIN32 -char *GetWindowsVersion() +Anope::string GetWindowsVersion() { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; - char buf[BUFSIZE]; - char *extra; - char *cputype; + Anope::string buf, extra, cputype; SYSTEM_INFO si; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); ZeroMemory(&si, sizeof(SYSTEM_INFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi))) + if (!(bOsVersionInfoEx = GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&osvi)))) { osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx((OSVERSIONINFO *)&osvi)) - return sstrdup(""); + if (!GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&osvi))) + return ""; } GetSystemInfo(&si); /* Determine CPU type 32 or 64 */ if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) - cputype = sstrdup(" 64-bit"); + cputype = " 64-bit"; else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) - cputype = sstrdup(" 32-bit"); + cputype = " 32-bit"; else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) - cputype = sstrdup(" Itanium 64-bit"); - else - cputype = sstrdup(" "); + cputype = " Itanium 64-bit"; switch (osvi.dwPlatformId) { @@ -1233,96 +1073,78 @@ char *GetWindowsVersion() if (osvi.dwMajorVersion == 6 && !osvi.dwMinorVersion) { if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) - extra = sstrdup("Enterprise Edition"); + extra = " Enterprise Edition"; else if (osvi.wSuiteMask & VER_SUITE_DATACENTER) - extra = sstrdup("Datacenter Edition"); + extra = " Datacenter Edition"; else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) - extra = sstrdup("Home Premium/Basic"); - else - extra = sstrdup(" "); + extra = " Home Premium/Basic"; if (osvi.wProductType & VER_NT_WORKSTATION) - snprintf(buf, sizeof(buf), "Microsoft Windows Vista %s%s", cputype, extra); + buf = "Microsoft Windows Vista" + cputype + extra; else - snprintf(buf, sizeof(buf), "Microsoft Windows Server 2008 %s%s", cputype, extra); - delete [] extra; + buf = "Microsoft Windows Server 2008" + cputype + extra; } /* Windows 2003 or Windows XP Pro 64 */ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { if (osvi.wSuiteMask & VER_SUITE_DATACENTER) - extra = sstrdup("Datacenter Edition"); + extra = " Datacenter Edition"; else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) - extra = sstrdup("Enterprise Edition"); + extra = " Enterprise Edition"; #ifdef VER_SUITE_COMPUTE_SERVER else if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER) - extra = sstrdup("Compute Cluster Edition"); + extra = " Compute Cluster Edition"; #endif else if (osvi.wSuiteMask == VER_SUITE_BLADE) - extra = sstrdup("Web Edition"); + extra = " Web Edition"; else - extra = sstrdup("Standard Edition"); + extra = " Standard Edition"; if (osvi.wProductType & VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) - snprintf(buf, sizeof(buf), "Windows XP Professional x64 Edition %s", extra); + buf = "Microsoft Windows XP Professional x64 Edition" + extra; else - snprintf(buf, sizeof(buf), "Microsoft Windows Server 2003 Family %s%s", cputype, extra); - delete [] extra; + buf = "Microsoft Windows Server 2003 Family" + cputype + extra; } if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { if (osvi.wSuiteMask & VER_SUITE_EMBEDDEDNT) - extra = sstrdup("Embedded"); + extra = " Embedded"; else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) - extra = sstrdup("Home Edition"); - else - extra = sstrdup(" "); - snprintf(buf, sizeof(buf), "Microsoft Windows XP %s", extra); - delete [] extra; + extra = " Home Edition"; + buf = "Microsoft Windows XP" + extra; } if (osvi.dwMajorVersion == 5 && !osvi.dwMinorVersion) { if (osvi.wSuiteMask & VER_SUITE_DATACENTER) - extra = sstrdup("Datacenter Server"); + extra = " Datacenter Server"; else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) - extra = sstrdup("Advanced Server"); + extra = " Advanced Server"; else - extra = sstrdup("Server"); - snprintf(buf, sizeof(buf), "Microsoft Windows 2000 %s", extra); - delete [] extra; + extra = " Server"; + buf = "Microsoft Windows 2000" + extra; } if (osvi.dwMajorVersion <= 4) { if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) - extra = sstrdup("Server 4.0, Enterprise Edition"); - else - extra = sstrdup("Server 4.0"); - snprintf(buf, sizeof(buf), "Microsoft Windows NT %s", extra); - delete [] extra; + extra = " Enterprise Edition"; + buf = "Microsoft Windows NT Server 4.0" + extra; } break; case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && !osvi.dwMinorVersion) { if (osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B') - extra = sstrdup("OSR2"); - else - extra = sstrdup(" "); - snprintf(buf, sizeof(buf), "Microsoft Windows 95 %s", extra); - delete [] extra; + extra = " OSR2"; + buf = "Microsoft Windows 95" + extra; } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { if (osvi.szCSDVersion[1] == 'A') - extra = sstrdup("SE"); - else - extra = sstrdup(" "); - snprintf(buf, sizeof(buf), "Microsoft Windows 98 %s", extra); - delete [] extra; + extra = "SE"; + buf = "Microsoft Windows 98" + extra; } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) - snprintf(buf, sizeof(buf), "Microsoft Windows Millennium Edition"); + buf = "Microsoft Windows Millenium Edition"; } - delete [] cputype; - return sstrdup(buf); + return buf; } int SupportedWindowsVersion() @@ -1333,10 +1155,10 @@ int SupportedWindowsVersion() ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi))) + if (!(bOsVersionInfoEx = GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&osvi)))) { osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx((OSVERSIONINFO *)&osvi)) + if (!GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&osvi))) return 0; } @@ -1396,14 +1218,11 @@ uint16 netmask_to_cidr(uint32 mask) * @param str String to check * @return 1 for wildcard, 0 for anything else */ -int str_is_wildcard(const char *str) +int str_is_wildcard(const Anope::string &str) { - while (*str) - { - if (*str == '*' || *str == '?') + for (Anope::string::const_iterator c = str.begin(), c_end = str.end(); c != c_end; ++c) + if (*c == '*' || *c == '?') return 1; - ++str; - } return 0; } @@ -1413,14 +1232,11 @@ int str_is_wildcard(const char *str) * @param str String to check * @return 1 for pure wildcard, 0 for anything else */ -int str_is_pure_wildcard(const char *str) +int str_is_pure_wildcard(const Anope::string &str) { - while (*str) - { - if (*str != '*') + for (Anope::string::const_iterator c = str.begin(), c_end = str.end(); c != c_end; ++c) + if (*c != '*') return 0; - ++str; - } return 1; } @@ -1432,21 +1248,19 @@ int str_is_pure_wildcard(const char *str) * @param str String to check * @return The IP, if one found. 0 if none. */ -uint32 str_is_ip(char *str) +uint32 str_is_ip(const Anope::string &str) { int i; int octets[4] = { -1, -1, -1, -1 }; - char *s = str; + Anope::string s = str; uint32 ip; for (i = 0; i < 4; ++i) { - octets[i] = strtol(s, &s, 10); + octets[i] = convertTo<int>(s, s, false); /* Bail out if the octet is invalid or wrongly terminated */ - if (octets[i] < 0 || octets[i] > 255 || (i < 3 && *s != '.')) + if (octets[i] < 0 || octets[i] > 255 || (i < 3 && s[0] != '.')) return 0; - if (i < 3) - ++s; } /* Fill the IP - the dirty way */ @@ -1469,22 +1283,19 @@ uint32 str_is_ip(char *str) * @param host Displayed host * @return 1 for IP/CIDR, 0 for anything else */ -int str_is_cidr(char *str, uint32 *ip, uint32 *mask, char **host) +int str_is_cidr(const Anope::string &str, uint32 *ip, uint32 *mask, Anope::string &host) { int i; int octets[4] = { -1, -1, -1, -1 }; - char *s = str; - char buf[512]; + Anope::string s = str; uint16 cidr; for (i = 0; i < 4; ++i) { - octets[i] = strtol(s, &s, 10); + octets[i] = convertTo<int>(s, s, false); /* Bail out if the octet is invalid or wrongly terminated */ - if (octets[i] < 0 || octets[i] > 255 || (i < 3 && *s != '.')) + if (octets[i] < 0 || octets[i] > 255 || (i < 3 && s[0] != '.')) return 0; - if (i < 3) - ++s; } /* Fill the IP - the dirty way */ @@ -1493,13 +1304,12 @@ int str_is_cidr(char *str, uint32 *ip, uint32 *mask, char **host) *ip += octets[1] * 65536; *ip += octets[0] * 16777216; - if (*s == '/') + if (s[0] == '/') { - ++s; /* There's a CIDR mask here! */ - cidr = strtol(s, &s, 10); + cidr = convertTo<uint16>(s.substr(1), s, false); /* Bail out if the CIDR is invalid or the string isn't done yet */ - if (cidr > 32 || *s) + if (cidr > 32 || s[0]) return 0; } else @@ -1516,12 +1326,9 @@ int str_is_cidr(char *str, uint32 *ip, uint32 *mask, char **host) octets[2] = (*ip & 0x0000FF00) / 256; octets[3] = (*ip & 0x000000FF); - if (cidr == 32) - snprintf(buf, 512, "%d.%d.%d.%d", octets[0], octets[1], octets[2], octets[3]); - else - snprintf(buf, 512, "%d.%d.%d.%d/%d", octets[0], octets[1], octets[2], octets[3], cidr); - - *host = sstrdup(buf); + host = stringify(octets[0]) + "." + stringify(octets[1]) + "." + stringify(octets[2]) + "." + stringify(octets[3]); + if (cidr != 32) + host += "/" + stringify(cidr); return 1; } diff --git a/src/modes.cpp b/src/modes.cpp index 38ac2ad00..3642b977e 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -32,7 +32,7 @@ Flags<ChannelModeName, CMODE_END> DefMLockOn; /* Default mlocked modes off */ Flags<ChannelModeName, CMODE_END> DefMLockOff; /* Map for default mlocked mode parameters */ -std::map<ChannelModeName, std::string> DefMLockParams; +std::map<ChannelModeName, Anope::string> DefMLockParams; /* Modes to set on bots when they join the channel */ std::list<ChannelModeStatus *> BotModes; @@ -45,11 +45,11 @@ void SetDefaultMLock() DefMLockParams.clear(); Flags<ChannelModeName, CMODE_END> *ptr = NULL; - std::string modes, param; + Anope::string modes, param; spacesepstream sep(Config.MLock); sep.GetToken(modes); - for (unsigned i = 0, end_mode = modes.size(); i < end_mode; ++i) + for (unsigned i = 0, end_mode = modes.length(); i < end_mode; ++i) { if (modes[i] == '+') ptr = &DefMLockOn; @@ -82,7 +82,7 @@ void SetDefaultMLock() /* Set Bot Modes */ BotModes.clear(); - for (unsigned i = 0, end_mode = Config.BotModes.size(); i < end_mode; ++i) + for (unsigned i = 0, end_mode = Config.BotModes.length(); i < end_mode; ++i) { ChannelMode *cm = ModeManager::FindChannelModeByChar(Config.BotModes[i]); @@ -97,7 +97,7 @@ void SetDefaultMLock() * @param modeChar The mode char * @param modeType The mode type */ -Mode::Mode(ModeClass mClass, const std::string &mNameAsString, char modeChar, ModeType modeType) : Class(mClass), NameAsString(mNameAsString), ModeChar(modeChar), Type(modeType) +Mode::Mode(ModeClass mClass, const Anope::string &mNameAsString, char modeChar, ModeType modeType) : Class(mClass), NameAsString(mNameAsString), ModeChar(modeChar), Type(modeType) { } @@ -112,7 +112,7 @@ Mode::~Mode() * @param mNameAsString The mode name as a string * @param modeChar The mode char */ -UserMode::UserMode(UserModeName mName, const std::string &mNameAsString, char modeChar) : Mode(MC_USER, mNameAsString, modeChar, MODE_REGULAR), Name(mName) +UserMode::UserMode(UserModeName mName, const Anope::string &mNameAsString, char modeChar) : Mode(MC_USER, mNameAsString, modeChar, MODE_REGULAR), Name(mName) { } @@ -127,7 +127,7 @@ UserMode::~UserMode() * @param mNameAsString The mode name as a string * @param modeChar The mode char */ -UserModeParam::UserModeParam(UserModeName mName, const std::string &mNameAsString, char modeChar) : UserMode(mName, mNameAsString, modeChar) +UserModeParam::UserModeParam(UserModeName mName, const Anope::string &mNameAsString, char modeChar) : UserMode(mName, mNameAsString, modeChar) { this->Type = MODE_PARAM; } @@ -137,7 +137,7 @@ UserModeParam::UserModeParam(UserModeName mName, const std::string &mNameAsStrin * @param mNameAsString The mode name as a string * @param modeChar The mode char */ -ChannelMode::ChannelMode(ChannelModeName mName, const std::string &mNameAsString, char modeChar) : Mode(MC_CHANNEL, mNameAsString, modeChar, MODE_REGULAR), Name(mName) +ChannelMode::ChannelMode(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar) : Mode(MC_CHANNEL, mNameAsString, modeChar, MODE_REGULAR), Name(mName) { } @@ -152,7 +152,7 @@ ChannelMode::~ChannelMode() * @param mNameAsString The mode name as a string * @param modeChar The mode char */ -ChannelModeList::ChannelModeList(ChannelModeName mName, const std::string &mNameAsString, char modeChar) : ChannelMode(mName, mNameAsString, modeChar) +ChannelModeList::ChannelModeList(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar) : ChannelMode(mName, mNameAsString, modeChar) { this->Type = MODE_LIST; } @@ -169,7 +169,7 @@ ChannelModeList::~ChannelModeList() * @param modeChar The mode char * @param MinusArg true if the mode sends no arg when unsetting */ -ChannelModeParam::ChannelModeParam(ChannelModeName mName, const std::string &mNameAsString, char modeChar, bool MinusArg) : ChannelMode(mName, mNameAsString, modeChar), MinusNoArg(MinusArg) +ChannelModeParam::ChannelModeParam(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar, bool MinusArg) : ChannelMode(mName, mNameAsString, modeChar), MinusNoArg(MinusArg) { this->Type = MODE_PARAM; } @@ -186,7 +186,7 @@ ChannelModeParam::~ChannelModeParam() * @param modeChar The mode char * @param mSymbol The symbol for the mode, eg @ % + */ -ChannelModeStatus::ChannelModeStatus(ChannelModeName mName, const std::string &mNameAsString, char modeChar, char mSymbol) : ChannelMode(mName, mNameAsString, modeChar), Symbol(mSymbol) +ChannelModeStatus::ChannelModeStatus(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar, char mSymbol) : ChannelMode(mName, mNameAsString, modeChar), Symbol(mSymbol) { this->Type = MODE_STATUS; } @@ -201,9 +201,9 @@ ChannelModeStatus::~ChannelModeStatus() * @param value The key * @return true or false */ -bool ChannelModeKey::IsValid(const std::string &value) +bool ChannelModeKey::IsValid(const Anope::string &value) { - if (!value.empty() && value.find(':') != std::string::npos && value.find(',') != std::string::npos) + if (!value.empty() && value.find(':') != Anope::string::npos && value.find(',') != Anope::string::npos) return true; return false; @@ -246,12 +246,12 @@ bool ChannelModeRegistered::CanSet(User *u) * @param chan The channel * @param mask The ban */ -void ChannelModeBan::AddMask(Channel *chan, const char *mask) +void ChannelModeBan::AddMask(Channel *chan, const Anope::string &mask) { Entry *ban; /* check for NULL values otherwise we will segfault */ - if (!chan || !mask) + if (!chan || mask.empty()) { Alog(LOG_DEBUG) << "add_ban called with NULL values"; return; @@ -268,13 +268,13 @@ void ChannelModeBan::AddMask(Channel *chan, const char *mask) /* Check whether it matches a botserv bot after adding internally * and parsing it through cidr support. ~ Viper */ - if (Config.s_BotServ && Config.BSSmartJoin && chan->ci && chan->ci->bi && chan->FindUser(chan->ci->bi)) + if (!Config.s_BotServ.empty() && Config.BSSmartJoin && chan->ci && chan->ci->bi && chan->FindUser(chan->ci->bi)) { BotInfo *bi = chan->ci->bi; - if (entry_match(ban, bi->nick.c_str(), bi->GetIdent().c_str(), bi->host, 0)) + if (entry_match(ban, bi->nick, bi->GetIdent(), bi->host, 0)) { - ircdproto->SendMode(bi, chan, "-b %s", mask); + ircdproto->SendMode(bi, chan, "-b %s", mask.c_str()); entry_delete(chan->bans, ban); return; } @@ -287,13 +287,13 @@ void ChannelModeBan::AddMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The ban */ -void ChannelModeBan::DelMask(Channel *chan, const char *mask) +void ChannelModeBan::DelMask(Channel *chan, const Anope::string &mask) { AutoKick *akick; Entry *ban; /* Sanity check as it seems some IRCD will just send -b without a mask */ - if (!mask || !chan->bans || !chan->bans->count) + if (mask.empty() || !chan->bans || !chan->bans->count) return; ban = elist_find_mask(chan->bans, mask); @@ -313,11 +313,11 @@ void ChannelModeBan::DelMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The except */ -void ChannelModeExcept::AddMask(Channel *chan, const char *mask) +void ChannelModeExcept::AddMask(Channel *chan, const Anope::string &mask) { Entry *exception; - if (!chan || !mask) + if (!chan || mask.empty()) { Alog(LOG_DEBUG) << "add_exception called with NULL values"; return; @@ -339,12 +339,12 @@ void ChannelModeExcept::AddMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The except */ -void ChannelModeExcept::DelMask(Channel *chan, const char *mask) +void ChannelModeExcept::DelMask(Channel *chan, const Anope::string &mask) { Entry *exception; /* Sanity check as it seems some IRCD will just send -e without a mask */ - if (!mask || !chan->excepts || !chan->excepts->count) + if (mask.empty() || !chan->excepts || !chan->excepts->count) return; exception = elist_find_mask(chan->excepts, mask); @@ -360,11 +360,11 @@ void ChannelModeExcept::DelMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The invex */ -void ChannelModeInvex::AddMask(Channel *chan, const char *mask) +void ChannelModeInvex::AddMask(Channel *chan, const Anope::string &mask) { Entry *invite; - if (!chan || !mask) + if (!chan || mask.empty()) { Alog(LOG_DEBUG) << "add_invite called with NULL values"; return; @@ -387,12 +387,12 @@ void ChannelModeInvex::AddMask(Channel *chan, const char *mask) * @param chan The channel * @param mask The index */ -void ChannelModeInvex::DelMask(Channel *chan, const char *mask) +void ChannelModeInvex::DelMask(Channel *chan, const Anope::string &mask) { Entry *invite; /* Sanity check as it seems some IRCD will just send -I without a mask */ - if (!mask || !chan->invites || !chan->invites->count) + if (mask.empty() || !chan->invites || !chan->invites->count) return; invite = elist_find_mask(chan->invites, mask); @@ -404,12 +404,12 @@ void ChannelModeInvex::DelMask(Channel *chan, const char *mask) } } -void StackerInfo::AddMode(void *Mode, bool Set, const std::string &Param) +void StackerInfo::AddMode(void *Mode, bool Set, const Anope::string &Param) { ChannelMode *cm = NULL; UserMode *um = NULL; - std::list<std::pair<void *, std::string> > *list, *otherlist; - std::list<std::pair<void *, std::string > >::iterator it, it_end; + std::list<std::pair<void *, Anope::string> > *list, *otherlist; + std::list<std::pair<void *, Anope::string > >::iterator it, it_end; bool IsParam = false; if (Type == ST_CHANNEL) @@ -441,7 +441,7 @@ void StackerInfo::AddMode(void *Mode, bool Set, const std::string &Param) /* The param must match too (can have multiple status or list modes), but * if it is a param mode it can match no matter what the param is */ - if (it->first == Mode && (it->second == Param || IsParam)) + if (it->first == Mode && (Param.equals_cs(it->second) || IsParam)) { list->erase(it); /* It can only be on this list once */ @@ -454,7 +454,7 @@ void StackerInfo::AddMode(void *Mode, bool Set, const std::string &Param) /* The param must match too (can have multiple status or list modes), but * if it is a param mode it can match no matter what the param is */ - if (it->first == Mode && (it->second == Param || IsParam)) + if (it->first == Mode && (Param.equals_cs(it->second) || IsParam)) { otherlist->erase(it); return; @@ -491,11 +491,11 @@ StackerInfo *ModeManager::GetInfo(void *Item) * @param info The stacker info for a channel or user * @return a list of strings */ -std::list<std::string> ModeManager::BuildModeStrings(StackerInfo *info) +std::list<Anope::string> ModeManager::BuildModeStrings(StackerInfo *info) { - std::list<std::string> ret; - std::list<std::pair<void *, std::string> >::iterator it, it_end; - std::string buf, parambuf; + std::list<Anope::string> ret; + std::list<std::pair<void *, Anope::string> >::iterator it, it_end; + Anope::string buf, parambuf; ChannelMode *cm = NULL; UserMode *um = NULL; unsigned NModes = 0; @@ -571,7 +571,7 @@ std::list<std::string> ModeManager::BuildModeStrings(StackerInfo *info) * @param Set Adding or removing? * @param Param A param, if there is one */ -void ModeManager::StackerAddInternal(BotInfo *bi, User *u, UserMode *um, bool Set, const std::string &Param) +void ModeManager::StackerAddInternal(BotInfo *bi, User *u, UserMode *um, bool Set, const Anope::string &Param) { StackerAddInternal(bi, u, um, Set, Param, ST_USER); } @@ -583,7 +583,7 @@ void ModeManager::StackerAddInternal(BotInfo *bi, User *u, UserMode *um, bool Se * @param Set Adding or removing? * @param Param A param, if there is one */ -void ModeManager::StackerAddInternal(BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, const std::string &Param) +void ModeManager::StackerAddInternal(BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, const Anope::string &Param) { StackerAddInternal(bi, c, cm, Set, Param, ST_CHANNEL); } @@ -596,7 +596,7 @@ void ModeManager::StackerAddInternal(BotInfo *bi, Channel *c, ChannelMode *cm, b * @param Param A param, if there is one * @param Type The type this is, user or channel */ -void ModeManager::StackerAddInternal(BotInfo *bi, void *Object, void *Mode, bool Set, const std::string &Param, StackerType Type) +void ModeManager::StackerAddInternal(BotInfo *bi, void *Object, void *Mode, bool Set, const Anope::string &Param, StackerType Type) { StackerInfo *s = GetInfo(Object); s->Type = Type; @@ -747,7 +747,7 @@ char ModeManager::GetStatusChar(char Value) * @param Set true for setting, false for removing * @param Param The param, if there is one */ -void ModeManager::StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, const std::string &Param) +void ModeManager::StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, const Anope::string &Param) { StackerAddInternal(bi, c, cm, Set, Param); } @@ -759,7 +759,7 @@ void ModeManager::StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, * @param Set true for setting, false for removing * @param Param The param, if there is one */ -void ModeManager::StackerAdd(BotInfo *bi, Channel *c, ChannelModeName Name, bool Set, const std::string &Param) +void ModeManager::StackerAdd(BotInfo *bi, Channel *c, ChannelModeName Name, bool Set, const Anope::string &Param) { StackerAdd(bi, c, FindChannelModeByName(Name), Set, Param); } @@ -771,7 +771,7 @@ void ModeManager::StackerAdd(BotInfo *bi, Channel *c, ChannelModeName Name, bool * @param Set true for setting, false for removing * @param Param The param, if there is one */ -void ModeManager::StackerAdd(BotInfo *bi, Channel *c, const char Mode, bool Set, const std::string &Param) +void ModeManager::StackerAdd(BotInfo *bi, Channel *c, const char Mode, bool Set, const Anope::string &Param) { StackerAdd(bi, c, FindChannelModeByChar(Mode), Set, Param); } @@ -783,7 +783,7 @@ void ModeManager::StackerAdd(BotInfo *bi, Channel *c, const char Mode, bool Set, * @param Set true for setting, false for removing * @param param The param, if there is one */ -void ModeManager::StackerAdd(BotInfo *bi, User *u, UserMode *um, bool Set, const std::string &Param) +void ModeManager::StackerAdd(BotInfo *bi, User *u, UserMode *um, bool Set, const Anope::string &Param) { StackerAddInternal(bi, u, um, Set, Param); } @@ -795,7 +795,7 @@ void ModeManager::StackerAdd(BotInfo *bi, User *u, UserMode *um, bool Set, const * @param Set true for setting, false for removing * @param Param The param, if there is one */ -void ModeManager::StackerAdd(BotInfo *bi, User *u, UserModeName Name, bool Set, const std::string &Param) +void ModeManager::StackerAdd(BotInfo *bi, User *u, UserModeName Name, bool Set, const Anope::string &Param) { StackerAdd(bi, u, FindUserModeByName(Name), Set, Param); } @@ -807,7 +807,7 @@ void ModeManager::StackerAdd(BotInfo *bi, User *u, UserModeName Name, bool Set, * @param Set true for setting, false for removing * @param Param The param, if there is one */ -void ModeManager::StackerAdd(BotInfo *bi, User *u, const char Mode, bool Set, const std::string &Param) +void ModeManager::StackerAdd(BotInfo *bi, User *u, const char Mode, bool Set, const Anope::string &Param) { StackerAdd(bi, u, FindUserModeByChar(Mode), Set, Param); } @@ -823,7 +823,7 @@ void ModeManager::ProcessModes() StackerInfo *s = it->second; User *u = NULL; Channel *c = NULL; - std::list<std::string> ModeStrings = BuildModeStrings(s); + std::list<Anope::string> ModeStrings = BuildModeStrings(s); if (s->Type == ST_USER) u = static_cast<User *>(it->first); @@ -832,7 +832,7 @@ void ModeManager::ProcessModes() else throw CoreException("ModeManager::ProcessModes got invalid Stacker Info type"); - for (std::list<std::string>::iterator lit = ModeStrings.begin(), lit_end = ModeStrings.end(); lit != lit_end; ++lit) + for (std::list<Anope::string>::iterator lit = ModeStrings.begin(), lit_end = ModeStrings.end(); lit != lit_end; ++lit) { if (c) ircdproto->SendMode(s->bi, c, lit->c_str()); diff --git a/src/module.cpp b/src/module.cpp index d2382eb02..99233d7a3 100644 --- a/src/module.cpp +++ b/src/module.cpp @@ -9,7 +9,7 @@ #include "modules.h" #include "language.h" -Module::Module(const std::string &mname, const std::string &creator) +Module::Module(const Anope::string &mname, const Anope::string &creator) { this->name = mname; /* Our name */ this->type = THIRD; @@ -45,7 +45,7 @@ Module::~Module() **/ if (HostServ) { - for (std::map<ci::string, Command *>::iterator it = HostServ->Commands.begin(), it_end = HostServ->Commands.end(); it != it_end; ) + for (CommandMap::iterator it = HostServ->Commands.begin(), it_end = HostServ->Commands.end(); it != it_end; ) { Command *c = it->second; ++it; @@ -57,7 +57,7 @@ Module::~Module() if (BotServ) { - for (std::map<ci::string, Command *>::iterator it = BotServ->Commands.begin(), it_end = BotServ->Commands.end(); it != it_end; ) + for (CommandMap::iterator it = BotServ->Commands.begin(), it_end = BotServ->Commands.end(); it != it_end; ) { Command *c = it->second; ++it; @@ -69,7 +69,7 @@ Module::~Module() if (MemoServ) { - for (std::map<ci::string, Command *>::iterator it = MemoServ->Commands.begin(), it_end = MemoServ->Commands.end(); it != it_end; ) + for (CommandMap::iterator it = MemoServ->Commands.begin(), it_end = MemoServ->Commands.end(); it != it_end; ) { Command *c = it->second; ++it; @@ -81,7 +81,7 @@ Module::~Module() if (NickServ) { - for (std::map<ci::string, Command *>::iterator it = NickServ->Commands.begin(), it_end = NickServ->Commands.end(); it != it_end; ) + for (CommandMap::iterator it = NickServ->Commands.begin(), it_end = NickServ->Commands.end(); it != it_end; ) { Command *c = it->second; ++it; @@ -93,7 +93,7 @@ Module::~Module() if (ChanServ) { - for (std::map<ci::string, Command *>::iterator it = ChanServ->Commands.begin(), it_end = ChanServ->Commands.end(); it != it_end; ) + for (CommandMap::iterator it = ChanServ->Commands.begin(), it_end = ChanServ->Commands.end(); it != it_end; ) { Command *c = it->second; ++it; @@ -105,7 +105,7 @@ Module::~Module() if (OperServ) { - for (std::map<ci::string, Command *>::iterator it = OperServ->Commands.begin(), it_end = OperServ->Commands.end(); it != it_end; ) + for (CommandMap::iterator it = OperServ->Commands.begin(), it_end = OperServ->Commands.end(); it != it_end; ) { Command *c = it->second; ++it; @@ -117,9 +117,7 @@ Module::~Module() std::list<Module *>::iterator it = std::find(Modules.begin(), Modules.end(), this); if (it != Modules.end()) - { Modules.erase(it); - } } void Module::SetType(MODType ntype) @@ -137,12 +135,12 @@ bool Module::GetPermanent() return this->permanent; } -void Module::SetVersion(const std::string &nversion) +void Module::SetVersion(const Anope::string &nversion) { this->version = nversion; } -void Module::SetAuthor(const std::string &nauthor) +void Module::SetAuthor(const Anope::string &nauthor) { this->author = nauthor; } diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp index 884bba5a8..4e26289ec 100644 --- a/src/modulemanager.cpp +++ b/src/modulemanager.cpp @@ -25,6 +25,12 @@ void ModuleManager::LoadModuleList(std::list<ci::string> &ModuleList) ModuleManager::LoadModule(*it, NULL); } +void ModuleManager::LoadModuleList(std::list<Anope::string> &ModuleList) +{ + for (std::list<Anope::string>::iterator it = ModuleList.begin(), it_end = ModuleList.end(); it != it_end; ++it) + ModuleManager::LoadModule(*it, NULL); +} + /** * Copy the module from the modules folder to the runtime folder. * This will prevent module updates while the modules is loaded from @@ -34,39 +40,37 @@ void ModuleManager::LoadModuleList(std::list<ci::string> &ModuleList) * @param output the destination to copy the module to * @return MOD_ERR_OK on success */ -static int moduleCopyFile(const char *name, const char *output) +static int moduleCopyFile(const Anope::string &name, Anope::string &output) { int ch; FILE *source, *target; #ifndef _WIN32 int srcfp; #endif - char input[4096]; + Anope::string input = services_dir + "/modules/" + name + MODULE_EXT; - strlcpy(input, services_dir.c_str(), sizeof(input)); - strlcat(input, "/modules/", sizeof(input)); /* Get full path with module extension */ - strlcat(input, name, sizeof(input)); - strlcat(input, MODULE_EXT, sizeof(input)); - - if (!(source = fopen(input, "rb"))) + if (!(source = fopen(input.c_str(), "rb"))) return MOD_ERR_NOEXIST; + char *tmp_output = strdup(output.c_str()); #ifndef _WIN32 - if ((srcfp = mkstemp(const_cast<char *>(output))) == -1) + if ((srcfp = mkstemp(const_cast<char *>(tmp_output))) == -1) #else - if (!mktemp(const_cast<char *>(output))) + if (!mktemp(const_cast<char *>(tmp_output))) #endif { fclose(source); return MOD_ERR_FILE_IO; } + output = tmp_output; + delete [] tmp_output; Alog(LOG_DEBUG) << "Runtime module location: " << output; #ifndef _WIN32 if (!(target = fdopen(srcfp, "w"))) #else - if (!(target = fopen(output, "wb"))) + if (!(target = fopen(output.c_str(), "wb"))) #endif { fclose(source); @@ -116,35 +120,25 @@ template <class TYPE> TYPE function_cast(ano_module_t symbol) return cast.function; } -int ModuleManager::LoadModule(const std::string &modname, User *u) +int ModuleManager::LoadModule(const Anope::string &modname, User *u) { const char *err; - Module *(*func)(const std::string &, const std::string &); + Module *(*func)(const Anope::string &, const Anope::string &); int ret = 0; if (modname.empty()) return MOD_ERR_PARAMS; - if (FindModule(modname) != NULL) + if (FindModule(modname)) return MOD_ERR_EXISTS; Alog(LOG_DEBUG) << "trying to load [" << modname << "]"; /* Generate the filename for the temporary copy of the module */ - std::string pbuf; - pbuf = services_dir + "/modules/"; -#ifndef _WIN32 - pbuf += "runtime/"; -#else - pbuf += "runtime\\"; -#endif - pbuf += modname; - pbuf += MODULE_EXT; - pbuf += "."; - pbuf += "XXXXXX"; + Anope::string pbuf = services_dir + "/modules/runtime/" + modname + MODULE_EXT + ".XXXXXX"; /* Don't skip return value checking! -GD */ - if ((ret = moduleCopyFile(modname.c_str(), pbuf.c_str())) != MOD_ERR_OK) + if ((ret = moduleCopyFile(modname, pbuf)) != MOD_ERR_OK) { /* XXX: This used to assign filename here, but I don't think that was correct.. * even if it was, it makes life very fucking difficult, so. @@ -162,7 +156,7 @@ int ModuleManager::LoadModule(const std::string &modname, User *u) } ano_modclearerr(); - func = function_cast<Module *(*)(const std::string &, const std::string &)>(dlsym(handle, "AnopeInit")); + func = function_cast<Module *(*)(const Anope::string &, const Anope::string &)>(dlsym(handle, "AnopeInit")); if (!func && (err = dlerror())) { Alog() << "No init function found, not an Anope module"; @@ -174,11 +168,9 @@ int ModuleManager::LoadModule(const std::string &modname, User *u) throw CoreException("Couldn't find constructor, yet moderror wasn't set?"); /* Create module. */ - std::string nick; + Anope::string nick; if (u) nick = u->nick; - else - nick = ""; Module *m; @@ -238,16 +230,6 @@ int ModuleManager::LoadModule(const std::string &modname, User *u) return MOD_ERR_OK; } -int ModuleManager::LoadModule(const char *modname, User *u) -{ - return LoadModule(std::string(modname), u); -} - -int ModuleManager::LoadModule(const ci::string &modname, User *u) -{ - return LoadModule(std::string(modname.c_str()), u); -} - int ModuleManager::UnloadModule(Module *m, User *u) { if (!m || !m->handle) @@ -286,7 +268,7 @@ void ModuleManager::DeleteModule(Module *m) DetachAll(m); ano_module_t handle = m->handle; - std::string filename = m->filename; + Anope::string filename = m->filename; ano_modclearerr(); destroy_func = function_cast<void (*)(Module *)>(dlsym(m->handle, "AnopeFini")); @@ -479,4 +461,3 @@ void ModuleManager::UnloadAll(bool unload_proto) DeleteModule(m); } } - diff --git a/src/modules.cpp b/src/modules.cpp index fda941e50..b6115137d 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -13,14 +13,12 @@ #include "language.h" #include "version.h" -std::multimap<std::string, Message *> MessageMap; +message_map MessageMap; std::list<Module *> Modules; -char *mod_current_buffer = NULL; - -char *ModuleGetErrStr(int status) +Anope::string ModuleGetErrStr(int status) { - const char *module_err_str[] = { + Anope::string module_err_str[] = { "Module, Okay - No Error", /* MOD_ERR_OK */ "Module Error, Allocating memory", /* MOD_ERR_MEMORY */ "Module Error, Not enough parameters", /* MOD_ERR_PARAMS */ @@ -36,7 +34,7 @@ char *ModuleGetErrStr(int status) "Module Error, No Service found for request", /* MOD_ERR_NOSERVICE */ "Module Error, No module name for request" /* MOD_ERR_NO_MOD_NAME */ }; - return const_cast<char *>(module_err_str[status]); + return module_err_str[status]; } /************************************************/ @@ -60,7 +58,7 @@ int protocol_module_init() */ if (ircd->ts6) { - if (!Config.Numeric) + if (Config.Numeric.empty()) { Alog() << "This IRCd protocol requires a server id to be set in Anope's configuration."; ret = -1; @@ -83,7 +81,7 @@ void Module::InsertLanguage(int langNumber, int ac, const char **av) this->lang[langNumber].argc = ac; this->lang[langNumber].argv = new char *[ac]; for (i = 0; i < ac; ++i) - this->lang[langNumber].argv[i] = sstrdup(av[i]); + this->lang[langNumber].argv[i] = strdup(av[i]); } /** @@ -91,35 +89,25 @@ void Module::InsertLanguage(int langNumber, int ac, const char **av) * @param name the name of the module to find * @return a pointer to the module found, or NULL */ -Module *FindModule(const std::string &name) +Module *FindModule(const Anope::string &name) { for (std::list<Module *>::const_iterator it = Modules.begin(), it_end = Modules.end(); it != it_end; ++it) { Module *m = *it; - if (m->name == name) + if (m->name.equals_ci(name)) return m; } return NULL; } -Module *FindModule(const char *name) -{ - return FindModule(std::string(name)); -} - -Module *FindModule(const ci::string &name) -{ - return FindModule(std::string(name.c_str())); -} - /** Add a message to Anope * @param name The message name as sent by the IRCd * @param func A callback function that will be called when this message is received * @return The new message object */ -Message *Anope::AddMessage(const std::string &name, int (*func)(const char *source, int ac, const char **av)) +Message *Anope::AddMessage(const Anope::string &name, int (*func)(const Anope::string &source, int ac, const char **av)) { Message *m = new Message; @@ -139,12 +127,12 @@ Message *Anope::AddMessage(const std::string &name, int (*func)(const char *sour */ bool Anope::DelMessage(Message *m) { - std::multimap<std::string, Message *>::iterator it = MessageMap.find(m->name); + message_map::iterator it = MessageMap.find(m->name); if (it == MessageMap.end()) return false; - std::multimap<std::string, Message *>::iterator upper = MessageMap.upper_bound(m->name); + message_map::iterator upper = MessageMap.upper_bound(m->name); for (; it != upper; ++it) { @@ -158,20 +146,21 @@ bool Anope::DelMessage(Message *m) return false; } + /** Find message in the message table * @param name The name of the message were looking for * @return NULL if we cant find it, or a pointer to the Message if we can **/ -std::vector<Message *> Anope::FindMessage(const std::string &name) +std::vector<Message *> Anope::FindMessage(const Anope::string &name) { std::vector<Message *> messages; - std::multimap<std::string, Message *>::iterator it = MessageMap.find(name); + message_map::iterator it = MessageMap.find(name); if (it == MessageMap.end()) return messages; - std::multimap<std::string, Message *>::iterator upper = MessageMap.upper_bound(name); + message_map::iterator upper = MessageMap.upper_bound(name); for (; it != upper; ++it) messages.push_back(it->second); @@ -179,7 +168,6 @@ std::vector<Message *> Anope::FindMessage(const std::string &name) return messages; } - /******************************************************************************* * Command Functions *******************************************************************************/ @@ -192,7 +180,7 @@ int Module::AddCommand(BotInfo *bi, Command *c) c->module = this; c->service = bi; - std::pair<std::map<ci::string, Command *>::iterator, bool> it = bi->Commands.insert(std::make_pair(c->name, c)); + std::pair<CommandMap::iterator, bool> it = bi->Commands.insert(std::make_pair(c->name, c)); if (it.second != true) { @@ -266,7 +254,7 @@ bool moduleMinVersion(int major, int minor, int patch, int build) return ret; } -void Module::NoticeLang(const char *source, User *u, int number, ...) +void Module::NoticeLang(const Anope::string &source, User *u, int number, ...) { va_list va; char buffer[4096], outbuf[4096]; @@ -287,7 +275,7 @@ void Module::NoticeLang(const char *source, User *u, int number, ...) { fmt = this->lang[mlang].argv[number]; - buf = sstrdup(fmt); + buf = strdup(fmt); va_start(va, number); vsnprintf(buffer, 4095, buf, va); va_end(va); @@ -366,7 +354,7 @@ void ModuleRunTimeDirCleanUp() { if (!dp->d_ino) continue; - if (!stricmp(dp->d_name, ".") || !stricmp(dp->d_name, "..")) + if (Anope::string(dp->d_name).equals_cs(".") || Anope::string(dp->d_name).equals_cs("..")) continue; snprintf(filebuf, BUFSIZE, "%s/%s", dirbuf, dp->d_name); DeleteFile(filebuf); diff --git a/src/nickalias.cpp b/src/nickalias.cpp index 8ffbac891..c18f93005 100644 --- a/src/nickalias.cpp +++ b/src/nickalias.cpp @@ -1,15 +1,14 @@ #include "services.h" #include "modules.h" -NickRequest::NickRequest(const std::string &nickname) +NickRequest::NickRequest(const Anope::string &nickname) { if (nickname.empty()) throw CoreException("Empty nick passed to NickRequest constructor"); - email = NULL; requested = lastmail = 0; - this->nick = sstrdup(nickname.c_str()); + this->nick = nickname; NickRequestList[this->nick] = this; } @@ -19,45 +18,39 @@ NickRequest::~NickRequest() FOREACH_MOD(I_OnDelNickRequest, OnDelNickRequest(this)); NickRequestList.erase(this->nick); - - if (this->nick) - delete [] this->nick; - if (this->email) - delete [] this->email; } /** Default constructor * @param nick The nick * @param nickcore The nickcofe for this nick */ -NickAlias::NickAlias(const std::string &nickname, NickCore *nickcore) +NickAlias::NickAlias(const Anope::string &nickname, NickCore *nickcore) { if (nickname.empty()) throw CoreException("Empty nick passed to NickAlias constructor"); else if (!nickcore) throw CoreException("Empty nickcore passed to NickAlias constructor"); - nick = last_quit = last_realname = last_usermask = NULL; time_registered = last_seen = 0; - this->nick = sstrdup(nickname.c_str()); + this->nick = nickname; this->nc = nickcore; nc->aliases.push_back(this); NickAliasList[this->nick] = this; - for (std::list<std::pair<ci::string, ci::string> >::iterator it = Config.Opers.begin(), it_end = Config.Opers.end(); it != it_end; ++it) + for (std::list<std::pair<Anope::string, Anope::string> >::iterator it = Config.Opers.begin(), it_end = Config.Opers.end(); it != it_end; ++it) { if (nc->ot) break; - if (stricmp(it->first.c_str(), this->nick)) + if (!this->nick.equals_ci(it->first)) continue; for (std::list<OperType *>::iterator tit = Config.MyOperTypes.begin(), tit_end = Config.MyOperTypes.end(); tit != tit_end; ++tit) { OperType *ot = *tit; - if (ot->GetName() == it->second) + if (ot->GetName().equals_ci(it->second)) { Alog() << "Tied oper " << nc->display << " to type " << ot->GetName(); nc->ot = ot; @@ -99,21 +92,13 @@ NickAlias::~NickAlias() else { /* Display updating stuff */ - if (!stricmp(this->nick, this->nc->display)) + if (this->nick.equals_ci(this->nc->display)) change_core_display(this->nc); } } /* Remove us from the aliases list */ NickAliasList.erase(this->nick); - - delete [] this->nick; - if (this->last_usermask) - delete [] this->last_usermask; - if (this->last_realname) - delete [] this->last_realname; - if (this->last_quit) - delete [] this->last_quit; } /** Release a nick from being held. This can be called from the core (ns_release) @@ -127,7 +112,7 @@ void NickAlias::Release() if (ircd->svshold) ircdproto->SendSVSHoldDel(this->nick); else - ircdproto->SendQuit(this->nick, NULL); + ircdproto->SendQuit(this->nick, ""); this->UnsetFlag(NS_HELD); } @@ -148,7 +133,7 @@ void NickAlias::OnCancel(User *) ircdproto->SendSVSHold(this->nick); else { - std::string uid = (ircd->ts6 ? ts6_uid_retrieve() : ""); + Anope::string uid = ircd->ts6 ? ts6_uid_retrieve() : ""; ircdproto->SendClientIntroduction(this->nick, Config.NSEnforcerUser, Config.NSEnforcerHost, "Services Enforcer", "+", uid); new NickServRelease(this->nick, uid, Config.NSReleaseTimeout); diff --git a/src/nickcore.cpp b/src/nickcore.cpp index 6c9392aef..565a23a26 100644 --- a/src/nickcore.cpp +++ b/src/nickcore.cpp @@ -4,17 +4,16 @@ /** Default constructor * @param display The display nick */ -NickCore::NickCore(const std::string &coredisplay) +NickCore::NickCore(const Anope::string &coredisplay) { if (coredisplay.empty()) throw CoreException("Empty display passed to NickCore constructor"); - display = email = greet = NULL; ot = NULL; language = channelcount = 0; lastmail = 0; - this->display = sstrdup(coredisplay.c_str()); + this->display = coredisplay; /* Set default nick core flags */ for (size_t t = NI_BEGIN + 1; t != NI_END; ++t) @@ -55,32 +54,19 @@ NickCore::~NickCore() /* Clear access before deleting display name, we want to be able to use the display name in the clear access event */ this->ClearAccess(); - /* Now we can safely free it. */ - delete [] this->display; - - if (this->email) - delete [] this->email; - if (this->greet) - delete [] this->greet; if (!this->memos.memos.empty()) { for (unsigned i = 0, end = this->memos.memos.size(); i < end; ++i) - { - if (this->memos.memos[i]->text) - delete [] this->memos.memos[i]->text; delete this->memos.memos[i]; - } this->memos.memos.clear(); } } -bool NickCore::HasCommand(const ci::string &cmdstr) const +bool NickCore::HasCommand(const Anope::string &cmdstr) const { if (!this->ot) - { // No opertype. return false; - } return this->ot->HasCommand(cmdstr); } @@ -93,7 +79,7 @@ bool NickCore::IsServicesOper() const return false; } -bool NickCore::HasPriv(const ci::string &privstr) const +bool NickCore::HasPriv(const Anope::string &privstr) const { if (!this->ot) // No opertype. @@ -102,20 +88,20 @@ bool NickCore::HasPriv(const ci::string &privstr) const return this->ot->HasPriv(privstr); } -void NickCore::AddAccess(const std::string &entry) +void NickCore::AddAccess(const Anope::string &entry) { access.push_back(entry); FOREACH_MOD(I_OnNickAddAccess, OnNickAddAccess(this, entry)); } -std::string NickCore::GetAccess(unsigned entry) +Anope::string NickCore::GetAccess(unsigned entry) { if (access.empty() || entry >= access.size()) return ""; return access[entry]; } -bool NickCore::FindAccess(const std::string &entry) +bool NickCore::FindAccess(const Anope::string &entry) { for (unsigned i = 0, end = access.size(); i < end; ++i) if (access[i] == entry) @@ -124,7 +110,7 @@ bool NickCore::FindAccess(const std::string &entry) return false; } -void NickCore::EraseAccess(const std::string &entry) +void NickCore::EraseAccess(const Anope::string &entry) { for (unsigned i = 0, end = access.size(); i < end; ++i) if (access[i] == entry) diff --git a/src/nickserv.cpp b/src/nickserv.cpp index 70cc3d654..0397c8b32 100644 --- a/src/nickserv.cpp +++ b/src/nickserv.cpp @@ -17,13 +17,16 @@ nickalias_map NickAliasList; nickcore_map NickCoreList; nickrequest_map NickRequestList; -static std::map<std::string, NickServCollide *> NickServCollides; -static std::map<std::string, NickServRelease *> NickServReleases; +typedef std::map<Anope::string, NickServCollide *, hash_compare_std_string> nickservcollides_map; +typedef std::map<Anope::string, NickServRelease *, hash_compare_std_string> nickservreleases_map; -NickServCollide::NickServCollide(const std::string &_nick, time_t delay) : Timer(delay), nick(_nick) +static nickservcollides_map NickServCollides; +static nickservreleases_map NickServReleases; + +NickServCollide::NickServCollide(const Anope::string &_nick, time_t delay) : Timer(delay), nick(_nick) { /* Erase the current collide and use the new one */ - std::map<std::string, NickServCollide *>::iterator nit = NickServCollides.find(nick); + nickservcollides_map::iterator nit = NickServCollides.find(nick); if (nit != NickServCollides.end()) delete nit->second; @@ -46,10 +49,10 @@ void NickServCollide::Tick(time_t ctime) u->Collide(na); } -NickServRelease::NickServRelease(const std::string &_nick, const std::string &_uid, time_t delay) : Timer(delay), nick(_nick), uid(_uid) +NickServRelease::NickServRelease(const Anope::string &_nick, const Anope::string &_uid, time_t delay) : Timer(delay), nick(_nick), uid(_uid) { /* Erase the current release timer and use the new one */ - std::map<std::string, NickServRelease *>::iterator nit = NickServReleases.find(nick); + nickservreleases_map::iterator nit = NickServReleases.find(nick); if (nit != NickServReleases.end()) delete nit->second; @@ -90,14 +93,14 @@ void get_aliases_stats(long *nrec, long *memuse) ++count; mem += sizeof(*na); - if (na->nick) - mem += strlen(na->nick) + 1; - if (na->last_usermask) - mem += strlen(na->last_usermask) + 1; - if (na->last_realname) - mem += strlen(na->last_realname) + 1; - if (na->last_quit) - mem += strlen(na->last_quit) + 1; + if (!na->nick.empty()) + mem += na->nick.length() + 1; + if (!na->last_usermask.empty()) + mem += na->last_usermask.length() + 1; + if (!na->last_realname.empty()) + mem += na->last_realname.length() + 1; + if (!na->last_quit.empty()) + mem += na->last_quit.length() + 1; } *nrec = count; *memuse = mem; @@ -119,25 +122,22 @@ void get_core_stats(long *nrec, long *memuse) ++count; mem += sizeof(*nc); - if (nc->display) - mem += strlen(nc->display) + 1; + if (!nc->display.empty()) + mem += nc->display.length() + 1; if (!nc->pass.empty()) - mem += (nc->pass.capacity() + (2 * sizeof(size_t)) + (2 * sizeof(void *))); - if (nc->email) - mem += strlen(nc->email) + 1; - if (nc->greet) - mem += strlen(nc->greet) + 1; + mem += nc->pass.length() + 1; + if (!nc->greet.empty()) + mem += nc->greet.length() + 1; + + mem += sizeof(Anope::string) * nc->access.size(); - mem += sizeof(std::string) * nc->access.size(); for (j = 0, end = nc->access.size(); j < end; ++j) mem += nc->GetAccess(j).length() + 1; mem += nc->memos.memos.size() * sizeof(Memo); for (j = 0, end = nc->memos.memos.size(); j < end; ++j) - { - if (nc->memos.memos[j]->text) - mem += strlen(nc->memos.memos[j]->text) + 1; - } + if (!nc->memos.memos[j]->text.empty()) + mem += nc->memos.memos[j]->text.length() + 1; mem += sizeof(NickAlias *) * nc->aliases.size(); } @@ -159,17 +159,17 @@ void ns_init() /* Main NickServ routine. */ -void nickserv(User *u, const std::string &buf) +void nickserv(User *u, const Anope::string &buf) { if (!u || buf.empty()) return; - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_ci("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string command = buf; + Anope::string command = buf; command.erase(command.begin()); command.erase(command.end()); - ircdproto->SendCTCP(NickServ, u->nick.c_str(), "%s", command.c_str()); + ircdproto->SendCTCP(NickServ, u->nick, "%s", command.c_str()); } else mod_run_cmd(NickServ, u, buf); @@ -216,13 +216,9 @@ int validate_user(User *u) if (!na->nc->HasFlag(NI_SECURE) && u->IsRecognized()) { na->last_seen = time(NULL); - if (na->last_usermask) - delete [] na->last_usermask; - std::string last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost(); - na->last_usermask = sstrdup(last_usermask.c_str()); - if (na->last_realname) - delete [] na->last_realname; - na->last_realname = sstrdup(u->realname); + Anope::string last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost(); + na->last_usermask = last_usermask; + na->last_realname = u->realname; check_memos(u); @@ -232,9 +228,9 @@ int validate_user(User *u) if (u->IsRecognized() || !na->nc->HasFlag(NI_KILL_IMMED)) { if (na->nc->HasFlag(NI_SECURE)) - notice_lang(Config.s_NickServ, u, NICK_IS_SECURE, Config.s_NickServ); + notice_lang(Config.s_NickServ, u, NICK_IS_SECURE, Config.s_NickServ.c_str()); else - notice_lang(Config.s_NickServ, u, NICK_IS_REGISTERED, Config.s_NickServ); + notice_lang(Config.s_NickServ, u, NICK_IS_REGISTERED, Config.s_NickServ.c_str()); } if (na->nc->HasFlag(NI_KILLPROTECT) && !u->IsRecognized()) @@ -288,7 +284,7 @@ void expire_nicks() FOREACH_RESULT(I_OnPreNickExpire, OnPreNickExpire(na)); if (MOD_RESULT == EVENT_STOP) continue; - Alog() << "Expiring nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (na->nc->email ? na->nc->email : "none") << ")"; + Alog() << "Expiring nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")"; FOREACH_MOD(I_OnNickExpire, OnNickExpire(na)); delete na; } @@ -313,17 +309,7 @@ void expire_requests() /*************************************************************************/ -NickRequest *findrequestnick(const char *nick) -{ - return findrequestnick(ci::string(nick)); -} - -NickRequest *findrequestnick(const std::string &nick) -{ - return findrequestnick(ci::string(nick.c_str())); -} - -NickRequest *findrequestnick(const ci::string &nick) +NickRequest *findrequestnick(const Anope::string &nick) { nickrequest_map::const_iterator it = NickRequestList.find(nick); @@ -332,17 +318,7 @@ NickRequest *findrequestnick(const ci::string &nick) return NULL; } -NickAlias *findnick(const char *nick) -{ - return findnick(ci::string(nick)); -} - -NickAlias *findnick(const std::string &nick) -{ - return findnick(ci::string(nick.c_str())); -} - -NickAlias *findnick(const ci::string &nick) +NickAlias *findnick(const Anope::string &nick) { nickalias_map::const_iterator it = NickAliasList.find(nick); @@ -353,17 +329,7 @@ NickAlias *findnick(const ci::string &nick) /*************************************************************************/ -NickCore *findcore(const char *nick) -{ - return findcore(ci::string(nick)); -} - -NickCore *findcore(const std::string &nick) -{ - return findcore(ci::string(nick.c_str())); -} - -NickCore *findcore(const ci::string &nick) +NickCore *findcore(const Anope::string &nick) { nickcore_map::const_iterator it = NickCoreList.find(nick); @@ -383,54 +349,23 @@ NickCore *findcore(const ci::string &nick) */ bool is_on_access(User *u, NickCore *nc) { - unsigned i, end; - char *buf; - char *buf2 = NULL; - char *buf3 = NULL; - std::string tmp_buf; - if (!u || !nc || nc->access.empty()) return false; - tmp_buf = u->GetIdent() + "@" + u->host; - buf = sstrdup(tmp_buf.c_str()); + Anope::string buf = u->GetIdent() + "@" + u->host, buf2, buf3; if (ircd->vhost) { - if (u->vhost) - { - tmp_buf = u->GetIdent() + "@" + u->vhost; - buf2 = sstrdup(tmp_buf.c_str()); - } + if (!u->vhost.empty()) + buf2 = u->GetIdent() + "@" + u->vhost; if (!u->GetCloakedHost().empty()) - { - tmp_buf = u->GetIdent() + "@" + u->GetCloakedHost(); - buf3 = sstrdup(tmp_buf.c_str()); - } + buf3 = u->GetIdent() + "@" + u->GetCloakedHost(); } - for (i = 0, end = nc->access.size(); i < end; ++i) + for (unsigned i = 0, end = nc->access.size(); i < end; ++i) { - std::string access = nc->GetAccess(i); - if (Anope::Match(buf, access, false) || (buf2 && Anope::Match(buf2, access, false)) || (buf3 && Anope::Match(buf3, access, false))) - { - delete [] buf; - if (ircd->vhost) - { - if (u->vhost) - delete [] buf2; - if (!u->GetCloakedHost().empty()) - delete [] buf3; - } + Anope::string access = nc->GetAccess(i); + if (Anope::Match(buf, access) || (!buf2.empty() && Anope::Match(buf2, access)) || (!buf3.empty() && Anope::Match(buf3, access))) return true; - } - } - delete [] buf; - if (ircd->vhost) - { - if (buf2) - delete [] buf2; - if (buf3) - delete [] buf3; } return false; } @@ -441,7 +376,7 @@ bool is_on_access(User *u, NickCore *nc) * it to the first alias in the list. */ -void change_core_display(NickCore *nc, const char *newdisplay) +void change_core_display(NickCore *nc, const Anope::string &newdisplay) { /* Log ... */ FOREACH_MOD(I_OnChangeCoreDisplay, OnChangeCoreDisplay(nc, newdisplay)); @@ -450,8 +385,7 @@ void change_core_display(NickCore *nc, const char *newdisplay) /* Remove the core from the list */ NickCoreList.erase(nc->display); - delete [] nc->display; - nc->display = sstrdup(newdisplay); + nc->display = newdisplay; NickCoreList[nc->display] = nc; } @@ -462,7 +396,7 @@ void change_core_display(NickCore *nc) if (nc->aliases.empty()) return; na = nc->aliases.front(); - change_core_display(nc,na->nick); + change_core_display(nc, na->nick); } /*************************************************************************/ diff --git a/src/operserv.cpp b/src/operserv.cpp index b97f66072..e91ad113b 100644 --- a/src/operserv.cpp +++ b/src/operserv.cpp @@ -22,7 +22,7 @@ Flags<ChannelModeName, CMODE_END> DefConModesOn; /* Defcon modes mlocked off */ Flags<ChannelModeName, CMODE_END> DefConModesOff; /* Map of Modesa and Params for DefCon */ -std::map<ChannelModeName, std::string> DefConModesOnParams; +std::map<ChannelModeName, Anope::string> DefConModesOnParams; XLineManager *SGLine, *SZLine, *SQLine, *SNLine; @@ -37,32 +37,32 @@ void os_init() XLineManager::RegisterXLineManager(SNLine = new SNLineManager()); } -void operserv(User *u, const std::string &buf) +void operserv(User *u, const Anope::string &buf) { if (!u || buf.empty()) return; Alog() << Config.s_OperServ << ": " << u->nick << ": " << buf; - if (buf.find("\1PING ", 0, 6) != std::string::npos && buf[buf.length() - 1] == '\1') + if (buf.substr(0, 6).equals_cs("\1PING ") && buf[buf.length() - 1] == '\1') { - std::string command = buf; + Anope::string command = buf; command.erase(command.begin()); command.erase(command.end()); - ircdproto->SendCTCP(OperServ, u->nick.c_str(), "%s", command.c_str()); + ircdproto->SendCTCP(OperServ, u->nick, "%s", command.c_str()); } else mod_run_cmd(OperServ, u, buf); } -bool SetDefConParam(ChannelModeName Name, std::string &buf) +bool SetDefConParam(ChannelModeName Name, const Anope::string &buf) { return DefConModesOnParams.insert(std::make_pair(Name, buf)).second; } -bool GetDefConParam(ChannelModeName Name, std::string &buf) +bool GetDefConParam(ChannelModeName Name, Anope::string &buf) { - std::map<ChannelModeName, std::string>::iterator it = DefConModesOnParams.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = DefConModesOnParams.find(Name); buf.clear(); @@ -77,7 +77,7 @@ bool GetDefConParam(ChannelModeName Name, std::string &buf) void UnsetDefConParam(ChannelModeName Name) { - std::map<ChannelModeName, std::string>::iterator it = DefConModesOnParams.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = DefConModesOnParams.find(Name); if (it != DefConModesOnParams.end()) DefConModesOnParams.erase(it); @@ -122,7 +122,7 @@ void DelDefCon(int level, DefconLevel Level) DefCon[level][Level] = false; } -void server_global(Server *s, const std::string &message) +void server_global(Server *s, const Anope::string &message) { /* Do not send the notice to ourselves our juped servers */ if (s != Me && !s->HasFlag(SERVER_JUPED)) @@ -135,7 +135,7 @@ void server_global(Server *s, const std::string &message) } } -void oper_global(char *nick, const char *fmt, ...) +void oper_global(const Anope::string &nick, const char *fmt, ...) { va_list args; char msg[2048]; /* largest valid message is 512, this should cover any global */ @@ -144,14 +144,13 @@ void oper_global(char *nick, const char *fmt, ...) vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); - if (nick && !Config.AnonymousGlobal) + if (!nick.empty() && !Config.AnonymousGlobal) { - std::string rmsg = std::string("[") + nick + std::string("] ") + msg; - server_global(Me->GetUplink(), rmsg.c_str()); + Anope::string rmsg = "[" + nick + "] " + msg; + server_global(Me->GetUplink(), rmsg); } else server_global(Me->GetUplink(), msg); - } /**************************************************************************/ @@ -159,42 +158,45 @@ void oper_global(char *nick, const char *fmt, ...) /* List of XLine managers we check users against in XLineManager::CheckAll */ std::list<XLineManager *> XLineManager::XLineManagers; -XLine::XLine(const ci::string &mask, const std::string &reason) : Mask(mask), Reason(reason) +XLine::XLine(const Anope::string &mask, const Anope::string &reason) : Mask(mask), Reason(reason) { Expires = Created = 0; } -XLine::XLine(const ci::string &mask, const ci::string &by, const time_t expires, const std::string &reason) : Mask(mask), By(by), Created(time(NULL)), Expires(expires), Reason(reason) +XLine::XLine(const Anope::string &mask, const Anope::string &by, const time_t expires, const Anope::string &reason) : Mask(mask), By(by), Created(time(NULL)), Expires(expires), Reason(reason) { } -ci::string XLine::GetNick() const +Anope::string XLine::GetNick() const { size_t nick_t = Mask.find('!'); - if (nick_t == ci::string::npos) + if (nick_t == Anope::string::npos) return ""; - return Mask.substr(0, nick_t - 1); + return Mask.substr(0, nick_t); } -ci::string XLine::GetUser() const +Anope::string XLine::GetUser() const { size_t user_t = Mask.find('!'), host_t = Mask.find('@'); - if (user_t == ci::string::npos) - return Mask.substr(0, host_t); - else if (host_t != ci::string::npos) - return Mask.substr((user_t != ci::string::npos ? user_t + 1 : 0), host_t); + if (host_t != Anope::string::npos) + { + if (user_t != Anope::string::npos) + return Mask.substr(user_t + 1, host_t - user_t - 1); + else + return Mask.substr(0, host_t); + } else return ""; } -ci::string XLine::GetHost() const +Anope::string XLine::GetHost() const { size_t host_t = Mask.find('@'); - if (host_t == ci::string::npos) + if (host_t == Anope::string::npos) return Mask; else return Mask.substr(host_t + 1); @@ -243,7 +245,7 @@ void XLineManager::UnregisterXLineManager(XLineManager *xlm) std::pair<XLineManager *, XLine *> XLineManager::CheckAll(User *u) { std::pair<XLineManager *, XLine *> ret; - + ret.first = NULL; ret.second = NULL; @@ -275,7 +277,7 @@ const size_t XLineManager::GetCount() const /** Get the XLine vector * @return The vecotr */ -const std::vector<XLine *>& XLineManager::GetList() const +const std::vector<XLine *> &XLineManager::GetList() const { return XLines; } @@ -336,7 +338,7 @@ void XLineManager::Clear() * @param reaosn The reason * @return A pointer to the XLine */ -XLine *XLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t expires, const std::string &reason) +XLine *XLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_t expires, const Anope::string &reason) { return NULL; } @@ -357,10 +359,10 @@ void XLineManager::Del(XLine *x) * 3 - Mask is already covered by another mask * In each case the XLine it matches/is covered by is returned in XLine* */ -std::pair<int, XLine *> XLineManager::CanAdd(const ci::string &mask, time_t expires) +std::pair<int, XLine *> XLineManager::CanAdd(const Anope::string &mask, time_t expires) { std::pair<int, XLine *> ret; - + ret.first = 0; ret.second = NULL; @@ -369,7 +371,7 @@ std::pair<int, XLine *> XLineManager::CanAdd(const ci::string &mask, time_t expi XLine *x = GetEntry(i); ret.second = x; - if (x->Mask == mask) + if (x->Mask.equals_ci(mask)) { if (!x->Expires || x->Expires >= expires) { @@ -403,13 +405,13 @@ std::pair<int, XLine *> XLineManager::CanAdd(const ci::string &mask, time_t expi * @param mask The mask * @return The XLine the user matches, or NULL */ -XLine *XLineManager::HasEntry(const ci::string &mask) const +XLine *XLineManager::HasEntry(const Anope::string &mask) const { for (unsigned i = 0, end = XLines.size(); i < end; ++i) { XLine *x = XLines[i]; - if (x->Mask == mask) + if (x->Mask.equals_ci(mask)) return x; } @@ -437,13 +439,13 @@ XLine *XLineManager::Check(User *u) continue; } - if (!x->GetNick().empty() && !Anope::Match(u->nick.c_str(), x->GetNick())) + if (!x->GetNick().empty() && !Anope::Match(u->nick, x->GetNick())) continue; - if (!x->GetUser().empty() && !Anope::Match(u->GetIdent().c_str(), x->GetUser())) + if (!x->GetUser().empty() && !Anope::Match(u->GetIdent(), x->GetUser())) continue; - if (x->GetHost().empty() || (u->hostip && Anope::Match(u->hostip, x->GetHost())) || Anope::Match(u->host, x->GetHost()) || (!u->chost.empty() && Anope::Match(u->chost.c_str(), x->GetHost())) || (u->vhost && Anope::Match(u->vhost, x->GetHost()))) + if (x->GetHost().empty() || (!u->hostip.empty() && Anope::Match(u->hostip, x->GetHost())) || Anope::Match(u->host, x->GetHost()) || (!u->chost.empty() && Anope::Match(u->chost, x->GetHost())) || (!u->vhost.empty() && Anope::Match(u->vhost, x->GetHost()))) { OnMatch(u, x); return x; @@ -468,26 +470,26 @@ void XLineManager::OnExpire(XLine *x) { } -XLine *SGLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t expires, const std::string &reason) +XLine *SGLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_t expires, const Anope::string &reason) { - if (mask.find('!') != ci::string::npos) + if (mask.find('!') != Anope::string::npos) { if (bi && u) - notice_lang(bi->nick.c_str(), u, OPER_AKILL_NO_NICK); + notice_lang(bi->nick, u, OPER_AKILL_NO_NICK); return NULL; } - if (mask.find('@') == ci::string::npos) + if (mask.find('@') == Anope::string::npos) { if (bi && u) - notice_lang(bi->nick.c_str(), u, BAD_USERHOST_MASK); + notice_lang(bi->nick, u, BAD_USERHOST_MASK); return NULL; } - if (strspn(mask.c_str(), "~@.*?") == mask.length()) + if (mask.find_first_not_of("~@.*?") == Anope::string::npos) { if (bi && u) - notice_lang(bi->nick.c_str(), u, USERHOST_MASK_TOO_WIDE, mask.c_str()); + notice_lang(bi->nick, u, USERHOST_MASK_TOO_WIDE, mask.c_str()); return NULL; } @@ -497,21 +499,21 @@ XLine *SGLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e if (bi && u) { if (canAdd.first == 1) - notice_lang(bi->nick.c_str(), u, OPER_AKILL_EXISTS, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_AKILL_EXISTS, canAdd.second->Mask.c_str()); else if (canAdd.first == 2) - notice_lang(bi->nick.c_str(), u, OPER_AKILL_CHANGED, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_AKILL_CHANGED, canAdd.second->Mask.c_str()); else if (canAdd.first == 3) - notice_lang(bi->nick.c_str(), u, OPER_AKILL_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_AKILL_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); } return canAdd.second; } - std::string realreason = reason; + Anope::string realreason = reason; if (u && Config.AddAkiller) realreason = "[" + u->nick + "]" + reason; - XLine *x = new XLine(mask, u ? u->nick.c_str() : "", expires, realreason); + XLine *x = new XLine(mask, u ? u->nick : "", expires, realreason); EventReturn MOD_RESULT; FOREACH_RESULT(I_OnAddAkill, OnAddAkill(u, x)); @@ -545,12 +547,12 @@ void SGLineManager::OnExpire(XLine *x) ircdproto->SendGlobops(OperServ, "AKILL on %s has expired", x->Mask.c_str()); } -XLine *SNLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t expires, const std::string &reason) +XLine *SNLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_t expires, const Anope::string &reason) { - if (!mask.empty() && strspn(mask.c_str(), "*?") == mask.length()) + if (!mask.empty() && mask.find_first_not_of("*?") == Anope::string::npos) { if (bi && u) - notice_lang(bi->nick.c_str(), u, USERHOST_MASK_TOO_WIDE, mask.c_str()); + notice_lang(bi->nick, u, USERHOST_MASK_TOO_WIDE, mask.c_str()); return NULL; } @@ -560,17 +562,17 @@ XLine *SNLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e if (bi && u) { if (canAdd.first == 1) - notice_lang(bi->nick.c_str(), u, OPER_SNLINE_EXISTS, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SNLINE_EXISTS, canAdd.second->Mask.c_str()); else if (canAdd.first == 2) - notice_lang(bi->nick.c_str(), u, OPER_SNLINE_CHANGED, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SNLINE_CHANGED, canAdd.second->Mask.c_str()); else if (canAdd.first == 3) - notice_lang(bi->nick.c_str(), u, OPER_SNLINE_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SNLINE_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); } return canAdd.second; } - XLine *x = new XLine(mask, u ? u->nick.c_str() : "", expires, reason); + XLine *x = new XLine(mask, u ? u->nick : "", expires, reason); EventReturn MOD_RESULT; FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, X_SNLINE)); @@ -584,7 +586,7 @@ XLine *SNLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e if (Config.KillonSNline && !ircd->sglineenforce) { - std::string rreason = "G-Lined: " + reason; + Anope::string rreason = "G-Lined: " + reason; for (user_map::const_iterator it = UserListByNick.begin(), it_end = UserListByNick.end(); it != it_end; ) { @@ -592,7 +594,7 @@ XLine *SNLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e ++it; if (!is_oper(user) && Anope::Match(user->realname, x->Mask)) - kill_user(Config.ServerName, user->nick, rreason.c_str()); + kill_user(Config.ServerName, user->nick, rreason); } } @@ -608,8 +610,8 @@ void SNLineManager::OnMatch(User *u, XLine *x) { ircdproto->SendSGLine(x); - std::string reason = "G-Lined: " + x->Reason; - kill_user(Config.s_OperServ, u->nick, reason.c_str()); + Anope::string reason = "G-Lined: " + x->Reason; + kill_user(Config.s_OperServ, u->nick, reason); } void SNLineManager::OnExpire(XLine *x) @@ -618,9 +620,9 @@ void SNLineManager::OnExpire(XLine *x) ircdproto->SendGlobops(OperServ, "SNLINE on \2%s\2 has expired", x->Mask.c_str()); } -XLine *SQLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t expires, const std::string &reason) +XLine *SQLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_t expires, const Anope::string &reason) { - if (strspn(mask.c_str(), "*") == mask.length()) + if (mask.find_first_not_of("*") == Anope::string::npos) { if (bi && u) notice_lang(Config.s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask.c_str()); @@ -640,17 +642,17 @@ XLine *SQLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e if (bi && u) { if (canAdd.first == 1) - notice_lang(bi->nick.c_str(), u, OPER_SQLINE_EXISTS, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SQLINE_EXISTS, canAdd.second->Mask.c_str()); else if (canAdd.first == 2) - notice_lang(bi->nick.c_str(), u, OPER_SQLINE_CHANGED, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SQLINE_CHANGED, canAdd.second->Mask.c_str()); else if (canAdd.first == 3) - notice_lang(bi->nick.c_str(), u, OPER_SQLINE_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SQLINE_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); } return canAdd.second; } - XLine *x = new XLine(mask, u ? u->nick.c_str() : "", expires, reason); + XLine *x = new XLine(mask, u ? u->nick : "", expires, reason); EventReturn MOD_RESULT; FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, X_SQLINE)); @@ -664,7 +666,7 @@ XLine *SQLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e if (Config.KillonSQline) { - std::string rreason = "Q-Lined: " + reason; + Anope::string rreason = "Q-Lined: " + reason; if (mask[0] == '#') { @@ -672,7 +674,7 @@ XLine *SQLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e { Channel *c = cit->second; - if (!Anope::Match(c->name.c_str(), mask)) + if (!Anope::Match(c->name, mask)) continue; for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; ) { @@ -692,8 +694,8 @@ XLine *SQLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e User *user = it->second; ++it; - if (!is_oper(user) && Anope::Match(user->nick.c_str(), x->Mask)) - kill_user(Config.ServerName, user->nick, rreason.c_str()); + if (!is_oper(user) && Anope::Match(user->nick, x->Mask)) + kill_user(Config.ServerName, user->nick, rreason); } } } @@ -712,8 +714,7 @@ void SQLineManager::OnMatch(User *u, XLine *x) { ircdproto->SendSQLine(x); - char reason[300]; - snprintf(reason, sizeof(reason), "Q-Lined: %s", x->Reason.c_str()); + Anope::string reason = "Q-Lined: " + x->Reason; kill_user(Config.s_OperServ, u->nick, reason); } @@ -731,7 +732,7 @@ bool SQLineManager::Check(Channel *c) { XLine *x = *it; - if (Anope::Match(c->name.c_str(), x->Mask)) + if (Anope::Match(c->name, x->Mask)) return true; } } @@ -739,15 +740,15 @@ bool SQLineManager::Check(Channel *c) return false; } -XLine *SZLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t expires, const std::string &reason) +XLine *SZLineManager::Add(BotInfo *bi, User *u, const Anope::string &mask, time_t expires, const Anope::string &reason) { - if (mask.find('!') != ci::string::npos || mask.find('@') != ci::string::npos) + if (mask.find('!') != Anope::string::npos || mask.find('@') != Anope::string::npos) { notice_lang(Config.s_OperServ, u, OPER_SZLINE_ONLY_IPS); return NULL; } - if (strspn(mask.c_str(), "*?") == mask.length()) + if (mask.find_first_not_of("*?") == Anope::string::npos) { notice_lang(Config.s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask.c_str()); return NULL; @@ -759,17 +760,17 @@ XLine *SZLineManager::Add(BotInfo *bi, User *u, const ci::string &mask, time_t e if (bi && u) { if (canAdd.first == 1) - notice_lang(bi->nick.c_str(), u, OPER_SZLINE_EXISTS, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SZLINE_EXISTS, canAdd.second->Mask.c_str()); else if (canAdd.first == 2) - notice_lang(bi->nick.c_str(), u, OPER_SZLINE_CHANGED, canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SZLINE_CHANGED, canAdd.second->Mask.c_str()); else if (canAdd.first == 3) - notice_lang(bi->nick.c_str(), u, OPER_SZLINE_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); + notice_lang(bi->nick, u, OPER_SZLINE_ALREADY_COVERED, mask.c_str(), canAdd.second->Mask.c_str()); } return canAdd.second; } - XLine *x = new XLine(mask, u ? u->nick.c_str() : "", expires, reason); + XLine *x = new XLine(mask, u ? u->nick : "", expires, reason); EventReturn MOD_RESULT; FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, X_SZLINE)); diff --git a/src/opertype.cpp b/src/opertype.cpp index 968163003..a4ea94dd3 100644 --- a/src/opertype.cpp +++ b/src/opertype.cpp @@ -7,13 +7,13 @@ #include "services.h" -OperType::OperType(const ci::string &nname) : name(nname) +OperType::OperType(const Anope::string &nname) : name(nname) { } -bool OperType::HasCommand(const ci::string &cmdstr) const +bool OperType::HasCommand(const Anope::string &cmdstr) const { - for (std::list<ci::string>::const_iterator it = this->commands.begin(), it_end = this->commands.end(); it != it_end; ++it) + for (std::list<Anope::string>::const_iterator it = this->commands.begin(), it_end = this->commands.end(); it != it_end; ++it) { if (Anope::Match(cmdstr, *it)) return true; @@ -29,9 +29,9 @@ bool OperType::HasCommand(const ci::string &cmdstr) const return false; } -bool OperType::HasPriv(const ci::string &privstr) const +bool OperType::HasPriv(const Anope::string &privstr) const { - for (std::list<ci::string>::const_iterator it = this->privs.begin(), it_end = this->privs.end(); it != it_end; ++it) + for (std::list<Anope::string>::const_iterator it = this->privs.begin(), it_end = this->privs.end(); it != it_end; ++it) { if (Anope::Match(privstr, *it)) return true; @@ -47,17 +47,17 @@ bool OperType::HasPriv(const ci::string &privstr) const return false; } -void OperType::AddCommand(const ci::string &cmdstr) +void OperType::AddCommand(const Anope::string &cmdstr) { this->commands.push_back(cmdstr); } -void OperType::AddPriv(const ci::string &privstr) +void OperType::AddPriv(const Anope::string &privstr) { this->privs.push_back(privstr); } -const ci::string &OperType::GetName() const +const Anope::string &OperType::GetName() const { return this->name; } diff --git a/src/process.cpp b/src/process.cpp index 07f1ff451..6ea72dcb6 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -27,48 +27,40 @@ IgnoreData *ignore; * @param nick Nick or (nick!)user@host to add to the ignorelist. * @param delta Seconds untill new entry is set to expire. 0 for permanent. */ -void add_ignore(const char *nick, time_t delta) +void add_ignore(const Anope::string &nick, time_t delta) { IgnoreData *ign; - char tmp[BUFSIZE]; - char *mask, *user, *host; + Anope::string tmp, mask; + size_t user, host; User *u; time_t now; - if (!nick) + if (nick.empty()) return; now = time(NULL); /* If it s an existing user, we ignore the hostmask. */ if ((u = finduser(nick))) - { - snprintf(tmp, sizeof(tmp), "*!*@%s", u->host); - mask = sstrdup(tmp); - } + mask = "*!*@" + u->host; /* Determine whether we get a nick or a mask. */ - else if ((host = const_cast<char *>(strchr(nick, '@')))) + else if ((host = nick.find('@')) != Anope::string::npos) { /* Check whether we have a nick too.. */ - if ((user = const_cast<char *>(strchr(nick, '!')))) + if ((user = nick.find('!')) != Anope::string::npos) { /* this should never happen */ if (user > host) return; - mask = sstrdup(nick); + mask = nick; } else - { /* We have user@host. Add nick wildcard. */ - snprintf(tmp, sizeof(tmp), "*!%s", nick); - mask = sstrdup(tmp); - } + mask = "*!" + nick; } /* We only got a nick.. */ - else { - snprintf(tmp, sizeof(tmp), "%s!*@*", nick); - mask = sstrdup(tmp); - } + else + mask = nick + "!*@*"; /* Check if we already got an identical entry. */ for (ign = ignore; ign; ign = ign->next) - if (!stricmp(ign->mask, mask)) + if (mask.equals_ci(ign->mask)) break; /* Found one.. */ if (ign) @@ -102,14 +94,14 @@ void add_ignore(const char *nick, time_t delta) * @param nick Nick or (nick!)user@host to look for on the ignorelist. * @return Pointer to the ignore record, NULL if none was found. */ -IgnoreData *get_ignore(const char *nick) +IgnoreData *get_ignore(const Anope::string &nick) { IgnoreData *ign; - char tmp[BUFSIZE]; - char *user, *host; + Anope::string tmp; + size_t user, host; time_t now; User *u; - if (!nick) + if (nick.empty()) return NULL; /* User has disabled the IGNORE system */ if (!allow_ignore) @@ -129,24 +121,24 @@ IgnoreData *get_ignore(const char *nick) else { /* We didn't get a user.. generate a valid mask. */ - if ((host = const_cast<char *>(strchr(nick, '@')))) + if ((host = nick.find('@')) != Anope::string::npos) { - if ((user = const_cast<char *>(strchr(nick, '!')))) + if ((user = nick.find('!')) != Anope::string::npos) { /* this should never happen */ if (user > host) return NULL; - snprintf(tmp, sizeof(tmp), "%s", nick); + tmp = nick; } else /* We have user@host. Add nick wildcard. */ - snprintf(tmp, sizeof(tmp), "*!%s", nick); + tmp = "*!" + nick; } /* We only got a nick.. */ else - snprintf(tmp, sizeof(tmp), "%s!*@*", nick); + tmp = nick + "!*@*"; for (ign = ignore; ign; ign = ign->next) - if (Anope::Match(tmp, ign->mask, false)) + if (Anope::Match(tmp, ign->mask)) break; } /* Check whether the entry has timed out */ @@ -159,7 +151,6 @@ IgnoreData *get_ignore(const char *nick) ignore = ign->next; if (ign->next) ign->next->prev = ign->prev; - delete [] ign->mask; delete ign; ign = NULL; } @@ -175,37 +166,37 @@ IgnoreData *get_ignore(const char *nick) * @param nick Nick or (nick!)user@host to delete from the ignorelist. * @return Returns 1 on success, 0 if no entry is found. */ -int delete_ignore(const char *nick) +int delete_ignore(const Anope::string &nick) { IgnoreData *ign; - char tmp[BUFSIZE]; - char *user, *host; + Anope::string tmp; + size_t user, host; User *u; - if (!nick) + if (nick.empty()) return 0; /* If it s an existing user, we ignore the hostmask. */ if ((u = finduser(nick))) - snprintf(tmp, sizeof(tmp), "*!*@%s", u->host); + tmp = "*!*@" + u->host; /* Determine whether we get a nick or a mask. */ - else if ((host = const_cast<char *>(strchr(nick, '@')))) + else if ((host = nick.find('@')) != Anope::string::npos) { /* Check whether we have a nick too.. */ - if ((user = const_cast<char *>(strchr(nick, '!')))) + if ((user = nick.find('!')) != Anope::string::npos) { /* this should never happen */ if (user > host) return 0; - snprintf(tmp, sizeof(tmp), "%s", nick); + tmp = nick; } else /* We have user@host. Add nick wildcard. */ - snprintf(tmp, sizeof(tmp), "*!%s", nick); + tmp = "*!" + nick; } /* We only got a nick.. */ else - snprintf(tmp, sizeof(tmp), "%s!*@*", nick); + tmp = nick + "!*@*"; for (ign = ignore; ign; ign = ign->next) - if (!stricmp(ign->mask, tmp)) + if (tmp.equals_ci(ign->mask)) break; /* No matching ignore found. */ if (!ign) @@ -218,7 +209,6 @@ int delete_ignore(const char *nick) ignore = ign->next; if (ign->next) ign->next->prev = ign->prev; - delete [] ign->mask; delete ign; ign = NULL; return 1; @@ -240,7 +230,6 @@ int clear_ignores() { next = ign->next; Alog(LOG_DEBUG) << "Deleting ignore entry " << ign->mask; - delete [] ign->mask; delete ign; ++i; } @@ -299,7 +288,7 @@ int split_buf(char *buf, const char ***argv, int colon_special) /* process: Main processing routine. Takes the string in inbuf (global * variable) and does something appropriate with it. */ -void process(const std::string &buffer) +void process(const Anope::string &buffer) { int retVal = 0; char source[64] = ""; diff --git a/src/protocol.cpp b/src/protocol.cpp index 13ff84a24..7bb21407b 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -1,6 +1,6 @@ #include "services.h" -void IRCDProto::SendMessageInternal(BotInfo *bi, const char *dest, const char *buf) +void IRCDProto::SendMessageInternal(BotInfo *bi, const Anope::string &dest, const Anope::string &buf) { if (Config.NSDefFlags.HasFlag(NI_MSG)) SendPrivmsgInternal(bi, dest, buf); @@ -8,50 +8,49 @@ void IRCDProto::SendMessageInternal(BotInfo *bi, const char *dest, const char *b SendNoticeInternal(bi, dest, buf); } -void IRCDProto::SendNoticeInternal(BotInfo *bi, const char *dest, const char *msg) +void IRCDProto::SendNoticeInternal(BotInfo *bi, const Anope::string &dest, const Anope::string &msg) { - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NOTICE %s :%s", dest, msg); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NOTICE %s :%s", dest.c_str(), msg.c_str()); } -void IRCDProto::SendPrivmsgInternal(BotInfo *bi, const char *dest, const char *buf) +void IRCDProto::SendPrivmsgInternal(BotInfo *bi, const Anope::string &dest, const Anope::string &buf) { - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PRIVMSG %s :%s", dest, buf); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PRIVMSG %s :%s", dest.c_str(), buf.c_str()); } -void IRCDProto::SendQuitInternal(BotInfo *bi, const char *buf) +void IRCDProto::SendQuitInternal(BotInfo *bi, const Anope::string &buf) { - if (buf) - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "QUIT :%s", buf); + if (!buf.empty()) + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "QUIT :%s", buf.c_str()); else send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "QUIT"); } -void IRCDProto::SendPartInternal(BotInfo *bi, Channel *chan, const char *buf) +void IRCDProto::SendPartInternal(BotInfo *bi, Channel *chan, const Anope::string &buf) { - if (buf) - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PART %s :%s", chan->name.c_str(), buf); + if (!buf.empty()) + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PART %s :%s", chan->name.c_str(), buf.c_str()); else send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PART %s", chan->name.c_str()); } -void IRCDProto::SendGlobopsInternal(BotInfo *source, const char *buf) +void IRCDProto::SendGlobopsInternal(BotInfo *source, const Anope::string &buf) { if (source) - send_cmd(ircd->ts6 ? source->GetUID() : source->nick, "GLOBOPS :%s", buf); + send_cmd(ircd->ts6 ? source->GetUID() : source->nick, "GLOBOPS :%s", buf.c_str()); else - send_cmd(Config.ServerName, "GLOBOPS :%s", buf); + send_cmd(Config.ServerName, "GLOBOPS :%s", buf.c_str()); } -void IRCDProto::SendCTCPInternal(BotInfo *bi, const char *dest, const char *buf) +void IRCDProto::SendCTCPInternal(BotInfo *bi, const Anope::string &dest, const Anope::string &buf) { - char *s = normalizeBuffer(buf); - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NOTICE %s :\1%s\1", dest, s); - delete [] s; + Anope::string s = normalizeBuffer(buf); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NOTICE %s :\1%s\1", dest.c_str(), s.c_str()); } -void IRCDProto::SendNumericInternal(const char *source, int numeric, const char *dest, const char *buf) +void IRCDProto::SendNumericInternal(const Anope::string &source, int numeric, const Anope::string &dest, const Anope::string &buf) { - send_cmd(source, "%03d %s %s", numeric, dest, buf); + send_cmd(source, "%03d %s %s", numeric, dest.c_str(), buf.c_str()); } void IRCDProto::SendSVSKill(BotInfo *source, User *user, const char *fmt, ...) @@ -110,7 +109,7 @@ void IRCDProto::SendNoticeChanops(BotInfo *bi, Channel *dest, const char *fmt, . SendNoticeChanopsInternal(bi, dest, buf); } -void IRCDProto::SendMessage(BotInfo *bi, const char *dest, const char *fmt, ...) +void IRCDProto::SendMessage(BotInfo *bi, const Anope::string &dest, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -120,7 +119,7 @@ void IRCDProto::SendMessage(BotInfo *bi, const char *dest, const char *fmt, ...) SendMessageInternal(bi, dest, buf); } -void IRCDProto::SendNotice(BotInfo *bi, const char *dest, const char *fmt, ...) +void IRCDProto::SendNotice(BotInfo *bi, const Anope::string &dest, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -130,18 +129,18 @@ void IRCDProto::SendNotice(BotInfo *bi, const char *dest, const char *fmt, ...) SendNoticeInternal(bi, dest, buf); } -void IRCDProto::SendAction(BotInfo *bi, const char *dest, const char *fmt, ...) +void IRCDProto::SendAction(BotInfo *bi, const Anope::string &dest, const char *fmt, ...) { va_list args; - char buf[BUFSIZE] = "", actionbuf[BUFSIZE] = ""; + char buf[BUFSIZE] = ""; va_start(args, fmt); vsnprintf(buf, BUFSIZE - 1, fmt, args); va_end(args); - snprintf(actionbuf, BUFSIZE - 1, "%cACTION %s%c", 1, buf, 1); + Anope::string actionbuf = Anope::string("\1ACTION ") + buf + '\1'; SendPrivmsgInternal(bi, dest, actionbuf); } -void IRCDProto::SendPrivmsg(BotInfo *bi, const char *dest, const char *fmt, ...) +void IRCDProto::SendPrivmsg(BotInfo *bi, const Anope::string &dest, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -151,17 +150,17 @@ void IRCDProto::SendPrivmsg(BotInfo *bi, const char *dest, const char *fmt, ...) SendPrivmsgInternal(bi, dest, buf); } -void IRCDProto::SendGlobalNotice(BotInfo *bi, Server *dest, const char *msg) +void IRCDProto::SendGlobalNotice(BotInfo *bi, Server *dest, const Anope::string &msg) { - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NOTICE %s%s :%s", ircd->globaltldprefix, dest->GetName().c_str(), msg); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NOTICE %s%s :%s", ircd->globaltldprefix, dest->GetName().c_str(), msg.c_str()); } -void IRCDProto::SendGlobalPrivmsg(BotInfo *bi, Server *dest, const char *msg) +void IRCDProto::SendGlobalPrivmsg(BotInfo *bi, Server *dest, const Anope::string &msg) { - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PRIVMSG %s%s :%s", ircd->globaltldprefix, dest->GetName().c_str(), msg); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "PRIVMSG %s%s :%s", ircd->globaltldprefix, dest->GetName().c_str(), msg.c_str()); } -void IRCDProto::SendQuit(const char *nick, const char *) +void IRCDProto::SendQuit(const Anope::string &nick, const Anope::string &) { send_cmd(nick, "QUIT"); } @@ -176,12 +175,12 @@ void IRCDProto::SendQuit(BotInfo *bi, const char *fmt, ...) SendQuitInternal(bi, buf); } -void IRCDProto::SendPing(const char *servname, const char *who) +void IRCDProto::SendPing(const Anope::string &servname, const Anope::string &who) { - if (!servname) - send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PING %s", who); + if (servname.empty()) + send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PING %s", who.c_str()); else - send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PING %s %s", servname, who); + send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PING %s %s", servname.c_str(), who.c_str()); } /** @@ -190,17 +189,17 @@ void IRCDProto::SendPing(const char *servname, const char *who) * @param servname Daemon or client that is responding to the PING. * @param who Origin of the PING and destination of the PONG message. **/ -void IRCDProto::SendPong(const char *servname, const char *who) +void IRCDProto::SendPong(const Anope::string &servname, const Anope::string &who) { - if (!servname) - send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PONG %s", who); - else - send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PONG %s %s", servname, who); + if (servname.empty()) + send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PONG %s", who.c_str()); + else + send_cmd(ircd->ts6 ? TS6SID : Config.ServerName, "PONG %s %s", servname.c_str(), who.c_str()); } -void IRCDProto::SendInvite(BotInfo *bi, const char *chan, const char *nick) +void IRCDProto::SendInvite(BotInfo *bi, const Anope::string &chan, const Anope::string &nick) { - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "INVITE %s %s", nick, chan); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "INVITE %s %s", nick.c_str(), chan.c_str()); } void IRCDProto::SendPart(BotInfo *bi, Channel *chan, const char *fmt, ...) @@ -214,7 +213,8 @@ void IRCDProto::SendPart(BotInfo *bi, Channel *chan, const char *fmt, ...) va_end(args); SendPartInternal(bi, chan, buf); } - else SendPartInternal(bi, chan, NULL); + else + SendPartInternal(bi, chan, ""); } void IRCDProto::SendGlobops(BotInfo *source, const char *fmt, ...) @@ -227,21 +227,22 @@ void IRCDProto::SendGlobops(BotInfo *source, const char *fmt, ...) SendGlobopsInternal(source, buf); } -void IRCDProto::SendSquit(const char *servname, const char *message) +void IRCDProto::SendSquit(const Anope::string &servname, const Anope::string &message) { - send_cmd(NULL, "SQUIT %s :%s", servname, message); + send_cmd("", "SQUIT %s :%s", servname.c_str(), message.c_str()); } -void IRCDProto::SendChangeBotNick(BotInfo *bi, const char *newnick) +void IRCDProto::SendChangeBotNick(BotInfo *bi, const Anope::string &newnick) { - send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NICK %s %ld", newnick, static_cast<long>(time(NULL))); + send_cmd(ircd->ts6 ? bi->GetUID() : bi->nick, "NICK %s %ld", newnick.c_str(), static_cast<long>(time(NULL))); } -void IRCDProto::SendForceNickChange(User *u, const char *newnick, time_t when) + +void IRCDProto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when) { - send_cmd(NULL, "SVSNICK %s %s :%ld", u->nick.c_str(), newnick, static_cast<long>(when)); + send_cmd("", "SVSNICK %s %s :%ld", u->nick.c_str(), newnick.c_str(), static_cast<long>(when)); } -void IRCDProto::SendCTCP(BotInfo *bi, const char *dest, const char *fmt, ...) +void IRCDProto::SendCTCP(BotInfo *bi, const Anope::string &dest, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -251,7 +252,7 @@ void IRCDProto::SendCTCP(BotInfo *bi, const char *dest, const char *fmt, ...) SendCTCPInternal(bi, dest, buf); } -void IRCDProto::SendNumeric(const char *source, int numeric, const char *dest, const char *fmt, ...) +void IRCDProto::SendNumeric(const Anope::string &source, int numeric, const Anope::string &dest, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -261,10 +262,10 @@ void IRCDProto::SendNumeric(const char *source, int numeric, const char *dest, c SendNumericInternal(source, numeric, dest, buf); } -int IRCDProto::IsChannelValid(const char *chan) +bool IRCDProto::IsChannelValid(const Anope::string &chan) { - if (*chan != '#') - return 0; + if (chan[0] != '#') + return false; - return 1; + return true; } diff --git a/src/regchannel.cpp b/src/regchannel.cpp index 4670bc109..d596b6bb6 100644 --- a/src/regchannel.cpp +++ b/src/regchannel.cpp @@ -16,16 +16,14 @@ /** Default constructor * @param chname The channel name */ -ChannelInfo::ChannelInfo(const std::string &chname) +ChannelInfo::ChannelInfo(const Anope::string &chname) { if (chname.empty()) throw CoreException("Empty channel passed to ChannelInfo constructor"); founder = successor = NULL; - desc = last_topic = forbidby = forbidreason = NULL; last_topic_time = 0; levels = NULL; - entry_message = NULL; c = NULL; capsmin = capspercent = 0; floodlines = floodsecs = 0; @@ -59,7 +57,7 @@ ChannelInfo::ChannelInfo(const std::string &chname) reset_levels(this); - RegisteredChannelList[this->name.c_str()] = this; + RegisteredChannelList[this->name] = this; } /** Default destructor, cleans up the channel complete and removes it from the internal list @@ -79,19 +77,8 @@ ChannelInfo::~ChannelInfo() this->c->ci = NULL; } - RegisteredChannelList.erase(this->name.c_str()); + RegisteredChannelList.erase(this->name); - if (this->desc) - delete [] this->desc; - if (this->entry_message) - delete [] this->entry_message; - - if (this->last_topic) - delete [] this->last_topic; - if (this->forbidby) - delete [] this->forbidby; - if (this->forbidreason) - delete [] this->forbidreason; this->ClearAccess(); this->ClearAkick(); this->ClearBadWords(); @@ -101,11 +88,7 @@ ChannelInfo::~ChannelInfo() if (!this->memos.memos.empty()) { for (i = 0, end = this->memos.memos.size(); i < end; ++i) - { - if (this->memos.memos[i]->text) - delete [] this->memos.memos[i]->text; delete this->memos.memos[i]; - } this->memos.memos.clear(); } @@ -126,7 +109,7 @@ ChannelInfo::~ChannelInfo() * Creates a new access list entry and inserts it into the access list. */ -void ChannelInfo::AddAccess(NickCore *nc, int16 level, const std::string &creator, int32 last_seen) +void ChannelInfo::AddAccess(NickCore *nc, int16 level, const Anope::string &creator, int32 last_seen) { ChanAccess *new_access = new ChanAccess(); new_access->nc = nc; @@ -164,7 +147,7 @@ ChanAccess *ChannelInfo::GetAccess(unsigned index) * Retrieves an entry from the access list that matches the given NickCore, optionally also matching a certain level. */ -ChanAccess *ChannelInfo::GetAccess(NickCore *nc, int16 level) +ChanAccess *ChannelInfo::GetAccess(const NickCore *nc, int16 level) { if (access.empty()) return NULL; @@ -184,7 +167,6 @@ const unsigned ChannelInfo::GetAccessCount() const return access.empty() ? 0 : access.size(); } - /** Erase an entry from the channel access list * * @param index The index in the access list vector @@ -217,7 +199,7 @@ void ChannelInfo::ClearAccess() * @param lu The time the akick was last used, defaults to never * @return The AutoKick structure */ -AutoKick *ChannelInfo::AddAkick(const std::string &user, NickCore *akicknc, const std::string &reason, time_t t, time_t lu) +AutoKick *ChannelInfo::AddAkick(const Anope::string &user, NickCore *akicknc, const Anope::string &reason, time_t t, time_t lu) { if (!akicknc) return NULL; @@ -243,7 +225,7 @@ AutoKick *ChannelInfo::AddAkick(const std::string &user, NickCore *akicknc, cons * @param lu The time the akick was last used, defaults to never * @return The AutoKick structure */ -AutoKick *ChannelInfo::AddAkick(const std::string &user, const std::string &mask, const std::string &reason, time_t t, time_t lu) +AutoKick *ChannelInfo::AddAkick(const Anope::string &user, const Anope::string &mask, const Anope::string &reason, time_t t, time_t lu) { AutoKick *autokick = new AutoKick(); autokick->mask = mask; @@ -302,7 +284,7 @@ void ChannelInfo::ClearAkick() * @param type The type (SINGLE START END) * @return The badword */ -BadWord *ChannelInfo::AddBadWord(const std::string &word, BadWordType type) +BadWord *ChannelInfo::AddBadWord(const Anope::string &word, BadWordType type) { BadWord *bw = new BadWord; bw->word = word; @@ -360,11 +342,11 @@ void ChannelInfo::ClearBadWords() */ void ChannelInfo::LoadMLock() { - std::vector<std::string> modenames; + std::vector<Anope::string> modenames; if (this->GetExtRegular("db_mlock_modes_on", modenames)) { - for (std::vector<std::string>::iterator it = modenames.begin(), it_end = modenames.end(); it != it_end; ++it) + for (std::vector<Anope::string>::iterator it = modenames.begin(), it_end = modenames.end(); it != it_end; ++it) { for (std::list<Mode *>::iterator mit = ModeManager::Modes.begin(), mit_end = ModeManager::Modes.end(); mit != mit_end; ++mit) { @@ -372,7 +354,7 @@ void ChannelInfo::LoadMLock() { ChannelMode *cm = dynamic_cast<ChannelMode *>(*mit); - if (cm->NameAsString == *it) + if (cm->NameAsString.equals_ci(*it)) this->SetMLock(cm->Name, true); } } @@ -383,7 +365,7 @@ void ChannelInfo::LoadMLock() if (this->GetExtRegular("db_mlock_modes_off", modenames)) { - for (std::vector<std::string>::iterator it = modenames.begin(), it_end = modenames.end(); it != it_end; ++it) + for (std::vector<Anope::string>::iterator it = modenames.begin(), it_end = modenames.end(); it != it_end; ++it) { for (std::list<Mode *>::iterator mit = ModeManager::Modes.begin(), mit_end = ModeManager::Modes.end(); mit != mit_end; ++mit) { @@ -391,7 +373,7 @@ void ChannelInfo::LoadMLock() { ChannelMode *cm = dynamic_cast<ChannelMode *>(*mit); - if (cm->NameAsString == *it) + if (cm->NameAsString.equals_ci(*it)) this->SetMLock(cm->Name, false); } } @@ -400,11 +382,11 @@ void ChannelInfo::LoadMLock() this->Shrink("db_mlock_modes_off"); } - std::vector<std::pair<std::string, std::string> > params; + std::vector<std::pair<Anope::string, Anope::string> > params; if (this->GetExtRegular("db_mlp", params)) { - for (std::vector<std::pair<std::string, std::string> >::iterator it = params.begin(), it_end = params.end(); it != it_end; ++it) + for (std::vector<std::pair<Anope::string, Anope::string> >::iterator it = params.begin(), it_end = params.end(); it != it_end; ++it) { for (std::list<Mode *>::iterator mit = ModeManager::Modes.begin(), mit_end = ModeManager::Modes.end(); mit != mit_end; ++mit) { @@ -412,7 +394,7 @@ void ChannelInfo::LoadMLock() { ChannelMode *cm = dynamic_cast<ChannelMode *>(*mit); - if (cm->NameAsString == it->first) + if (cm->NameAsString.equals_ci(it->first)) this->SetMLock(cm->Name, true, it->second); } } @@ -441,7 +423,7 @@ const bool ChannelInfo::HasMLock(ChannelModeName Name, bool status) * @param param The param to use for this mode, if required * @return true on success, false on failure (module blocking) */ -bool ChannelInfo::SetMLock(ChannelModeName Name, bool status, const std::string param) +bool ChannelInfo::SetMLock(ChannelModeName Name, bool status, const Anope::string ¶m) { if (!status && !param.empty()) throw CoreException("Was told to mlock a mode negatively with a param?"); @@ -455,7 +437,7 @@ bool ChannelInfo::SetMLock(ChannelModeName Name, bool status, const std::string mlock_on.UnsetFlag(Name); mlock_off.UnsetFlag(Name); - std::map<ChannelModeName, std::string>::iterator it = Params.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(Name); if (it != Params.end()) Params.erase(it); @@ -484,7 +466,7 @@ bool ChannelInfo::RemoveMLock(ChannelModeName Name) mlock_on.UnsetFlag(Name); mlock_off.UnsetFlag(Name); - std::map<ChannelModeName, std::string>::iterator it = Params.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(Name); if (it != Params.end()) Params.erase(it); @@ -516,9 +498,9 @@ const size_t ChannelInfo::GetMLockCount(bool status) const * @param Target a string to put the param into * @return true on success */ -const bool ChannelInfo::GetParam(ChannelModeName Name, std::string &Target) +const bool ChannelInfo::GetParam(ChannelModeName Name, Anope::string &Target) { - std::map<ChannelModeName, std::string>::iterator it = Params.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(Name); Target.clear(); @@ -536,7 +518,7 @@ const bool ChannelInfo::GetParam(ChannelModeName Name, std::string &Target) */ const bool ChannelInfo::HasParam(ChannelModeName Name) { - std::map<ChannelModeName, std::string>::iterator it = Params.find(Name); + std::map<ChannelModeName, Anope::string>::iterator it = Params.find(Name); if (it != Params.end()) return true; @@ -559,9 +541,9 @@ bool ChannelInfo::CheckKick(User *user) { AutoKick *autokick; bool set_modes = false, do_kick = false; - NickCore *nc; - char mask[BUFSIZE]; - const char *reason; + const NickCore *nc; + Anope::string mask; + Anope::string reason; if (!user || !this->c) return false; @@ -582,8 +564,8 @@ bool ChannelInfo::CheckKick(User *user) if (!is_oper(user) && (this->HasFlag(CI_SUSPENDED) || this->HasFlag(CI_FORBIDDEN))) { - get_idealban(this, user, mask, sizeof(mask)); - reason = this->forbidreason ? this->forbidreason : getstring(user, CHAN_MAY_NOT_BE_USED); + get_idealban(this, user, mask); + reason = !this->forbidreason.empty() ? this->forbidreason : getstring(user, CHAN_MAY_NOT_BE_USED); set_modes = true; do_kick = true; } @@ -602,15 +584,15 @@ bool ChannelInfo::CheckKick(User *user) { autokick = this->GetAkick(j); - if ((autokick->HasFlag(AK_ISNICK) && autokick->nc == nc) || (!autokick->HasFlag(AK_ISNICK) && match_usermask(autokick->mask.c_str(), user))) + if ((autokick->HasFlag(AK_ISNICK) && autokick->nc == nc) || (!autokick->HasFlag(AK_ISNICK) && match_usermask(autokick->mask, user))) { Alog(LOG_DEBUG_2) << user->nick << " matched akick " << (autokick->HasFlag(AK_ISNICK) ? autokick->nc->display : autokick->mask); autokick->last_used = time(NULL); if (autokick->HasFlag(AK_ISNICK)) - get_idealban(this, user, mask, sizeof(mask)); + get_idealban(this, user, mask); else - strlcpy(mask, autokick->mask.c_str(), sizeof(mask)); - reason = !autokick->reason.empty() ? autokick->reason.c_str() : Config.CSAutokickReason; + mask = autokick->mask; + reason = !autokick->reason.empty() ? autokick->reason : Config.CSAutokickReason; do_kick = true; break; } @@ -619,7 +601,7 @@ bool ChannelInfo::CheckKick(User *user) if (!do_kick && check_access(user, this, CA_NOJOIN)) { - get_idealban(this, user, mask, sizeof(mask)); + get_idealban(this, user, mask); reason = getstring(user, CHAN_NOT_ALLOWED_TO_JOIN); do_kick = true; } @@ -653,7 +635,7 @@ bool ChannelInfo::CheckKick(User *user) } this->c->SetMode(NULL, CMODE_BAN, mask); - this->c->Kick(NULL, user, "%s", reason); + this->c->Kick(NULL, user, "%s", reason.c_str()); return true; } diff --git a/src/send.cpp b/src/send.cpp index 430c7f919..f04e937c2 100644 --- a/src/send.cpp +++ b/src/send.cpp @@ -21,42 +21,7 @@ * @param ... any number of parameters * @return void */ -void send_cmd(const char *source, const char *fmt, ...) -{ - va_list args; - static char buf[BUFSIZE]; - - va_start(args, fmt); - - vsnprintf(buf, BUFSIZE - 1, fmt, args); - - if (!UplinkSock) - { - if (source) - Alog(LOG_DEBUG) << "Attemtped to send \"" << source << " " << buf << "\" with UplinkSock NULL"; - else - Alog(LOG_DEBUG) << "Attemtped to send \"" << buf << "\" with UplinkSock NULL"; - return; - } - - if (source) - { - UplinkSock->Write(":%s %s", source, buf); - Alog(LOG_DEBUG) << "Sent: :" << source << " " << buf; - } - else - { - UplinkSock->Write("%s", buf); - Alog(LOG_DEBUG) << "Sent: "<< buf; - } - - va_end(args); -} - -/* - * Copypasta version that accepts std::string source. - */ -void send_cmd(const std::string &source, const char *fmt, ...) +void send_cmd(const Anope::string &source, const char *fmt, ...) { va_list args; static char buf[BUFSIZE]; @@ -70,7 +35,7 @@ void send_cmd(const std::string &source, const char *fmt, ...) if (!source.empty()) Alog(LOG_DEBUG) << "Attemtped to send \"" << source << " " << buf << "\" with UplinkSock NULL"; else - Alog(LOG_DEBUG) << "Attemtped to send " << buf << "\" with UplinkSock NULL"; + Alog(LOG_DEBUG) << "Attemtped to send \"" << buf << "\" with UplinkSock NULL"; return; } @@ -82,7 +47,7 @@ void send_cmd(const std::string &source, const char *fmt, ...) else { UplinkSock->Write("%s", buf); - Alog(LOG_DEBUG) << "Sent: " << buf; + Alog(LOG_DEBUG) << "Sent: "<< buf; } va_end(args); @@ -98,7 +63,7 @@ void send_cmd(const std::string &source, const char *fmt, ...) * @param ... any number of parameters * @return void */ -void notice_server(char *source, Server * s, const char *fmt, ...) +void notice_server(const Anope::string &source, Server *s, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -119,32 +84,6 @@ void notice_server(char *source, Server * s, const char *fmt, ...) /*************************************************************************/ /** - * Send a NULL-terminated array of text as NOTICEs. - * @param source Orgin of the Message - * @param dest Destination of the Notice - * @param text Array of text to send - * @return void - */ -void notice_list(char *source, char *dest, char **text) -{ - User *u = finduser(dest); - while (*text) - { - /* Have to kludge around an ircII bug here: if a notice includes - * no text, it is ignored, so we replace blank lines by lines - * with a single space. - */ - if (**text) - u->SendMessage(source, "%s", *text); - else - u->SendMessage(source, " "); - ++text; - } -} - -/*************************************************************************/ - -/** * Send a message in the user's selected language to the user using NOTICE. * @param source Orgin of the Message * @param u User Struct @@ -152,7 +91,7 @@ void notice_list(char *source, char *dest, char **text) * @param ... any number of parameters * @return void */ -void notice_lang(const std::string &source, User * dest, int message, ...) +void notice_lang(const Anope::string &source, User *dest, int message, ...) { va_list args; char buf[4096]; /* because messages can be really big */ @@ -193,7 +132,7 @@ void notice_lang(const std::string &source, User * dest, int message, ...) * @param ... any number of parameters * @return void */ -void notice_help(const char *source, User * dest, int message, ...) +void notice_help(const Anope::string &source, User * dest, int message, ...) { va_list args; char buf[4096], buf2[4096], outbuf[BUFSIZE]; @@ -220,7 +159,7 @@ void notice_help(const char *source, User * dest, int message, ...) if (*s) *s++ = 0; strscpy(outbuf, t, sizeof(outbuf)); - strnrepl(outbuf, sizeof(outbuf), "\1\1", source); + strnrepl(outbuf, sizeof(outbuf), "\1\1", source.c_str()); dest->SendMessage(source, "%s", *outbuf ? outbuf : " "); } diff --git a/src/servers.cpp b/src/servers.cpp index 69562e9c2..251e594ea 100644 --- a/src/servers.cpp +++ b/src/servers.cpp @@ -12,7 +12,7 @@ #include "services.h" #include "modules.h" -char *TS6SID = NULL; +Anope::string TS6SID; /* Anope */ Server *Me = NULL; @@ -56,7 +56,7 @@ Flags<CapabType, CAPAB_END> Capab; * @param description Server rdescription * @param sid Server sid/numeric */ -Server::Server(Server *uplink, const std::string &name, unsigned int hops, const std::string &description, const std::string &sid) : Name(name), Hops(hops), Description(description), SID(sid), UplinkServer(uplink) +Server::Server(Server *uplink, const Anope::string &name, unsigned int hops, const Anope::string &description, const Anope::string &sid) : Name(name), Hops(hops), Description(description), SID(sid), UplinkServer(uplink) { Links = NULL; @@ -103,9 +103,7 @@ Server::~Server() if (na && !na->HasFlag(NS_FORBIDDEN) && (!na->nc->HasFlag(NI_SUSPENDED)) && (u->IsRecognized() || u->IsIdentified())) { na->last_seen = t; - if (na->last_quit) - delete [] na->last_quit; - na->last_quit = (!QReason.empty() ? sstrdup(QReason.c_str()) : NULL); + na->last_quit = QReason; } delete u; @@ -116,15 +114,11 @@ Server::~Server() } if (UplinkServer) - { UplinkServer->DelLink(this); - } if (Links) - { for (std::list<Server *>::iterator it = Links->begin(), it_end = Links->end(); it != it_end; ++it) delete *it; - } delete Links; } @@ -132,7 +126,7 @@ Server::~Server() /** Delete this server with a reason * @param reason The reason */ -void Server::Delete(const std::string &reason) +void Server::Delete(const Anope::string &reason) { QReason = reason; delete this; @@ -141,7 +135,7 @@ void Server::Delete(const std::string &reason) /** Get the name for this server * @return The name */ -const std::string &Server::GetName() const +const Anope::string &Server::GetName() const { return Name; } @@ -157,7 +151,7 @@ unsigned int Server::GetHops() const /** Set the server description * @param desc The new description */ -void Server::SetDescription(const std::string &desc) +void Server::SetDescription(const Anope::string &desc) { Description = desc; } @@ -165,7 +159,7 @@ void Server::SetDescription(const std::string &desc) /** Get the server description * @return The server description */ -const std::string &Server::GetDescription() const +const Anope::string &Server::GetDescription() const { return Description; } @@ -173,7 +167,7 @@ const std::string &Server::GetDescription() const /** Get the server numeric/SID * @return The numeric/SID */ -const std::string &Server::GetSID() const +const Anope::string &Server::GetSID() const { return SID; } @@ -204,7 +198,7 @@ void Server::AddLink(Server *s) */ if (this == Me && !UplinkServer) UplinkServer = s; - + if (!Links) Links = new std::list<Server *>(); @@ -286,8 +280,8 @@ bool Server::IsSynced() const */ bool Server::IsULined() const { - for (int j = 0; j < Config.NumUlines; ++j) - if (!stricmp(Config.Ulines[j], GetName().c_str())) + for (std::list<Anope::string>::const_iterator it = Config.Ulines.begin(), it_end = Config.Ulines.end(); it != it_end; ++it) + if (it->equals_ci(GetName())) return true; return false; } @@ -297,13 +291,13 @@ bool Server::IsULined() const * @param s The server list to search for this server on, defaults to our Uplink * @return The server */ -Server *Server::Find(const std::string &name, Server *s) +Server *Server::Find(const Anope::string &name, Server *s) { Alog(LOG_DEBUG) << "Server::Find called for " << name; if (!s) s = Me; - if (s->GetName() == name || s->GetSID() == name) + if (s->GetName().equals_cs(name) || s->GetSID().equals_cs(name)) return s; if (s->GetLinks()) @@ -312,7 +306,7 @@ Server *Server::Find(const std::string &name, Server *s) { Server *serv = *it; - if (serv->GetName() == name || serv->GetSID() == name) + if (serv->GetName().equals_cs(name) || serv->GetSID().equals_cs(name)) return serv; Alog(LOG_DEBUG) << "Server::Find checking " << serv->GetName() << " server tree for " << name; Server *server = Server::Find(name, serv); @@ -335,7 +329,7 @@ Server *Server::Find(const std::string &name, Server *s) * @param numeric Server Numberic/SUID * @return void */ -void do_server(const std::string &source, const std::string &servername, unsigned int hops, const std::string &descript, const std::string &numeric) +void do_server(const Anope::string &source, const Anope::string &servername, unsigned int hops, const Anope::string &descript, const Anope::string &numeric) { if (source.empty()) Alog(LOG_DEBUG) << "Server " << servername << " introduced"; @@ -358,8 +352,8 @@ void do_server(const std::string &source, const std::string &servername, unsigne Server *newserver = new Server(s, servername, hops, descript, numeric); /* Announce services being online. */ - if (Config.GlobalOnCycle && Config.GlobalOnCycleUP) - notice_server(Config.s_GlobalNoticer, newserver, "%s", Config.GlobalOnCycleUP); + if (Config.GlobalOnCycle && !Config.GlobalOnCycleUP.empty()) + notice_server(Config.s_GlobalNoticer, newserver, "%s", Config.GlobalOnCycleUP.c_str()); /* Let modules know about the connection */ FOREACH_MOD(I_OnNewServer, OnNewServer(newserver)); @@ -374,9 +368,8 @@ void do_server(const std::string &source, const std::string &servername, unsigne * @param av Agruments as part of the SQUIT * @return void */ -void do_squit(const char *source, int ac, const char **av) +void do_squit(const Anope::string &source, int ac, const char **av) { - char buf[BUFSIZE]; Server *s = Server::Find(av[0]); if (!s) @@ -387,22 +380,23 @@ void do_squit(const char *source, int ac, const char **av) FOREACH_MOD(I_OnServerQuit, OnServerQuit(s)); + Anope::string buf; /* If this is a juped server, send a nice global to inform the online * opers that we received it. */ if (s->HasFlag(SERVER_JUPED)) { - snprintf(buf, BUFSIZE, "Received SQUIT for juped server %s", s->GetName().c_str()); - ircdproto->SendGlobops(OperServ, buf); + buf = "Received SQUIT for juped server " + s->GetName(); + ircdproto->SendGlobops(OperServ, "%s", buf.c_str()); } - snprintf(buf, sizeof(buf), "%s %s", s->GetName().c_str(), s->GetUplink()->GetName().c_str()); + buf = s->GetName() + " " + s->GetUplink()->GetName(); if (s->GetUplink() == Me->GetUplink() && Capab.HasFlag(CAPAB_UNCONNECT)) { Alog(LOG_DEBUG) << "Sending UNCONNECT SQUIT for " << s->GetName(); /* need to fix */ - ircdproto->SendSquit(s->GetName().c_str(), buf); + ircdproto->SendSquit(s->GetName(), buf); } s->Delete(buf); @@ -420,11 +414,11 @@ void CapabParse(int ac, const char **av) { for (unsigned j = 0; !Capab_Info[j].Token.empty(); ++j) { - if (av[i] == Capab_Info[j].Token) + if (Capab_Info[j].Token.equals_ci(av[i])) { Capab.SetFlag(Capab_Info[j].Flag); - if (Capab_Info[j].Token == "NICKIP" && !ircd->nickip) + if (Capab_Info[j].Token.equals_ci("NICKIP") && !ircd->nickip) ircd->nickip = 1; break; } @@ -452,7 +446,7 @@ static char ts6_new_uid[10]; static void ts6_uid_increment(unsigned int slot) { - if (slot != strlen(TS6SID)) + if (slot != TS6SID.length()) { if (ts6_new_uid[slot] == 'Z') ts6_new_uid[slot] = '0'; @@ -487,7 +481,7 @@ const char *ts6_uid_retrieve() if (!ts6_uid_initted) { - snprintf(ts6_new_uid, 10, "%sAAAAAA", TS6SID); + snprintf(ts6_new_uid, 10, "%sAAAAAA", TS6SID.c_str()); ts6_uid_initted = true; } @@ -554,7 +548,7 @@ const char *ts6_sid_retrieve() if (!ts6_sid_initted) { // Initialize ts6_new_sid with the services server SID - snprintf(ts6_new_sid, 4, "%s", TS6SID); + snprintf(ts6_new_sid, 4, "%s", TS6SID.c_str()); ts6_sid_initted = true; } diff --git a/src/sessions.cpp b/src/sessions.cpp index 9c8ec7163..9a1bc7a76 100644 --- a/src/sessions.cpp +++ b/src/sessions.cpp @@ -51,8 +51,7 @@ session_map SessionList; -Exception *exceptions = NULL; -int16 nexceptions = 0; +std::vector<Exception *> exceptions; /*************************************************************************/ /****************************** Statistics *******************************/ @@ -66,7 +65,7 @@ void get_session_stats(long *nrec, long *memuse) { Session *session = it->second; - mem += strlen(session->host) + 1; + mem += session->host.length() + 1; } *memuse = mem; @@ -76,15 +75,19 @@ void get_session_stats(long *nrec, long *memuse) void get_exception_stats(long *nrec, long *memuse) { long mem; - int i; - mem = sizeof(Exception) * nexceptions; - for (i = 0; i < nexceptions; ++i) + mem = sizeof(Exception) * exceptions.size(); + for (std::vector<Exception *>::const_iterator it = exceptions.begin(), it_end = exceptions.end(); it != it_end; ++it) { - mem += strlen(exceptions[i].mask) + 1; - mem += strlen(exceptions[i].reason) + 1; + Exception *e = *it; + if (!e->mask.empty()) + mem += e->mask.length() + 1; + if (!e->reason.empty()) + mem += e->reason.length() + 1; + if (!e->who.empty()) + mem += e->who.length() + 1; } - *nrec = nexceptions; + *nrec = exceptions.size(); *memuse = mem; } @@ -92,7 +95,7 @@ void get_exception_stats(long *nrec, long *memuse) /********************* Internal Session Functions ************************/ /*************************************************************************/ -Session *findsession(const std::string &host) +Session *findsession(const Anope::string &host) { session_map::const_iterator it = SessionList.find(host); @@ -106,7 +109,7 @@ Session *findsession(const std::string &host) * Returns 1 if the host was added or 0 if the user was killed. */ -int add_session(const char *nick, const char *host, char *hostip) +int add_session(const Anope::string &nick, const Anope::string &host, const Anope::string &hostip) { Session *session; Exception *exception; @@ -120,12 +123,12 @@ int add_session(const char *nick, const char *host, char *hostip) sessionlimit = exception ? exception->limit : Config.DefSessionLimit; - if (sessionlimit != 0 && session->count >= sessionlimit) + if (sessionlimit && session->count >= sessionlimit) { - if (Config.SessionLimitExceeded) - ircdproto->SendMessage(OperServ, nick, Config.SessionLimitExceeded, host); - if (Config.SessionLimitDetailsLoc) - ircdproto->SendMessage(OperServ, nick, "%s", Config.SessionLimitDetailsLoc); + if (!Config.SessionLimitExceeded.empty()) + ircdproto->SendMessage(OperServ, nick, Config.SessionLimitExceeded.c_str(), host.c_str()); + if (!Config.SessionLimitDetailsLoc.empty()) + ircdproto->SendMessage(OperServ, nick, "%s", Config.SessionLimitDetailsLoc.c_str()); /* Previously on IRCds that send a QUIT (InspIRCD) when a user is killed, the session for a host was * decremented in do_quit, which caused problems and fixed here @@ -140,12 +143,11 @@ int add_session(const char *nick, const char *host, char *hostip) ++session->hits; if (Config.MaxSessionKill && session->hits >= Config.MaxSessionKill) { - char akillmask[BUFSIZE]; - snprintf(akillmask, sizeof(akillmask), "*@%s", host); - XLine *x = new XLine(ci::string("*@") + host, Config.s_OperServ, time(NULL) + Config.SessionAutoKillExpiry, "Session limit exceeded"); + Anope::string akillmask = "*@" + host; + XLine *x = new XLine(akillmask, Config.s_OperServ, time(NULL) + Config.SessionAutoKillExpiry, "Session limit exceeded"); if (x) x->By = Config.s_OperServ; - ircdproto->SendGlobops(OperServ, "Added a temporary AKILL for \2%s\2 due to excessive connections", akillmask); + ircdproto->SendGlobops(OperServ, "Added a temporary AKILL for \2%s\2 due to excessive connections", akillmask.c_str()); } return 0; } @@ -157,7 +159,7 @@ int add_session(const char *nick, const char *host, char *hostip) } session = new Session; - session->host = sstrdup(host); + session->host = host; session->count = 1; session->hits = 0; @@ -166,7 +168,7 @@ int add_session(const char *nick, const char *host, char *hostip) return 1; } -void del_session(const char *host) +void del_session(const Anope::string &host) { if (!Config.LimitSessions) { @@ -174,7 +176,7 @@ void del_session(const char *host) return; } - if (!host || !*host) + if (host.empty()) { Alog(LOG_DEBUG) << "del_session called with NULL values"; return; @@ -188,7 +190,7 @@ void del_session(const char *host) { if (debug) { - ircdproto->SendGlobops(OperServ, "WARNING: Tried to delete non-existant session: \2%s", host); + ircdproto->SendGlobops(OperServ, "WARNING: Tried to delete non-existant session: \2%s", host.c_str()); Alog(LOG_DEBUG) << "session: Tried to delete non-existant session: " << host; } return; @@ -204,7 +206,6 @@ void del_session(const char *host) Alog(LOG_DEBUG_2) << "del_session(): free session structure"; - delete [] session->host; delete session; Alog(LOG_DEBUG_2) << "del_session() done"; @@ -216,46 +217,45 @@ void del_session(const char *host) void expire_exceptions() { - int i; time_t now = time(NULL); - for (i = 0; i < nexceptions; ++i) + for (std::vector<Exception *>::iterator it = exceptions.begin(), it_end = exceptions.end(); it != it_end; ) { - if (!exceptions[i].expires || exceptions[i].expires > now) + Exception *e = *it; + std::vector<Exception *>::iterator curr_it = it++; + + if (!e->expires || e->expires > now) continue; if (Config.WallExceptionExpire) - ircdproto->SendGlobops(OperServ, "Session limit exception for %s has expired.", exceptions[i].mask); - delete [] exceptions[i].mask; - delete [] exceptions[i].reason; - delete [] exceptions[i].who; - --nexceptions; - memmove(exceptions + i, exceptions + i + 1, sizeof(Exception) * (nexceptions - i)); - exceptions = static_cast<Exception *>(srealloc(exceptions, sizeof(Exception) * nexceptions)); - --i; + ircdproto->SendGlobops(OperServ, "Session limit exception for %s has expired.", e->mask.c_str()); + delete e; + exceptions.erase(curr_it); } } /* Find the first exception this host matches and return it. */ -Exception *find_host_exception(const char *host) +Exception *find_host_exception(const Anope::string &host) { - int i; - - for (i = 0; i < nexceptions; ++i) - if ((Anope::Match(host, exceptions[i].mask, false))) - return &exceptions[i]; + for (std::vector<Exception *>::const_iterator it = exceptions.begin(), it_end = exceptions.end(); it != it_end; ++it) + { + Exception *e = *it; + if (Anope::Match(host, e->mask)) + return e; + } return NULL; } /* Same as find_host_exception() except * this tries to find the exception by IP also. */ -Exception *find_hostip_exception(const char *host, const char *hostip) +Exception *find_hostip_exception(const Anope::string &host, const Anope::string &hostip) { - int i; - - for (i = 0; i < nexceptions; ++i) - if (Anope::Match(host, exceptions[i].mask, false) || ((ircd->nickip && hostip) && Anope::Match(hostip, exceptions[i].mask, false))) - return &exceptions[i]; + for (std::vector<Exception *>::const_iterator it = exceptions.begin(), it_end = exceptions.end(); it != it_end; ++it) + { + Exception *e = *it; + if (Anope::Match(host, e->mask) || (ircd->nickip && !hostip.empty() && Anope::Match(hostip, e->mask))) + return e; + } return NULL; } @@ -264,52 +264,47 @@ Exception *find_hostip_exception(const char *host, const char *hostip) /************************ Exception Manipulation *************************/ /*************************************************************************/ -int exception_add(User *u, const char *mask, const int limit, const char *reason, const char *who, const time_t expires) +int exception_add(User *u, const Anope::string &mask, int limit, const Anope::string &reason, const Anope::string &who, time_t expires) { - int i; - /* Check if an exception already exists for this mask */ - for (i = 0; i < nexceptions; ++i) + for (std::vector<Exception *>::iterator it = exceptions.begin(), it_end = exceptions.end(); it != it_end; ++it) { - if (!stricmp(mask, exceptions[i].mask)) + Exception *e = *it; + if (e->mask.equals_ci(mask)) { - if (exceptions[i].limit != limit) + if (e->limit != limit) { - exceptions[i].limit = limit; + e->limit = limit; if (u) - notice_lang(Config.s_OperServ, u, OPER_EXCEPTION_CHANGED, mask, exceptions[i].limit); + notice_lang(Config.s_OperServ, u, OPER_EXCEPTION_CHANGED, mask.c_str(), e->limit); return -2; } else { if (u) - notice_lang(Config.s_OperServ, u, OPER_EXCEPTION_EXISTS, mask); + notice_lang(Config.s_OperServ, u, OPER_EXCEPTION_EXISTS, mask.c_str()); return -1; } } } - nexceptions++; - exceptions = static_cast<Exception *>(srealloc(exceptions, sizeof(Exception) * nexceptions)); - - exceptions[nexceptions - 1].mask = sstrdup(mask); - exceptions[nexceptions - 1].limit = limit; - exceptions[nexceptions - 1].reason = sstrdup(reason); - exceptions[nexceptions - 1].time = time(NULL); - exceptions[nexceptions - 1].who = sstrdup(who); - exceptions[nexceptions - 1].expires = expires; - exceptions[nexceptions - 1].num = nexceptions - 1; + Exception *exception = new Exception(); + exception->mask = mask; + exception->limit = limit; + exception->reason = reason; + exception->time = time(NULL); + exception->who = who; + exception->expires = expires; EventReturn MOD_RESULT; - FOREACH_RESULT(I_OnExceptionAdd, OnExceptionAdd(u, &exceptions[nexceptions - 1])); + FOREACH_RESULT(I_OnExceptionAdd, OnExceptionAdd(u, exception)); if (MOD_RESULT == EVENT_STOP) { - delete [] exceptions[nexceptions - 1].mask; - delete [] exceptions[nexceptions - 1].reason; - --nexceptions; - exceptions = static_cast<Exception *>(srealloc(exceptions, sizeof(Exception) * nexceptions)); + delete exception; return -3; } + exceptions.push_back(exception); + return 1; } diff --git a/src/sockets.cpp b/src/sockets.cpp index 418b1b334..d72b2847d 100644 --- a/src/sockets.cpp +++ b/src/sockets.cpp @@ -24,9 +24,9 @@ Socket::Socket(int nsock, bool nIPv6) Type = SOCKTYPE_CLIENT; IPv6 = nIPv6; if (nsock == 0) - sock = socket(IPv6 ? AF_INET6 : AF_INET, SOCK_STREAM, 0); + Sock = socket(IPv6 ? AF_INET6 : AF_INET, SOCK_STREAM, 0); else - sock = nsock; + Sock = nsock; SocketEngine->AddSocket(this); } @@ -35,7 +35,7 @@ Socket::Socket(int nsock, bool nIPv6) Socket::~Socket() { SocketEngine->DelSocket(this); - CloseSocket(sock); + CloseSocket(Sock); } /** Really recieve something from the buffer @@ -52,7 +52,7 @@ const int Socket::RecvInternal(char *buf, size_t sz) const * @param buf What to write * @return Number of bytes written */ -const int Socket::SendInternal(const std::string &buf) const +const int Socket::SendInternal(const Anope::string &buf) const { return send(GetSock(), buf.c_str(), buf.length(), 0); } @@ -62,7 +62,7 @@ const int Socket::SendInternal(const std::string &buf) const */ int Socket::GetSock() const { - return sock; + return Sock; } /** Mark a socket as blockig @@ -122,8 +122,7 @@ size_t Socket::WriteBufferLen() const */ bool Socket::ProcessRead() { - char tbuffer[NET_BUFSIZE]; - memset(&tbuffer, '\0', sizeof(tbuffer)); + char tbuffer[NET_BUFSIZE] = ""; RecvLen = RecvInternal(tbuffer, sizeof(tbuffer) - 1); if (RecvLen <= 0) @@ -132,7 +131,7 @@ bool Socket::ProcessRead() std::string sbuffer = extrabuf; sbuffer.append(tbuffer); extrabuf.clear(); - size_t lastnewline = sbuffer.find_last_of('\n'); + size_t lastnewline = sbuffer.rfind('\n'); if (lastnewline == std::string::npos) { extrabuf = sbuffer; @@ -147,10 +146,12 @@ bool Socket::ProcessRead() sepstream stream(sbuffer, '\n'); - std::string tbuf; + Anope::string tbuf; while (stream.GetToken(tbuf)) { - TrimBuf(tbuf); + std::string tmp_tbuf = tbuf.str(); + TrimBuf(tmp_tbuf); + tbuf = tmp_tbuf; if (!tbuf.empty()) if (!Read(tbuf)) @@ -190,7 +191,7 @@ void Socket::ProcessError() * @param buf The line * @return true to continue reading, false to drop the socket */ -bool Socket::Read(const std::string &buf) +bool Socket::Read(const Anope::string &buf) { return false; } @@ -202,8 +203,7 @@ void Socket::Write(const char *message, ...) { va_list vi; char tbuffer[BUFSIZE]; - std::string sbuf; - + if (!message) return; @@ -211,16 +211,16 @@ void Socket::Write(const char *message, ...) vsnprintf(tbuffer, sizeof(tbuffer), message, vi); va_end(vi); - sbuf = tbuffer; + Anope::string sbuf = tbuffer; Write(sbuf); } /** Write to the socket * @param message The message */ -void Socket::Write(const std::string &message) +void Socket::Write(const Anope::string &message) { - WriteBuffer.append(message + "\r\n"); + WriteBuffer.append(message.str() + "\r\n"); SocketEngine->MarkWriteable(this); } @@ -230,11 +230,11 @@ void Socket::Write(const std::string &message) * @param nsock The socket * @param nIPv6 IPv6 */ -ClientSocket::ClientSocket(const std::string &nTargetHost, int nPort, const std::string &nBindHost, bool nIPv6) : Socket(0, nIPv6), TargetHost(nTargetHost), Port(nPort), BindHost(nBindHost) +ClientSocket::ClientSocket(const Anope::string &nTargetHost, int nPort, const Anope::string &nBindHost, bool nIPv6) : Socket(0, nIPv6), TargetHost(nTargetHost), Port(nPort), BindHost(nBindHost) { - if (!IPv6 && (TargetHost.find(':') != std::string::npos || BindHost.find(':') != std::string::npos)) + if (!IPv6 && (TargetHost.find(':') != Anope::string::npos || BindHost.find(':') != Anope::string::npos)) IPv6 = true; - + addrinfo hints; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; @@ -247,7 +247,7 @@ ClientSocket::ClientSocket(const std::string &nTargetHost, int nPort, const std: sockaddr_in bindaddr; sockaddr_in6 bindaddr6; - if (getaddrinfo(BindHost.c_str(), NULL, &hints, &bindar) == 0) + if (!getaddrinfo(BindHost.c_str(), NULL, &hints, &bindar)) { if (IPv6) memcpy(&bindaddr6, bindar->ai_addr, bindar->ai_addrlen); @@ -263,26 +263,26 @@ ClientSocket::ClientSocket(const std::string &nTargetHost, int nPort, const std: bindaddr6.sin6_family = AF_INET6; if (inet_pton(AF_INET6, BindHost.c_str(), &bindaddr6.sin6_addr) < 1) - throw SocketException("Invalid bind host: " + std::string(strerror(errno))); + throw SocketException(Anope::string("Invalid bind host: ") + strerror(errno)); } else { bindaddr.sin_family = AF_INET; if (inet_pton(AF_INET, BindHost.c_str(), &bindaddr.sin_addr) < 1) - throw SocketException("Invalid bind host: " + std::string(strerror(errno))); + throw SocketException(Anope::string("Invalid bind host: ") + strerror(errno)); } } if (IPv6) { - if (bind(sock, reinterpret_cast<sockaddr *>(&bindaddr6), sizeof(bindaddr6)) == -1) - throw SocketException("Unable to bind to address: " + std::string(strerror(errno))); + if (bind(Sock, reinterpret_cast<sockaddr *>(&bindaddr6), sizeof(bindaddr6)) == -1) + throw SocketException(Anope::string("Unable to bind to address: ") + strerror(errno)); } else { - if (bind(sock, reinterpret_cast<sockaddr *>(&bindaddr), sizeof(bindaddr)) == -1) - throw SocketException("Unable to bind to address: " + std::string(strerror(errno))); + if (bind(Sock, reinterpret_cast<sockaddr *>(&bindaddr), sizeof(bindaddr)) == -1) + throw SocketException(Anope::string("Unable to bind to address: ") + strerror(errno)); } } @@ -290,7 +290,7 @@ ClientSocket::ClientSocket(const std::string &nTargetHost, int nPort, const std: sockaddr_in6 addr6; sockaddr_in addr; - if (getaddrinfo(TargetHost.c_str(), NULL, &hints, &conar) == 0) + if (!getaddrinfo(TargetHost.c_str(), NULL, &hints, &conar)) { if (IPv6) memcpy(&addr6, conar->ai_addr, conar->ai_addrlen); @@ -304,12 +304,12 @@ ClientSocket::ClientSocket(const std::string &nTargetHost, int nPort, const std: if (IPv6) { if (inet_pton(AF_INET6, TargetHost.c_str(), &addr6.sin6_addr) < 1) - throw SocketException("Invalid server host: " + std::string(strerror(errno))); + throw SocketException(Anope::string("Invalid server host: ") + strerror(errno)); } else { if (inet_pton(AF_INET, TargetHost.c_str(), &addr.sin_addr) < 1) - throw SocketException("Invalid server host: " + std::string(strerror(errno))); + throw SocketException(Anope::string("Invalid server host: ") + strerror(errno)); } } @@ -318,20 +318,16 @@ ClientSocket::ClientSocket(const std::string &nTargetHost, int nPort, const std: addr6.sin6_family = AF_INET6; addr6.sin6_port = htons(nPort); - if (connect(sock, reinterpret_cast<sockaddr *>(&addr6), sizeof(addr6)) == -1) - { - throw SocketException("Error connecting to server: " + std::string(strerror(errno))); - } + if (connect(Sock, reinterpret_cast<sockaddr *>(&addr6), sizeof(addr6)) == -1) + throw SocketException(Anope::string("Error connecting to server: ") + strerror(errno)); } else { addr.sin_family = AF_INET; addr.sin_port = htons(nPort); - if (connect(sock, reinterpret_cast<sockaddr *>(&addr), sizeof(addr)) == -1) - { - throw SocketException("Error connecting to server: " + std::string(strerror(errno))); - } + if (connect(Sock, reinterpret_cast<sockaddr *>(&addr), sizeof(addr)) == -1) + throw SocketException(Anope::string("Error connecting to server: ") + strerror(errno)); } this->SetNonBlocking(); @@ -347,7 +343,7 @@ ClientSocket::~ClientSocket() * @param buf The line * @return true to continue reading, false to drop the socket */ -bool ClientSocket::Read(const std::string &buf) +bool ClientSocket::Read(const Anope::string &buf) { return true; } @@ -356,7 +352,7 @@ bool ClientSocket::Read(const std::string &buf) * @param bind The IP to bind to * @param port The port to listen on */ -ListenSocket::ListenSocket(const std::string &bindip, int port) : Socket(0, (bindip.find(':') != std::string::npos ? true : false)) +ListenSocket::ListenSocket(const Anope::string &bindip, int port) : Socket(0, (bindip.find(':') != Anope::string::npos ? true : false)) { Type = SOCKTYPE_LISTEN; BindIP = bindip; @@ -364,16 +360,14 @@ ListenSocket::ListenSocket(const std::string &bindip, int port) : Socket(0, (bin sockaddr_in sock_addr; sockaddr_in6 sock_addr6; - + if (IPv6) { sock_addr6.sin6_family = AF_INET6; sock_addr6.sin6_port = htons(port); - + if (inet_pton(AF_INET6, bindip.c_str(), &sock_addr6.sin6_addr) < 1) - { - throw SocketException("Invalid bind host: " + std::string(strerror(errno))); - } + throw SocketException(Anope::string("Invalid bind host: ") + strerror(errno)); } else { @@ -381,30 +375,22 @@ ListenSocket::ListenSocket(const std::string &bindip, int port) : Socket(0, (bin sock_addr.sin_port = htons(port); if (inet_pton(AF_INET, bindip.c_str(), &sock_addr.sin_addr) < 1) - { - throw SocketException("Invalid bind host: " + std::string(strerror(errno))); - } + throw SocketException(Anope::string("Invalid bind host: ") + strerror(errno)); } if (IPv6) { - if (bind(sock, reinterpret_cast<sockaddr *>(&sock_addr6), sizeof(sock_addr6)) == -1) - { - throw SocketException("Unable to bind to address: " + std::string(strerror(errno))); - } + if (bind(Sock, reinterpret_cast<sockaddr *>(&sock_addr6), sizeof(sock_addr6)) == -1) + throw SocketException(Anope::string("Unable to bind to address: ") + strerror(errno)); } else { - if (bind(sock, reinterpret_cast<sockaddr *>(&sock_addr), sizeof(sock_addr)) == -1) - { - throw SocketException("Unable to bind to address: " + std::string(strerror(errno))); - } + if (bind(Sock, reinterpret_cast<sockaddr *>(&sock_addr), sizeof(sock_addr)) == -1) + throw SocketException(Anope::string("Unable to bind to address: ") + strerror(errno)); } - if (listen(sock, 5) == -1) - { - throw SocketException("Unable to listen: " + std::string(strerror(errno))); - } + if (listen(Sock, 5) == -1) + throw SocketException(Anope::string("Unable to listen: ") + strerror(errno)); this->SetNonBlocking(); } @@ -419,16 +405,14 @@ ListenSocket::~ListenSocket() */ bool ListenSocket::ProcessRead() { - int newsock = accept(sock, NULL, NULL); + int newsock = accept(Sock, NULL, NULL); #ifndef _WIN32 # define INVALID_SOCKET 0 #endif if (newsock > 0 && newsock != INVALID_SOCKET) - { return this->OnAccept(new Socket(newsock, IPv6)); - } return true; } @@ -445,9 +429,9 @@ bool ListenSocket::OnAccept(Socket *s) /** Get the bind IP for this socket * @return the bind ip */ -const std::string &ListenSocket::GetBindIP() const +const Anope::string &ListenSocket::GetBindIP() const { - return BindIP; + return BindIP; } /** Get the port this socket is bound to @@ -457,4 +441,3 @@ const int ListenSocket::GetPort() const { return Port; } - diff --git a/src/threadengines/threadengine_pthread.cpp b/src/threadengines/threadengine_pthread.cpp index a85af583e..f63cc066e 100644 --- a/src/threadengines/threadengine_pthread.cpp +++ b/src/threadengines/threadengine_pthread.cpp @@ -47,7 +47,7 @@ void ThreadEngine::Start(Thread *thread) if (pthread_create(&thread->Handle, &threadengine_attr, entry_point, thread)) { delete thread; - throw CoreException("Unable to create thread: " + std::string(strerror(errno))); + throw CoreException(Anope::string("Unable to create thread: ") + strerror(errno)); } } diff --git a/src/threadengines/threadengine_win32.cpp b/src/threadengines/threadengine_win32.cpp index 54db9529a..a07a75cce 100644 --- a/src/threadengines/threadengine_win32.cpp +++ b/src/threadengines/threadengine_win32.cpp @@ -43,7 +43,7 @@ void ThreadEngine::Start(Thread *thread) if (!thread->Handle) { delete thread; - throw CoreException("Unable to create thread: " + std::string(dlerror())); + throw CoreException(Anope::string("Unable to create thread: ") + dlerror()); } } diff --git a/src/timers.cpp b/src/timers.cpp index e4a2ef04b..df3f2d228 100644 --- a/src/timers.cpp +++ b/src/timers.cpp @@ -99,7 +99,7 @@ void TimerManager::DelTimer(Timer *T) */ void TimerManager::TickTimers(time_t ctime) { - while (Timers.size() && (ctime > Timers.front()->GetTimer())) + while (Timers.size() && ctime > Timers.front()->GetTimer()) { Timer *t = Timers.front(); @@ -119,5 +119,5 @@ void TimerManager::TickTimers(time_t ctime) */ bool TimerManager::TimerComparison(Timer *one, Timer *two) { - return (one->GetTimer() < two->GetTimer()); + return one->GetTimer() < two->GetTimer(); } diff --git a/src/tools/db-convert.h b/src/tools/db-convert.h index cf265c92f..b2e067f87 100644 --- a/src/tools/db-convert.h +++ b/src/tools/db-convert.h @@ -704,8 +704,6 @@ int delcore(NickCore *nc) nclists[HASH(nc->display)] = nc->next; delete [] nc->display; - if (nc->pass) - delete [] nc->pass; if (nc->email) delete [] nc->email; if (nc->greet) diff --git a/src/users.cpp b/src/users.cpp index 887929c76..6ccaf9bf0 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -26,15 +26,14 @@ time_t maxusertime; /*************************************************************************/ /*************************************************************************/ -User::User(const std::string &snick, const std::string &suid) +User::User(const Anope::string &snick, const Anope::string &suid) { if (snick.empty()) - throw "what the craq, empty nick passed to constructor"; + throw CoreException("what the craq, empty nick passed to constructor"); // XXX: we should also duplicate-check here. /* we used to do this by calloc, no more. */ - host = hostip = vhost = realname = NULL; server = NULL; nc = NULL; invalid_pw_count = timestamp = my_signon = invalid_pw_time = lastmemosend = lastnickreg = lastmail = 0; @@ -43,7 +42,7 @@ User::User(const std::string &snick, const std::string &suid) this->nick = snick; this->uid = suid; - UserListByNick[snick.c_str()] = this; + UserListByNick[snick] = this; if (!suid.empty()) UserListByUID[suid] = this; @@ -62,19 +61,19 @@ User::User(const std::string &snick, const std::string &suid) this->isSuperAdmin = 0; /* always set SuperAdmin to 0 for new users */ } -void User::SetNewNick(const std::string &newnick) +void User::SetNewNick(const Anope::string &newnick) { /* Sanity check to make sure we don't segfault */ if (newnick.empty()) - throw "User::SetNewNick() got a bad argument"; + throw CoreException("User::SetNewNick() got a bad argument"); Alog(LOG_DEBUG) << this->nick << " changed nick to " << newnick; - UserListByNick.erase(this->nick.c_str()); + UserListByNick.erase(this->nick); this->nick = newnick; - UserListByNick[this->nick.c_str()] = this; + UserListByNick[this->nick] = this; OnAccess = false; NickAlias *na = findnick(this->nick); @@ -82,14 +81,12 @@ void User::SetNewNick(const std::string &newnick) OnAccess = is_on_access(this, na->nc); } -void User::SetDisplayedHost(const std::string &shost) +void User::SetDisplayedHost(const Anope::string &shost) { if (shost.empty()) - throw "empty host? in MY services? it seems it's more likely than I thought."; + throw CoreException("empty host? in MY services? it seems it's more likely than I thought."); - if (this->vhost) - delete [] this->vhost; - this->vhost = sstrdup(shost.c_str()); + this->vhost = shost; Alog(LOG_DEBUG) << this->nick << " changed vhost to " << shost; @@ -99,9 +96,9 @@ void User::SetDisplayedHost(const std::string &shost) /** Get the displayed vhost of a user record. * @return The displayed vhost of the user, where ircd-supported, or the user's real host. */ -const std::string User::GetDisplayedHost() const +const Anope::string User::GetDisplayedHost() const { - if (ircd->vhost && this->vhost) + if (ircd->vhost && !this->vhost.empty()) return this->vhost; else if (this->HasMode(UMODE_CLOAK) && !this->GetCloakedHost().empty()) return this->GetCloakedHost(); @@ -112,7 +109,7 @@ const std::string User::GetDisplayedHost() const /** Update the cloaked host of a user * @param host The cloaked host */ -void User::SetCloakedHost(const std::string &newhost) +void User::SetCloakedHost(const Anope::string &newhost) { if (newhost.empty()) throw "empty host in User::SetCloakedHost"; @@ -127,17 +124,17 @@ void User::SetCloakedHost(const std::string &newhost) /** Get the cloaked host of a user * @return The cloaked host */ -const std::string &User::GetCloakedHost() const +const Anope::string &User::GetCloakedHost() const { return chost; } -const std::string &User::GetUID() const +const Anope::string &User::GetUID() const { return this->uid; } -void User::SetVIdent(const std::string &sident) +void User::SetVIdent(const Anope::string &sident) { this->vident = sident; @@ -146,7 +143,7 @@ void User::SetVIdent(const std::string &sident) this->UpdateHost(); } -const std::string &User::GetVIdent() const +const Anope::string &User::GetVIdent() const { if (this->HasMode(UMODE_CLOAK)) return this->vident; @@ -156,7 +153,7 @@ const std::string &User::GetVIdent() const return this->ident; } -void User::SetIdent(const std::string &sident) +void User::SetIdent(const Anope::string &sident) { this->ident = sident; @@ -165,34 +162,28 @@ void User::SetIdent(const std::string &sident) this->UpdateHost(); } -const std::string &User::GetIdent() const +const Anope::string &User::GetIdent() const { return this->ident; } -const std::string User::GetMask() +const Anope::string User::GetMask() { std::stringstream buf; buf << this->nick << "!" << this->ident << "@" << this->host; return buf.str(); } -void User::SetRealname(const std::string &srealname) +void User::SetRealname(const Anope::string &srealname) { if (srealname.empty()) - throw "realname empty in SetRealname"; + throw CoreException("realname empty in SetRealname"); - if (this->realname) - delete [] this->realname; - this->realname = sstrdup(srealname.c_str()); + this->realname = srealname; NickAlias *na = findnick(this->nick); if (na && (this->IsIdentified(true) || this->IsRecognized(true))) - { - if (na->last_realname) - delete [] na->last_realname; - na->last_realname = sstrdup(srealname.c_str()); - } + na->last_realname = srealname; Alog(LOG_DEBUG) << this->nick << " changed realname to " << srealname; } @@ -205,11 +196,9 @@ User::~User() if (Config.LogUsers) { - const char *srealname = normalizeBuffer(this->realname); + Anope::string srealname = normalizeBuffer(this->realname); Alog() << "LOGUSERS: " << this->GetMask() << (ircd->vhost ? " => " : " ") << (ircd->vhost ? this->GetDisplayedHost() : "") << " (" << srealname << ") left the network (" << this->server->GetName() << ")."; - - delete [] srealname; } FOREACH_MOD(I_OnUserLogoff, OnUserLogoff(this)); @@ -221,11 +210,11 @@ User::~User() while (!this->chans.empty()) this->chans.front()->chan->DeleteUser(this); - + if (Config.LimitSessions && !this->server->IsULined()) del_session(this->host); - UserListByNick.erase(this->nick.c_str()); + UserListByNick.erase(this->nick); if (!this->uid.empty()) UserListByUID.erase(this->uid); @@ -233,20 +222,10 @@ User::~User() if (na) na->OnCancel(this); - delete [] this->host; - - if (this->vhost) - delete [] this->vhost; - - if (this->realname) - delete [] this->realname; - if (this->hostip) - delete [] this->hostip; - Alog(LOG_DEBUG_2) << "User::~User() done"; } -void User::SendMessage(const std::string &source, const char *fmt, ...) +void User::SendMessage(const Anope::string &source, const char *fmt, ...) { va_list args; char buf[BUFSIZE] = ""; @@ -256,13 +235,13 @@ void User::SendMessage(const std::string &source, const char *fmt, ...) va_start(args, fmt); vsnprintf(buf, BUFSIZE - 1, fmt, args); - this->SendMessage(source, std::string(buf)); + this->SendMessage(source, Anope::string(buf)); va_end(args); } } -void User::SendMessage(const std::string &source, const std::string &msg) +void User::SendMessage(const Anope::string &source, const Anope::string &msg) { /* Send privmsg instead of notice if: * - UsePrivmsg is enabled @@ -270,9 +249,9 @@ void User::SendMessage(const std::string &source, const std::string &msg) * - The user is registered and has set /ns set msg on */ if (Config.UsePrivmsg && ((!this->nc && Config.NSDefFlags.HasFlag(NI_MSG)) || (this->nc && this->nc->HasFlag(NI_MSG)))) - ircdproto->SendPrivmsg(findbot(source), this->nick.c_str(), "%s", msg.c_str()); + ircdproto->SendPrivmsg(findbot(source), this->nick, "%s", msg.c_str()); else - ircdproto->SendNotice(findbot(source), this->nick.c_str(), "%s", msg.c_str()); + ircdproto->SendNotice(findbot(source), this->nick, "%s", msg.c_str()); } /** Collides a nick. @@ -338,17 +317,15 @@ void User::Collide(NickAlias *na) if (ircd->svsnick) { - std::string guestnick; + Anope::string guestnick; do { - char randbuf[17]; - snprintf(randbuf, sizeof(randbuf), "%d", getrandom16()); - guestnick = std::string(Config.NSGuestNickPrefix) + std::string(randbuf); + guestnick = Config.NSGuestNickPrefix + stringify(getrandom16()); } while (finduser(guestnick)); notice_lang(Config.s_NickServ, this, FORCENICKCHANGE_CHANGING, guestnick.c_str()); - ircdproto->SendForceNickChange(this, guestnick.c_str(), time(NULL)); + ircdproto->SendForceNickChange(this, guestnick, time(NULL)); } else kill_user(Config.s_NickServ, this->nick, "Services nickname-enforcer kill"); @@ -358,7 +335,7 @@ void User::Collide(NickAlias *na) * their svid matches the one stored in their nickcore * @param svid Services id */ -void User::CheckAuthenticationToken(const char *svid) +void User::CheckAuthenticationToken(const Anope::string &svid) { NickAlias *na; @@ -367,12 +344,9 @@ void User::CheckAuthenticationToken(const char *svid) char *c; if (na->nc && na->nc->GetExtArray("authenticationtoken", c)) { - if (svid && c && !strcmp(svid, c)) - { + if (!svid.empty() && c && svid.equals_cs(c)) /* Users authentication token matches so they should become identified */ this->Login(na->nc); - return; - } } } @@ -382,9 +356,9 @@ void User::CheckAuthenticationToken(const char *svid) /** Auto identify the user to the given accountname. * @param account Display nick of account */ -void User::AutoID(const std::string &account) +void User::AutoID(const Anope::string &account) { - NickCore *core = findcore(account.c_str()); + NickCore *core = findcore(account); if (core) { @@ -393,9 +367,7 @@ void User::AutoID(const std::string &account) NickAlias *na = findnick(this->nick); if (na && na->nc == core) { - if (na->last_realname) - delete [] na->last_realname; - na->last_realname = sstrdup(this->realname); + na->last_realname = this->realname; na->last_seen = time(NULL); this->SetMode(NickServ, UMODE_REGISTERED); this->UpdateHost(); @@ -433,7 +405,7 @@ void User::Logout() /** Get the account the user is logged in using * @reurn The account or NULL */ -NickCore *User::Account() const +NickCore *User::Account() { return nc; } @@ -442,7 +414,7 @@ NickCore *User::Account() const * @param CheckNick True to check if the user is identified to the nickname they are on too * @return true or false */ -const bool User::IsIdentified(bool CheckNick) const +bool User::IsIdentified(bool CheckNick) const { if (CheckNick && this->nc) { @@ -461,7 +433,7 @@ const bool User::IsIdentified(bool CheckNick) const * @param CheckSecure Only returns true if the user has secure off * @return true or false */ -const bool User::IsRecognized(bool CheckSecure) const +bool User::IsRecognized(bool CheckSecure) const { if (CheckSecure && OnAccess) { @@ -478,7 +450,7 @@ const bool User::IsRecognized(bool CheckSecure) const */ void User::UpdateHost() { - if (!this->host) + if (this->host.empty()) return; NickAlias *na = findnick(this->nick); @@ -488,11 +460,8 @@ void User::UpdateHost() if (na && (this->IsIdentified(true) || this->IsRecognized(true))) { - if (na->last_usermask) - delete [] na->last_usermask; - - std::string last_usermask = this->GetIdent() + "@" + this->GetDisplayedHost(); - na->last_usermask = sstrdup(last_usermask.c_str()); + Anope::string last_usermask = this->GetIdent() + "@" + this->GetDisplayedHost(); + na->last_usermask = last_usermask; } } @@ -500,7 +469,7 @@ void User::UpdateHost() * @param Name Mode name * @return true or false */ -const bool User::HasMode(UserModeName Name) const +bool User::HasMode(UserModeName Name) const { return modes.HasFlag(Name); } @@ -509,7 +478,7 @@ const bool User::HasMode(UserModeName Name) const * @param um The user mode * @param Param The param, if there is one */ -void User::SetModeInternal(UserMode *um, const std::string &Param) +void User::SetModeInternal(UserMode *um, const Anope::string &Param) { if (!um) return; @@ -530,7 +499,7 @@ void User::RemoveModeInternal(UserMode *um) return; modes.UnsetFlag(um->Name); - std::map<UserModeName, std::string>::iterator it = Params.find(um->Name); + std::map<UserModeName, Anope::string>::iterator it = Params.find(um->Name); if (it != Params.end()) Params.erase(it); @@ -542,7 +511,7 @@ void User::RemoveModeInternal(UserMode *um) * @param um The user mode * @param Param Optional param for the mode */ -void User::SetMode(BotInfo *bi, UserMode *um, const std::string &Param) +void User::SetMode(BotInfo *bi, UserMode *um, const Anope::string &Param) { if (!um || HasMode(um->Name)) return; @@ -556,7 +525,7 @@ void User::SetMode(BotInfo *bi, UserMode *um, const std::string &Param) * @param Name The mode name * @param param Optional param for the mode */ -void User::SetMode(BotInfo *bi, UserModeName Name, const std::string &Param) +void User::SetMode(BotInfo *bi, UserModeName Name, const Anope::string &Param) { SetMode(bi, ModeManager::FindUserModeByName(Name), Param); } @@ -566,7 +535,7 @@ void User::SetMode(BotInfo *bi, UserModeName Name, const std::string &Param) * @param ModeChar The mode char * @param param Optional param for the mode */ -void User::SetMode(BotInfo *bi, char ModeChar, const std::string &Param) +void User::SetMode(BotInfo *bi, char ModeChar, const Anope::string &Param) { SetMode(bi, ModeManager::FindUserModeByChar(ModeChar), Param); } @@ -610,7 +579,7 @@ void User::SetModes(BotInfo *bi, const char *umodes, ...) { char buf[BUFSIZE] = ""; va_list args; - std::string modebuf, sbuf; + Anope::string modebuf, sbuf; int add = -1; va_start(args, umodes); vsnprintf(buf, BUFSIZE - 1, umodes, args); @@ -618,7 +587,7 @@ void User::SetModes(BotInfo *bi, const char *umodes, ...) spacesepstream sep(buf); sep.GetToken(modebuf); - for (unsigned i = 0, end = modebuf.size(); i < end; ++i) + for (unsigned i = 0, end = modebuf.length(); i < end; ++i) { UserMode *um; @@ -687,15 +656,15 @@ void get_user_stats(long *nusers, long *memuse) count++; mem += sizeof(*user); - if (user->host) - mem += strlen(user->host) + 1; + if (!user->host.empty()) + mem += user->host.length() + 1; if (ircd->vhost) { - if (user->vhost) - mem += strlen(user->vhost) + 1; + if (!user->vhost.empty()) + mem += user->vhost.length() + 1; } - if (user->realname) - mem += strlen(user->realname) + 1; + if (!user->realname.empty()) + mem += user->realname.length() + 1; mem += user->server->GetName().length() + 1; mem += (sizeof(ChannelContainer) * user->chans.size()); } @@ -703,21 +672,11 @@ void get_user_stats(long *nusers, long *memuse) *memuse = mem; } -User *finduser(const char *nick) -{ - return finduser(ci::string(nick)); -} - -User *finduser(const std::string &nick) -{ - return finduser(ci::string(nick.c_str())); -} - -User *finduser(const ci::string &nick) +User *finduser(const Anope::string &nick) { if (isdigit(nick[0]) && ircd->ts6) { - user_uid_map::const_iterator it = UserListByUID.find(nick.c_str()); + user_uid_map::const_iterator it = UserListByUID.find(nick); if (it != UserListByUID.end()) return it->second; @@ -735,22 +694,23 @@ User *finduser(const ci::string &nick) /* Handle a server NICK command. */ -User *do_nick(const char *source, const char *nick, const char *username, const char *host, const char *server, const char *realname, time_t ts, uint32 ip, const char *vhost, const char *uid) +User *do_nick(const Anope::string &source, const Anope::string &nick, const Anope::string &username, const Anope::string &host, const Anope::string &server, const Anope::string &realname, time_t ts, uint32 ip, const Anope::string &vhost, const Anope::string &uid) { User *user = NULL; + Anope::string vhost2 = vhost; - if (!*source) + if (source.empty()) { char ipbuf[16]; struct in_addr addr; if (ircd->nickvhost) { - if (vhost) + if (!vhost2.empty()) { - if (!strcmp(vhost, "*")) + if (vhost2.equals_cs("*")) { - vhost = NULL; + vhost2.clear(); Alog(LOG_DEBUG) << "new user with no vhost in NICK command: " << nick; } } @@ -772,42 +732,39 @@ User *do_nick(const char *source, const char *nick, const char *username, const /** * Ugly swap routine for Flop's bug :) XXX **/ - if (realname) + Anope::string logrealname = realname; + if (!logrealname.empty()) { - char *tmp = const_cast<char *>(strchr(realname, '%')); - while (tmp) - { - *tmp = '-'; - tmp = const_cast<char *>(strchr(realname, '%')); - } + size_t tmp; + while ((tmp = logrealname.find('%')) != Anope::string::npos) + logrealname[tmp] = '-'; } - const char *logrealname = normalizeBuffer(realname); + logrealname = normalizeBuffer(logrealname); /** * End of ugly swap **/ - Alog() << "LOGUSERS: " << nick << " (" << username << "@" << host << (ircd->nickvhost && vhost ? " => " : "") << (ircd->nickvhost && vhost ? vhost : "") << ") (" << logrealname << ") " + Alog() << "LOGUSERS: " << nick << " (" << username << "@" << host << (ircd->nickvhost && !vhost2.empty() ? " => " : "") << (ircd->nickvhost && !vhost2.empty() ? vhost2 : "") << ") (" << logrealname << ") " << (ircd->nickip ? "[" : "") << (ircd->nickip ? ipbuf : "") << (ircd->nickip ? "]" : "") << " connected to the network (" << serv->GetName() << ")."; - delete [] logrealname; } /* Allocate User structure and fill it in. */ - user = new User(nick, uid ? uid : ""); + user = new User(nick, !uid.empty() ? uid : ""); user->SetIdent(username); - user->host = sstrdup(host); + user->host = host; user->server = serv; - user->realname = sstrdup(realname); + user->realname = realname; user->timestamp = ts; user->my_signon = time(NULL); - if (vhost) - user->SetCloakedHost(vhost); + if (!vhost2.empty()) + user->SetCloakedHost(vhost2); user->SetVIdent(username); /* We now store the user's ip in the user_ struct, * because we will use it in serveral places -- DrStein */ if (ircd->nickip) - user->hostip = sstrdup(ipbuf); + user->hostip = ipbuf; else - user->hostip = NULL; + user->hostip = ""; EventReturn MOD_RESULT; FOREACH_RESULT(I_OnPreUserConnect, OnPreUserConnect(user)); @@ -840,16 +797,14 @@ User *do_nick(const char *source, const char *nick, const char *username, const if (Config.LogUsers) { - const char *logrealname = normalizeBuffer(user->realname); - Alog() << "LOGUSERS: " << user->nick << " (" << user->GetIdent() << "@" << user->host << (ircd->vhost ? " => " : "") << (ircd->vhost ? user->GetDisplayedHost() : "") << ") (" - << logrealname << ") " << "changed nick to " << nick << " (" << user->server->GetName() << ")."; - if (logrealname) - delete [] logrealname; + Anope::string logrealname = normalizeBuffer(user->realname); + Alog() << "LOGUSERS: " << user->nick << " (" << user->GetIdent() << "@" << user->host << (ircd->vhost ? " => " : "") << (ircd->vhost ? user->GetDisplayedHost() : "") << ") (" << logrealname << ") changed nick to " + << nick << " (" << user->server->GetName() << ")."; } user->timestamp = ts; - if (!stricmp(nick, user->nick.c_str())) + if (user->nick.equals_ci(nick)) /* No need to redo things */ user->SetNewNick(nick); else @@ -861,7 +816,7 @@ User *do_nick(const char *source, const char *nick, const char *username, const if (old_na && (old_na->nc == user->Account() || user->IsRecognized())) old_na->last_seen = time(NULL); - std::string oldnick = user->nick; + Anope::string oldnick = user->nick; user->SetNewNick(nick); FOREACH_MOD(I_OnUserNickChange, OnUserNickChange(user, oldnick)); @@ -903,7 +858,7 @@ User *do_nick(const char *source, const char *nick, const char *username, const * av[1] = modes */ -void do_umode(const char *source, int ac, const char **av) +void do_umode(const Anope::string &source, int ac, const char **av) { User *user; @@ -923,7 +878,7 @@ void do_umode(const char *source, int ac, const char **av) * av[0] = reason */ -void do_quit(const char *source, int ac, const char **av) +void do_quit(const Anope::string &source, int ac, const char **av) { User *user; NickAlias *na; @@ -938,9 +893,7 @@ void do_quit(const char *source, int ac, const char **av) if ((na = findnick(user->nick)) && !na->HasFlag(NS_FORBIDDEN) && !na->nc->HasFlag(NI_SUSPENDED) && (user->IsRecognized() || user->IsIdentified(true))) { na->last_seen = time(NULL); - if (na->last_quit) - delete [] na->last_quit; - na->last_quit = *av[0] ? sstrdup(av[0]) : NULL; + na->last_quit = *av[0] ? av[0] : ""; } FOREACH_MOD(I_OnUserQuit, OnUserQuit(user, *av[0] ? av[0] : "")); delete user; @@ -953,7 +906,7 @@ void do_quit(const char *source, int ac, const char **av) * av[1] = reason */ -void do_kill(const std::string &nick, const std::string &msg) +void do_kill(const Anope::string &nick, const Anope::string &msg) { User *user; NickAlias *na; @@ -968,9 +921,7 @@ void do_kill(const std::string &nick, const std::string &msg) if ((na = findnick(user->nick)) && !na->HasFlag(NS_FORBIDDEN) && !na->nc->HasFlag(NI_SUSPENDED) && (user->IsRecognized() || user->IsIdentified(true))) { na->last_seen = time(NULL); - if (na->last_quit) - delete [] na->last_quit; - na->last_quit = !msg.empty() ? sstrdup(msg.c_str()) : NULL; + na->last_quit = msg; } delete user; } @@ -980,7 +931,7 @@ void do_kill(const std::string &nick, const std::string &msg) /* Is the given nick an oper? */ -int is_oper(User * user) +int is_oper(User *user) { if (user && user->HasMode(UMODE_OPER)) return 1; @@ -992,7 +943,7 @@ int is_oper(User * user) /*************************************************************************/ /* Is the given user ban-excepted? */ -int is_excepted(ChannelInfo * ci, User * user) +int is_excepted(ChannelInfo *ci, User *user) { if (!ci->c || !ModeManager::FindChannelModeByName(CMODE_EXCEPT)) return 0; @@ -1006,7 +957,7 @@ int is_excepted(ChannelInfo * ci, User * user) /*************************************************************************/ /* Is the given MASK ban-excepted? */ -int is_excepted_mask(ChannelInfo * ci, const char *mask) +int is_excepted_mask(ChannelInfo *ci, const Anope::string &mask) { if (!ci->c || !ModeManager::FindChannelModeByName(CMODE_EXCEPT)) return 0; @@ -1023,40 +974,34 @@ int is_excepted_mask(ChannelInfo * ci, const char *mask) * just user@host)? */ -int match_usermask(const char *mask, User * user) +int match_usermask(const Anope::string &mask, User *user) { - char *mask2; - char *nick, *username, *host; int result; - if (!mask || !*mask) + if (mask.empty()) return 0; - mask2 = sstrdup(mask); - - if (strchr(mask2, '!')) + Anope::string mask2 = mask, nick, username, host; + size_t ex = mask2.find('!'); + if (ex != Anope::string::npos) { - nick = strtok(mask2, "!"); - username = strtok(NULL, "@"); + nick = mask2.substr(0, ex); + mask2 = mask2.substr(ex + 1); } - else + size_t at = mask2.find('@'); + if (at != Anope::string::npos) { - nick = NULL; - username = strtok(mask2, "@"); + username = mask2.substr(0, at); + host = mask2.substr(at + 1); } - host = strtok(NULL, ""); - if (!username || !host) - { - delete [] mask2; + if (username.empty() || host.empty()) return 0; - } - if (nick) - result = Anope::Match(user->nick, nick, false) && Anope::Match(user->GetIdent().c_str(), username, false) && (Anope::Match(user->host, host, false) || Anope::Match(user->GetDisplayedHost().c_str(), host, false)); + if (!nick.empty()) + result = Anope::Match(user->nick, nick) && Anope::Match(user->GetIdent(), username) && (Anope::Match(user->host, host) || Anope::Match(user->GetDisplayedHost(), host)); else - result = Anope::Match(user->GetIdent().c_str(), username, false) && (Anope::Match(user->host, host, false) || Anope::Match(user->GetDisplayedHost().c_str(), host, false)); + result = Anope::Match(user->GetIdent(), username) && (Anope::Match(user->host, host) || Anope::Match(user->GetDisplayedHost(), host)); - delete [] mask2; return result; } @@ -1067,49 +1012,37 @@ int match_usermask(const char *mask, User * user) * appropriate subnet mask (e.g. 35.1.1.1 -> 35.*; 128.2.1.1 -> 128.2.*); * for named addresses, wildcards the leftmost part of the name unless the * name only contains two parts. If the username begins with a ~, delete - * it. The returned character string is malloc'd and should be free'd - * when done with. + * it. */ -char *create_mask(User *u) +Anope::string create_mask(User *u) { - char *mask, *s, *end; - std::string mident = u->GetIdent(); - std::string mhost = u->GetDisplayedHost(); - int ulen = mident.length(); + Anope::string mask; + Anope::string mident = u->GetIdent(); + Anope::string mhost = u->GetDisplayedHost(); /* Get us a buffer the size of the username plus hostname. The result * will never be longer than this (and will often be shorter), thus we * can use strcpy() and sprintf() safely. */ - end = mask = new char[ulen + mhost.length() + 3]; if (mident[0] == '~') - end += sprintf(end, "*%s@", mident.c_str()); + mask = "*" + mident + "@"; else - end += sprintf(end, "%s@", mident.c_str()); + mask = mident + "@"; - // XXX: someone needs to rewrite this godawful kitten murdering pile of crap. - if (strspn(mhost.c_str(), "0123456789.") == mhost.length() - && (s = strchr(const_cast<char *>(mhost.c_str()), '.')) // XXX - Potentially unsafe cast - && (s = strchr(s + 1, '.')) && (s = strchr(s + 1, '.')) && (!strchr(s + 1, '.'))) + size_t dot; + /* To make sure this is an IP, make sure the host contains only numbers and dots, and check to make sure it only contains 3 dots */ + if (mhost.find_first_not_of("0123456789.") == Anope::string::npos && (dot = mhost.find('.')) != Anope::string::npos && (dot = mhost.find('.', dot + 1)) != Anope::string::npos && (dot = mhost.find('.', dot + 1)) != Anope::string::npos && mhost.find('.', dot + 1) == Anope::string::npos) { /* IP addr */ - s = sstrdup(mhost.c_str()); - *strrchr(s, '.') = 0; - - sprintf(end, "%s.*", s); - delete [] s; + dot = mhost.find('.'); + mask += mhost.substr(0, dot) + ".*"; } else { - if ((s = strchr(const_cast<char *>(mhost.c_str()), '.')) && strchr(s + 1, '.')) - { - s = sstrdup(strchr(mhost.c_str(), '.') - 1); - *s = '*'; - strcpy(end, s); - delete [] s; - } + if ((dot = mhost.find('.')) != Anope::string::npos && mhost.find('.', dot + 1) != Anope::string::npos) + mask += "*" + mhost.substr(dot); else - strcpy(end, mhost.c_str()); + mask += mhost; } return mask; } @@ -1183,11 +1116,8 @@ void UserSetInternalModes(User *user, int ac, const char **av) break; case UMODE_CLOAK: case UMODE_VHOST: - if (!add && user->vhost) - { - delete [] user->vhost; - user->vhost = NULL; - } + if (!add && !user->vhost.empty()) + user->vhost.clear(); user->UpdateHost(); default: break; diff --git a/src/wildcard.cpp b/src/wildcard.cpp index 42f0812f7..1716068d1 100644 --- a/src/wildcard.cpp +++ b/src/wildcard.cpp @@ -2,9 +2,9 @@ static bool match_internal(const unsigned char *str, const unsigned char *mask, bool case_sensitive) { - unsigned char *cp = NULL, *mp = NULL; - unsigned char *string = const_cast<unsigned char *>(str); // XXX: unsafe cast - unsigned char *wild = const_cast<unsigned char *>(mask); // XXX: unsafe cast + const unsigned char *cp = NULL, *mp = NULL; + const unsigned char *string = str; + const unsigned char *wild = mask; while (*string && *wild != '*') { @@ -19,8 +19,8 @@ static bool match_internal(const unsigned char *str, const unsigned char *mask, return false; } - wild++; - string++; + ++wild; + ++string; } while (*string) @@ -71,7 +71,7 @@ static bool match_internal(const unsigned char *str, const unsigned char *mask, return !*wild; } -bool Anope::Match(const std::string &str, const std::string &mask, bool case_sensitive) +bool Anope::Match(const Anope::string &str, const Anope::string &mask, bool case_sensitive) { return match_internal(reinterpret_cast<const unsigned char *>(str.c_str()), reinterpret_cast<const unsigned char *>(mask.c_str()), case_sensitive); } diff --git a/src/win32/windows.cpp b/src/win32/windows.cpp index 6568e860e..9ea3dad09 100644 --- a/src/win32/windows.cpp +++ b/src/win32/windows.cpp @@ -47,7 +47,7 @@ int inet_pton(int af, const char *src, void *dst) return -1; } - if (!WSAStringToAddress((LPSTR) src, af, NULL, reinterpret_cast<LPSOCKADDR>(&sa), &address_length)) + if (!WSAStringToAddress(static_cast<LPSTR>(const_cast<char *>(src)), af, NULL, reinterpret_cast<LPSOCKADDR>(&sa), &address_length)) { switch (af) { |