]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/socketengine.cpp
Remove last vestige of libircdfoo, by changing tag into a single identifier marking...
[user/henk/code/inspircd.git] / src / socketengine.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 */
15
16 /*********        DEFAULTS       **********/
17 /* $ExtraSources: socketengines/socketengine_select.cpp */
18 /* $ExtraObjects: socketengine_select.o */
19
20 /* $If: USE_KQUEUE */
21 /* $ExtraSources: socketengines/socketengine_kqueue.cpp */
22 /* $ExtraObjects: socketengine_kqueue.o */
23 /* $EndIf */
24
25 /* $If: USE_EPOLL */
26 /* $ExtraSources: socketengines/socketengine_epoll.cpp */
27 /* $ExtraObjects: socketengine_epoll.o */
28 /* $EndIf */
29
30 /* $If: USE_PORTS */
31 /* $ExtraSources: socketengines/socketengine_ports.cpp */
32 /* $ExtraObjects: socketengine_ports.o */
33 /* $EndIf */
34
35 #include "inspircd.h"
36 #include "socketengine.h"
37
38 int EventHandler::GetFd()
39 {
40         return this->fd;
41 }
42
43 void EventHandler::SetFd(int FD)
44 {
45         this->fd = FD;
46 }
47
48 bool EventHandler::Readable()
49 {
50         return true;
51 }
52
53 bool EventHandler::Writeable()
54 {
55         return false;
56 }
57
58 void SocketEngine::WantWrite(EventHandler* eh)
59 {
60 }
61
62 SocketEngine::SocketEngine(InspIRCd* Instance) : ServerInstance(Instance)
63 {
64         TotalEvents = WriteEvents = ReadEvents = ErrorEvents = 0;
65         lastempty = time(NULL);
66         indata = outdata = 0;
67 }
68
69 SocketEngine::~SocketEngine()
70 {
71 }
72
73 bool SocketEngine::AddFd(EventHandler* eh)
74 {
75         return true;
76 }
77
78 bool SocketEngine::HasFd(int fd)
79 {
80         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
81                 return false;
82         return ref[fd];
83 }
84
85 EventHandler* SocketEngine::GetRef(int fd)
86 {
87         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
88                 return 0;
89         return ref[fd];
90 }
91
92 bool SocketEngine::DelFd(EventHandler* eh, bool force)
93 {
94         return true;
95 }
96
97 int SocketEngine::GetMaxFds()
98 {
99         return 0;
100 }
101
102 int SocketEngine::GetRemainingFds()
103 {
104         return 0;
105 }
106
107 int SocketEngine::DispatchEvents()
108 {
109         return 0;
110 }
111
112 std::string SocketEngine::GetName()
113 {
114         return "misconfigured";
115 }
116
117 bool SocketEngine::BoundsCheckFd(EventHandler* eh)
118 {       
119         if (!eh)
120                 return false;
121         if ((eh->GetFd() < 0) || (eh->GetFd() > MAX_DESCRIPTORS))
122                 return false;
123         return true;
124 }
125
126
127 int SocketEngine::Accept(EventHandler* fd, sockaddr *addr, socklen_t *addrlen)
128 {
129         return accept(fd->GetFd(), addr, addrlen);
130 }
131
132 int SocketEngine::Close(EventHandler* fd)
133 {
134 #ifdef WINDOWS
135         return closesocket(fd->GetFd());
136 #else
137         return close(fd->GetFd());
138 #endif
139 }
140
141 int SocketEngine::Close(int fd)
142 {
143 #ifdef WINDOWS
144         return closesocket(fd);
145 #else
146         return close(fd);
147 #endif
148 }
149
150 int SocketEngine::Blocking(int fd)
151 {
152 #ifdef WINDOWS
153         unsigned long opt = 0;
154         return ioctlsocket(fd, FIONBIO, &opt);
155 #else
156         int flags = fcntl(fd, F_GETFL, 0);
157         return fcntl(fd, F_SETFL, flags ^ O_NONBLOCK);
158 #endif
159 }
160
161 int SocketEngine::NonBlocking(int fd)
162 {
163 #ifdef WINDOWS
164         unsigned long opt = 1;
165         return ioctlsocket(fd, FIONBIO, &opt);
166 #else
167         int flags = fcntl(fd, F_GETFL, 0);
168         return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
169 #endif
170 }
171
172 int SocketEngine::GetSockName(EventHandler* fd, sockaddr *name, socklen_t* namelen)
173 {
174         return getsockname(fd->GetFd(), name, namelen);
175 }
176
177 int SocketEngine::RecvFrom(EventHandler* fd, void *buf, size_t len, int flags, sockaddr *from, socklen_t *fromlen)
178 {
179         this->UpdateStats(len, 0);
180         return recvfrom(fd->GetFd(), (char*)buf, len, flags, from, fromlen);
181 }
182
183 int SocketEngine::Send(EventHandler* fd, const void *buf, size_t len, int flags)
184 {
185         this->UpdateStats(0, len);
186         return send(fd->GetFd(), (const char*)buf, len, flags);
187 }
188
189 int SocketEngine::Recv(EventHandler* fd, void *buf, size_t len, int flags)
190 {
191         this->UpdateStats(len, 0);
192         return recv(fd->GetFd(), (char*)buf, len, flags);
193 }
194
195 int SocketEngine::SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen)
196 {
197         this->UpdateStats(0, len);
198         return sendto(fd->GetFd(), (const char*)buf, len, flags, to, tolen);
199 }
200
201 int SocketEngine::Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen)
202 {
203         return connect(fd->GetFd(), serv_addr, addrlen);
204 }
205
206 int SocketEngine::Shutdown(EventHandler* fd, int how)
207 {
208         return shutdown(fd->GetFd(), how);
209 }
210
211 int SocketEngine::Bind(int fd, const sockaddr *my_addr, socklen_t addrlen)
212 {
213         return bind(fd, my_addr, addrlen);
214 }
215
216 int SocketEngine::Listen(int sockfd, int backlog)
217 {
218         return listen(sockfd, backlog);
219 }
220
221 int SocketEngine::Shutdown(int fd, int how)
222 {
223         return shutdown(fd, how);
224 }
225
226 void SocketEngine::RecoverFromFork()
227 {
228 }
229
230 void SocketEngine::UpdateStats(size_t len_in, size_t len_out)
231 {
232         if (lastempty != time(NULL))
233         {
234                 lastempty = time(NULL);
235                 indata = outdata = 0;
236         }
237         indata += len_in;
238         outdata += len_out;
239 }
240
241 void SocketEngine::GetStats(float &kbitpersec_in, float &kbitpersec_out, float &kbitpersec_total)
242 {
243         UpdateStats(0, 0); /* Forces emptying of the values if its been more than a second */
244         float in_kbit = indata * 8;
245         float out_kbit = outdata * 8;
246         kbitpersec_total = ((in_kbit + out_kbit) / 1024);
247         kbitpersec_in = in_kbit / 1024;
248         kbitpersec_out = out_kbit / 1024;
249 }