From 7dfcffd6853547eb2e73d161916d5a289069baf2 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Fri, 17 May 2013 01:31:32 +0100 Subject: Start to replace MAXBUF with . --- include/configreader.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/configreader.h b/include/configreader.h index cc1412096..b9ca6940e 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -93,14 +93,16 @@ class ServerLimits size_t MaxGecos; /** Maximum away message length */ size_t MaxAway; + /** Maximum line length */ + size_t MaxLine; /** Creating the class initialises it to the defaults * as in 1.1's ./configure script. Reading other values * from the config will change these values. */ - ServerLimits() : NickMax(31), ChanMax(64), MaxModes(20), IdentMax(12), MaxQuit(255), MaxTopic(307), MaxKick(255), MaxGecos(128), MaxAway(200) - { - } + ServerLimits() : NickMax(31), ChanMax(64), MaxModes(20), IdentMax(12), + MaxQuit(255), MaxTopic(307), MaxKick(255), MaxGecos(128), MaxAway(200), + MaxLine(512) { } }; struct CommandLineConf -- cgit v1.2.3 From bbeb5ea38686dfeb9537860770bbdb3bd2f9cd3f Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Fri, 17 May 2013 02:03:16 +0100 Subject: Use iostream instead of C-style file operations. --- include/configreader.h | 6 ++++ src/configreader.cpp | 29 ++++++++++++---- src/modules/m_permchannels.cpp | 74 ++++++++++++--------------------------- src/modules/m_xline_db.cpp | 78 ++++++++++++++---------------------------- win/inspircd_win32wrapper.h | 3 ++ 5 files changed, 79 insertions(+), 111 deletions(-) (limited to 'include') diff --git a/include/configreader.h b/include/configreader.h index b9ca6940e..a17c5cf3e 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -521,6 +521,12 @@ class CoreExport ServerConfig * @return True if the file exists and is readable. */ static bool FileExists(const char* file); + + /** Escapes a value for storage in a configuration key. + * @param str The string to escape. + * @param xml Are we using the XML config format? + */ + static std::string Escape(const std::string& str, bool xml = true); /** If this value is true, invites will bypass more than just +i */ diff --git a/src/configreader.cpp b/src/configreader.cpp index bd8320137..905eb786a 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -773,14 +773,31 @@ bool ServerConfig::FileExists(const char* file) if ((sb.st_mode & S_IFDIR) > 0) return false; - FILE *input = fopen(file, "r"); - if (input == NULL) - return false; - else + return !access(file, F_OK); +} + +std::string ServerConfig::Escape(const std::string& str, bool xml) +{ + std::string escaped; + for (std::string::const_iterator it = str.begin(); it != str.end(); ++it) { - fclose(input); - return true; + switch (*it) + { + case '"': + escaped += xml ? """ : "\""; + break; + case '&': + escaped += xml ? "&" : "&"; + break; + case '\\': + escaped += xml ? "\\" : "\\\\"; + break; + default: + escaped += *it; + break; + } } + return escaped; } const char* ServerConfig::CleanFilename(const char* name) diff --git a/src/modules/m_permchannels.cpp b/src/modules/m_permchannels.cpp index 41477ba35..ff1a35ba9 100644 --- a/src/modules/m_permchannels.cpp +++ b/src/modules/m_permchannels.cpp @@ -19,6 +19,7 @@ #include "inspircd.h" +#include /* $ModDesc: Provides support for channel mode +P to provide permanent channels */ @@ -26,79 +27,47 @@ static std::string permchannelsconf; static bool WriteDatabase() { - FILE *f; - - if (permchannelsconf.empty()) - { - // Fake success. - return true; - } - - std::string tempname = permchannelsconf + ".tmp"; - /* * We need to perform an atomic write so as not to fuck things up. - * So, let's write to a temporary file, flush and sync the FD, then rename the file.. - * -- w00t + * So, let's write to a temporary file, flush it, then rename the file.. + * -- w00t */ - f = fopen(tempname.c_str(), "w"); - if (!f) + + // If the user has not specified a configuration file then we don't write one. + if (permchannelsconf.empty()) + return true; + + std::string permchannelsnewconf = permchannelsconf + ".tmp"; + std::ofstream stream(permchannelsnewconf.c_str()); + if (!stream.is_open()) { ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot create database! %s (%d)", strerror(errno), errno); ServerInstance->SNO->WriteToSnoMask('a', "database: cannot create new db: %s (%d)", strerror(errno), errno); return false; } + + stream << "# This file is automatically generated by m_permchannels. Any changes will be overwritten." << std::endl + << "" << std::endl; - fputs("# Permchannels DB\n# This file is autogenerated; any changes will be overwritten!\n\n", f); - // Now, let's write. for (chan_hash::const_iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); i++) { Channel* chan = i->second; if (!chan->IsModeSet('P')) continue; - char line[1024]; - const char* items[] = - { - "\n" - }; - - int lpos = 0, item = 0, ipos = 0; - while (lpos < 1022 && item < 7) - { - char c = items[item][ipos++]; - if (c == 0) - { - // end of this string; hop to next string, insert a quote - item++; - ipos = 0; - c = '"'; - } - else if (c == '\\' || c == '"') - { - line[lpos++] = '\\'; - } - line[lpos++] = c; - } - line[--lpos] = 0; - fputs(line, f); + stream << "name) + << "\" topic=\"" << ServerConfig::Escape(chan->topic) + << "\" modes=\"" << ServerConfig::Escape(chan->ChanModes(true)) + << "\">" << std::endl; } - int write_error = 0; - write_error = ferror(f); - write_error |= fclose(f); - if (write_error) + if (stream.fail()) { ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot write to new database! %s (%d)", strerror(errno), errno); ServerInstance->SNO->WriteToSnoMask('a', "database: cannot write to new db: %s (%d)", strerror(errno), errno); return false; } + stream.close(); #ifdef _WIN32 if (remove(permchannelsconf.c_str())) @@ -109,7 +78,7 @@ static bool WriteDatabase() } #endif // Use rename to move temporary to new db - this is guarenteed not to fuck up, even in case of a crash. - if (rename(tempname.c_str(), permchannelsconf.c_str()) < 0) + if (rename(permchannelsnewconf.c_str(), permchannelsconf.c_str()) < 0) { ServerInstance->Logs->Log("m_permchannels", LOG_DEFAULT, "permchannels: Cannot move new to old database! %s (%d)", strerror(errno), errno); ServerInstance->SNO->WriteToSnoMask('a', "database: cannot replace old with new db: %s (%d)", strerror(errno), errno); @@ -120,7 +89,6 @@ static bool WriteDatabase() } - /** Handles the +P channel mode */ class PermChannel : public ModeHandler diff --git a/src/modules/m_xline_db.cpp b/src/modules/m_xline_db.cpp index e325fc088..0b3361953 100644 --- a/src/modules/m_xline_db.cpp +++ b/src/modules/m_xline_db.cpp @@ -20,6 +20,7 @@ #include "inspircd.h" #include "xline.h" +#include /* $ModConfig: * Specify the filename for the xline database here*/ @@ -85,18 +86,16 @@ class ModuleXLineDB : public Module bool WriteDatabase() { - FILE *f; - /* * We need to perform an atomic write so as not to fuck things up. - * So, let's write to a temporary file, flush and sync the FD, then rename the file.. + * So, let's write to a temporary file, flush it, then rename the file.. * Technically, that means that this can block, but I have *never* seen that. - * -- w00t + * -- w00t */ ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Opening temporary database"); std::string xlinenewdbpath = xlinedbpath + ".new"; - f = fopen(xlinenewdbpath.c_str(), "w"); - if (!f) + std::ofstream stream(xlinenewdbpath.c_str()); + if (!stream.is_open()) { ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Cannot create database! %s (%d)", strerror(errno), errno); ServerInstance->SNO->WriteToSnoMask('a', "database: cannot create new db: %s (%d)", strerror(errno), errno); @@ -112,7 +111,7 @@ class ModuleXLineDB : public Module * semblance of backwards compatibility for reading on startup.. * -- w00t */ - fprintf(f, "VERSION 1\n"); + stream << "VERSION 1" << std::endl; // Now, let's write. std::vector types = ServerInstance->XLines->GetAllTypes(); @@ -125,26 +124,21 @@ class ModuleXLineDB : public Module for (LookupIter i = lookup->begin(); i != lookup->end(); ++i) { XLine* line = i->second; - fprintf(f, "LINE %s %s %s %lu %lu :%s\n", - line->type.c_str(), - line->Displayable().c_str(), - ServerInstance->Config->ServerName.c_str(), - (unsigned long)line->set_time, - (unsigned long)line->duration, line->reason.c_str()); + stream << "LINE " << line->type << " " << line->Displayable() << " " + << ServerInstance->Config->ServerName << " " << line->set_time << " " + << line->duration << " " << line->reason << std::endl; } } ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Finished writing XLines. Checking for error.."); - int write_error = 0; - write_error = ferror(f); - write_error |= fclose(f); - if (write_error) + if (stream.fail()) { ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Cannot write to new database! %s (%d)", strerror(errno), errno); ServerInstance->SNO->WriteToSnoMask('a', "database: cannot write to new db: %s (%d)", strerror(errno), errno); return false; } + stream.close(); #ifdef _WIN32 if (remove(xlinedbpath.c_str())) @@ -167,42 +161,23 @@ class ModuleXLineDB : public Module bool ReadDatabase() { - FILE *f; - char linebuf[MAXBUF]; + // If the xline database doesn't exist then we don't need to load it. + if (!ServerConfig::FileExists(xlinedbpath.c_str())) + return true; - f = fopen(xlinedbpath.c_str(), "r"); - if (!f) + std::ifstream stream(xlinedbpath.c_str()); + if (!stream.is_open()) { - if (errno == ENOENT) - { - /* xline.db doesn't exist, fake good return value (we don't care about this) */ - return true; - } - else - { - /* this might be slightly more problematic. */ - ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Cannot read database! %s (%d)", strerror(errno), errno); - ServerInstance->SNO->WriteToSnoMask('a', "database: cannot read db: %s (%d)", strerror(errno), errno); - return false; - } + ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Cannot read database! %s (%d)", strerror(errno), errno); + ServerInstance->SNO->WriteToSnoMask('a', "database: cannot read db: %s (%d)", strerror(errno), errno); + return false; } - - while (fgets(linebuf, MAXBUF, f)) + + std::string line; + while (std::getline(stream, line)) { - char *c = linebuf; - - while (c && *c) - { - if (*c == '\n') - { - *c = '\0'; - } - - c++; - } - // Inspired by the command parser. :) - irc::tokenstream tokens(linebuf); + irc::tokenstream tokens(line); int items = 0; std::string command_p[7]; std::string tmp; @@ -213,7 +188,7 @@ class ModuleXLineDB : public Module items++; } - ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Processing %s", linebuf); + ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: Processing %s", line.c_str()); if (command_p[0] == "VERSION") { @@ -223,7 +198,7 @@ class ModuleXLineDB : public Module } else { - fclose(f); + stream.close(); ServerInstance->Logs->Log("m_xline_db", LOG_DEBUG, "xlinedb: I got database version %s - I don't understand it", command_p[1].c_str()); ServerInstance->SNO->WriteToSnoMask('a', "database: I got a database version (%s) I don't understand", command_p[1].c_str()); return false; @@ -251,8 +226,7 @@ class ModuleXLineDB : public Module delete xl; } } - - fclose(f); + stream.close(); return true; } diff --git a/win/inspircd_win32wrapper.h b/win/inspircd_win32wrapper.h index 38754d5df..8234dfefe 100644 --- a/win/inspircd_win32wrapper.h +++ b/win/inspircd_win32wrapper.h @@ -101,6 +101,9 @@ __inline void sleep(int seconds) { Sleep(seconds * 1000); } #define popen _popen #define pclose _pclose +/* _access */ +#define access _access + /* IPV4 only convert string to address struct */ __inline int inet_aton(const char *cp, struct in_addr *addr) { -- cgit v1.2.3 From c5bc6c1cf52464308797c1fd648062363504b48b Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Sat, 18 May 2013 18:40:55 +0100 Subject: Replace some C string operations with the + operator. --- include/users.h | 6 ---- src/modules/m_messageflood.cpp | 2 +- src/users.cpp | 72 +++++------------------------------------- 3 files changed, 9 insertions(+), 71 deletions(-) (limited to 'include') diff --git a/include/users.h b/include/users.h index 52f3e4a88..e27a764dc 100644 --- a/include/users.h +++ b/include/users.h @@ -481,12 +481,6 @@ class CoreExport User : public Extensible */ virtual bool HasModePermission(unsigned char mode, ModeType type); - /** Creates a wildcard host. - * Takes a buffer to use and fills the given buffer with the host in the format *!*\@hostname - * @return The wildcarded hostname in *!*\@host form - */ - char* MakeWildHost(); - /** Creates a usermask with real host. * Takes a buffer to use and fills the given buffer with the hostmask in the format user\@host * @return the usermask in the format user\@host diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp index 970087bef..65c3354a9 100644 --- a/src/modules/m_messageflood.cpp +++ b/src/modules/m_messageflood.cpp @@ -155,7 +155,7 @@ class ModuleMsgFlood : public Module std::vector parameters; parameters.push_back(dest->name); parameters.push_back("+b"); - parameters.push_back(user->MakeWildHost()); + parameters.push_back("*!*@" + user->dhost); ServerInstance->SendGlobalMode(parameters, ServerInstance->FakeClient); } diff --git a/src/users.cpp b/src/users.cpp index a12b322b7..a8359692a 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -220,18 +220,8 @@ const std::string& User::MakeHost() if (!this->cached_makehost.empty()) return this->cached_makehost; - char nhost[MAXBUF]; - /* This is much faster than snprintf */ - char* t = nhost; - for(const char* n = ident.c_str(); *n; n++) - *t++ = *n; - *t++ = '@'; - for(const char* n = host.c_str(); *n; n++) - *t++ = *n; - *t = 0; - - this->cached_makehost.assign(nhost); - + // XXX: Is there really a need to cache this? + this->cached_makehost = ident + "@" + host; return this->cached_makehost; } @@ -240,18 +230,8 @@ const std::string& User::MakeHostIP() if (!this->cached_hostip.empty()) return this->cached_hostip; - char ihost[MAXBUF]; - /* This is much faster than snprintf */ - char* t = ihost; - for(const char* n = ident.c_str(); *n; n++) - *t++ = *n; - *t++ = '@'; - for(const char* n = this->GetIPString().c_str(); *n; n++) - *t++ = *n; - *t = 0; - - this->cached_hostip = ihost; - + // XXX: Is there really a need to cache this? + this->cached_hostip = ident + "@" + this->GetIPString(); return this->cached_hostip; } @@ -260,54 +240,18 @@ const std::string& User::GetFullHost() if (!this->cached_fullhost.empty()) return this->cached_fullhost; - char result[MAXBUF]; - char* t = result; - for(const char* n = nick.c_str(); *n; n++) - *t++ = *n; - *t++ = '!'; - for(const char* n = ident.c_str(); *n; n++) - *t++ = *n; - *t++ = '@'; - for(const char* n = dhost.c_str(); *n; n++) - *t++ = *n; - *t = 0; - - this->cached_fullhost = result; - + // XXX: Is there really a need to cache this? + this->cached_fullhost = nick + "!" + ident + "@" + dhost; return this->cached_fullhost; } -char* User::MakeWildHost() -{ - static char nresult[MAXBUF]; - char* t = nresult; - *t++ = '*'; *t++ = '!'; - *t++ = '*'; *t++ = '@'; - for(const char* n = dhost.c_str(); *n; n++) - *t++ = *n; - *t = 0; - return nresult; -} - const std::string& User::GetFullRealHost() { if (!this->cached_fullrealhost.empty()) return this->cached_fullrealhost; - char fresult[MAXBUF]; - char* t = fresult; - for(const char* n = nick.c_str(); *n; n++) - *t++ = *n; - *t++ = '!'; - for(const char* n = ident.c_str(); *n; n++) - *t++ = *n; - *t++ = '@'; - for(const char* n = host.c_str(); *n; n++) - *t++ = *n; - *t = 0; - - this->cached_fullrealhost = fresult; - + // XXX: Is there really a need to cache this? + this->cached_fullrealhost = nick + "!" + ident + "@" + host; return this->cached_fullrealhost; } -- cgit v1.2.3 From 955ad16ed79016a637101f81ed23160014dc13f9 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Sun, 19 May 2013 02:53:32 +0100 Subject: Convert ConvNumeric() to use std::string instead of char[MAXBUF]. --- include/inspircd.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/inspircd.h b/include/inspircd.h index 957032da2..f86945903 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -82,20 +82,19 @@ CoreExport extern InspIRCd* ServerInstance; */ template inline std::string ConvNumeric(const T &in) { - if (in == 0) return "0"; - char res[MAXBUF]; - char* out = res; + if (in == 0) + return "0"; T quotient = in; - while (quotient) { - *out = "0123456789"[ std::abs( (long)quotient % 10 ) ]; - ++out; + std::string out; + while (quotient) + { + out += "0123456789"[ std::abs( (long)quotient % 10 ) ]; quotient /= 10; } if (in < 0) - *out++ = '-'; - *out = 0; - std::reverse(res,out); - return res; + out += '-'; + std::reverse(out.begin(), out.end()); + return out; } /** Template function to convert any input type to std::string -- cgit v1.2.3 From ef3799a43a24f4b3da5e785765a6e4c01353845c Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Mon, 20 May 2013 19:25:46 +0100 Subject: Convert User::FormatNoticeMasks() to use std::string. --- include/users.h | 2 +- src/commands/cmd_whois.cpp | 2 +- src/mode.cpp | 2 +- src/users.cpp | 10 ++++------ 4 files changed, 7 insertions(+), 9 deletions(-) (limited to 'include') diff --git a/include/users.h b/include/users.h index e27a764dc..9f732f134 100644 --- a/include/users.h +++ b/include/users.h @@ -403,7 +403,7 @@ class CoreExport User : public Extensible /** Create a displayable mode string for this users snomasks * @return The notice mask character sequence */ - const char* FormatNoticeMasks(); + std::string FormatNoticeMasks(); /** Process a snomask modifier string, e.g. +abc-de * @param sm A sequence of notice mask characters diff --git a/src/commands/cmd_whois.cpp b/src/commands/cmd_whois.cpp index fea14f375..de3d71152 100644 --- a/src/commands/cmd_whois.cpp +++ b/src/commands/cmd_whois.cpp @@ -152,7 +152,7 @@ void CommandWhois::DoWhois(User* user, User* dest, unsigned long signon, unsigne { if (dest->IsModeSet('s') != 0) { - ServerInstance->SendWhoisLine(user, dest, 379, "%s %s :is using modes +%s +%s", user->nick.c_str(), dest->nick.c_str(), dest->FormatModes(), dest->FormatNoticeMasks()); + ServerInstance->SendWhoisLine(user, dest, 379, "%s %s :is using modes +%s +%s", user->nick.c_str(), dest->nick.c_str(), dest->FormatModes(), dest->FormatNoticeMasks().c_str()); } else { diff --git a/src/mode.cpp b/src/mode.cpp index 578fc2c27..ac0b111b1 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -190,7 +190,7 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ /* Display user's current mode string */ user->WriteNumeric(RPL_UMODEIS, "%s :+%s",targetuser->nick.c_str(),targetuser->FormatModes()); if ((targetuser->IsOper())) - user->WriteNumeric(RPL_SNOMASKIS, "%s +%s :Server notice mask", targetuser->nick.c_str(), targetuser->FormatNoticeMasks()); + user->WriteNumeric(RPL_SNOMASKIS, "%s +%s :Server notice mask", targetuser->nick.c_str(), targetuser->FormatNoticeMasks().c_str()); return; } else diff --git a/src/users.cpp b/src/users.cpp index a8359692a..e0d420311 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -122,18 +122,16 @@ void User::SetNoticeMask(unsigned char sm, bool value) snomasks[sm-65] = value; } -const char* User::FormatNoticeMasks() +std::string User::FormatNoticeMasks() { - static char data[MAXBUF]; - int offset = 0; + std::string data; - for (int n = 0; n < 64; n++) + for (unsigned char n = 0; n < 64; n++) { if (snomasks[n]) - data[offset++] = n+65; + data.push_back(n + 65); } - data[offset] = 0; return data; } -- cgit v1.2.3 From e01df6385ef2ad1c0a78ccdd08af9af3ce688264 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Mon, 20 May 2013 20:15:50 +0100 Subject: Convert User::SendText to use std::string. --- include/users.h | 2 +- src/users.cpp | 29 +++++++++++------------------ 2 files changed, 12 insertions(+), 19 deletions(-) (limited to 'include') diff --git a/include/users.h b/include/users.h index 9f732f134..941e57667 100644 --- a/include/users.h +++ b/include/users.h @@ -601,7 +601,7 @@ class CoreExport User : public Extensible * @param LinePrefix text to prefix each complete line with * @param TextStream the text to send to the user */ - void SendText(const std::string &LinePrefix, std::stringstream &TextStream); + void SendText(const std::string& linePrefix, std::stringstream& textStream); /** Write to the user, routing the line if the user is remote. */ diff --git a/src/users.cpp b/src/users.cpp index e0d420311..468c2aa36 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -1159,28 +1159,21 @@ void User::SendText(const char *text, ...) SendText(line); } -void User::SendText(const std::string &LinePrefix, std::stringstream &TextStream) -{ - char line[MAXBUF]; - int start_pos = LinePrefix.length(); - int pos = start_pos; - memcpy(line, LinePrefix.data(), pos); - std::string Word; - while (TextStream >> Word) +void User::SendText(const std::string& linePrefix, std::stringstream& textStream) +{ + std::string line; + std::string word; + while (textStream >> word) { - int len = Word.length(); - if (pos + len + 12 > MAXBUF) + size_t lineLength = linePrefix.length() + line.length() + word.length() + 3; // "\s\n\r" + if (lineLength > ServerInstance->Config->Limits.MaxLine) { - line[pos] = '\0'; - SendText(std::string(line)); - pos = start_pos; + SendText(linePrefix + line); + line.clear(); } - line[pos] = ' '; - memcpy(line + pos + 1, Word.data(), len); - pos += len + 1; + line += " " + word; } - line[pos] = '\0'; - SendText(std::string(line)); + SendText(linePrefix + line); } /* return 0 or 1 depending if users u and u2 share one or more common channels -- cgit v1.2.3