]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/filelogger.cpp
Header update: 2007 -> 2008
[user/henk/code/inspircd.git] / src / filelogger.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 /* $Core: libIRCDfilelogger */
15
16 #include "inspircd.h"
17 #include <fstream>
18 #include "socketengine.h"
19 #include "inspircd_se_config.h"
20 #include "filelogger.h"
21
22 FileLogger::FileLogger(InspIRCd* Instance, FILE* logfile)
23 : ServerInstance(Instance), log(logfile), writeops(0)
24 {
25         if (log)
26         {
27                 Instance->SE->NonBlocking(fileno(log));
28                 SetFd(fileno(log));
29                 buffer.clear();
30         }
31 }
32
33 bool FileLogger::Readable()
34 {
35         return false;
36 }
37     
38 void FileLogger::HandleEvent(EventType, int)
39 {
40         WriteLogLine("");
41         if (log)
42                 ServerInstance->SE->DelFd(this);
43 }
44
45 void FileLogger::WriteLogLine(const std::string &line)
46 {
47         if (line.length())
48                 buffer.append(line);
49
50         if (log)
51         {
52                 int written = fprintf(log,"%s",buffer.c_str());
53 #ifdef WINDOWS
54                 buffer.clear();
55 #else
56                 if ((written >= 0) && (written < (int)buffer.length()))
57                 {
58                         buffer.erase(0, buffer.length());
59                         ServerInstance->SE->AddFd(this);
60                 }
61                 else if (written == -1)
62                 {
63                         if (errno == EAGAIN)
64                                 ServerInstance->SE->AddFd(this);
65                 }
66                 else
67                 {
68                         /* Wrote the whole buffer, and no need for write callback */
69                         buffer.clear();
70                 }
71 #endif
72                 if (writeops++ % 20)
73                 {
74                         fflush(log);
75                 }
76         }
77 }
78
79 void FileLogger::Close()
80 {
81         if (log)
82         {
83                 ServerInstance->SE->Blocking(fileno(log));
84
85                 if (buffer.size())
86                         fprintf(log,"%s",buffer.c_str());
87
88 #ifndef WINDOWS
89                 ServerInstance->SE->DelFd(this);
90 #endif
91
92                 fflush(log);
93                 fclose(log);
94         }
95
96         buffer.clear();
97 }
98
99 FileLogger::~FileLogger()
100 {
101         this->Close();
102 }
103