From 5adcab2223c1f64550f24c2b1d49d1299ceb69d5 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 18 Aug 2006 22:01:26 +0000 Subject: NONBLOCKING LOGGER! git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4971 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/helperfuncs.cpp | 8 +++++-- src/inspircd.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index cc4b8355f..e4be94ec0 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -83,8 +83,8 @@ void InspIRCd::Log(int level, const std::string &text) if (Config->log_file && Config->writelog) { - fprintf(Config->log_file,"%s %s\n",TIMESTR,text.c_str()); - fflush(Config->log_file); + std::string out = std::string(TIMESTR) + text.c_str() + "\n"; + this->Logger->WriteLogLine(out); } if (Config->nofork) @@ -446,6 +446,8 @@ void InspIRCd::OpenLog(char** argv, int argc) printf("ERROR: Could not write to logfile %s, bailing!\n\n",Config->logpath.c_str()); Exit(ERROR); } + + this->Logger = new FileLogger(this, Config->log_file); return; } @@ -456,6 +458,8 @@ void InspIRCd::OpenLog(char** argv, int argc) printf("ERROR: Could not write to logfile %s, bailing!\n\n",Config->logpath.c_str()); Exit(ERROR); } + + this->Logger = new FileLogger(this, Config->log_file); } void InspIRCd::CheckRoot() diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 18d289381..5b2d5aac2 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -50,6 +50,7 @@ #include "command_parse.h" using irc::sockets::NonBlocking; +using irc::sockets::Blocking; using irc::sockets::insp_ntoa; using irc::sockets::insp_inaddr; using irc::sockets::insp_sockaddr; @@ -792,3 +793,71 @@ time_t InspIRCd::Time() return TIME; } +bool FileLogger::Readable() +{ + return false; +} + +void FileLogger::HandleEvent(EventType et) +{ + this->WriteLogLine(""); + ServerInstance->SE->DelFd(this); +} + +void FileLogger::WriteLogLine(const std::string &line) +{ + if (line.length()) + buffer.append(line); + + if (log) + { + int written = fprintf(log,"%s",buffer.c_str()); + if ((written >= 0) && (written < (int)buffer.length())) + { + buffer.erase(0, buffer.length()); + ServerInstance->SE->AddFd(this); + } + else if (written == -1) + { + if (errno == EAGAIN) + ServerInstance->SE->AddFd(this); + } + else + { + /* Wrote the whole buffer, and no need for write callback */ + buffer = ""; + } + } + if (writeops++ % 20) + { + fflush(log); + } +} + +void FileLogger::Close() +{ + if (log) + { + int flags = fcntl(fileno(log), F_GETFL, 0); + fcntl(fileno(log), F_SETFL, flags ^ O_NONBLOCK); + if (buffer.size()) + fprintf(log,"%s",buffer.c_str()); + fflush(log); + fclose(log); + } + buffer = ""; + ServerInstance->SE->DelFd(this); +} + +FileLogger::FileLogger(InspIRCd* Instance, FILE* logfile) : ServerInstance(Instance), log(logfile), writeops(0) +{ + irc::sockets::NonBlocking(fileno(log)); + this->SetFd(fileno(log)); + buffer = ""; +} + +FileLogger::~FileLogger() +{ + this->Close(); +} + -- cgit v1.2.3