The InspIRCd Project
Home | Developers | Wiki | Forums | Bug Tracker | SVN | Download
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

socketengine.cpp

Go to the documentation of this file.
00001 /*       +------------------------------------+
00002  *       | Inspire Internet Relay Chat Daemon |
00003  *       +------------------------------------+
00004  *
00005  *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
00006  * See: http://www.inspircd.org/wiki/index.php/Credits
00007  *
00008  * This program is free but copyrighted software; see
00009  *          the file COPYING for details.
00010  *
00011  * ---------------------------------------------------
00012  */
00013 
00014 /* $Core */
00015 
00016 /*********        DEFAULTS       **********/
00017 
00018 /* $ExtraSources: socketengines/socketengine_select.cpp */
00019 /* $ExtraObjects: socketengine_select.o */
00020 
00021 /* $If: USE_POLL */
00022 /* $ExtraSources: socketengines/socketengine_poll.cpp */
00023 /* $ExtraObjects: socketengine_poll.o */
00024 /* $EndIf */
00025 
00026 /* $If: USE_KQUEUE */
00027 /* $ExtraSources: socketengines/socketengine_kqueue.cpp */
00028 /* $ExtraObjects: socketengine_kqueue.o */
00029 /* $EndIf */
00030 
00031 /* $If: USE_EPOLL */
00032 /* $ExtraSources: socketengines/socketengine_epoll.cpp */
00033 /* $ExtraObjects: socketengine_epoll.o */
00034 /* $EndIf */
00035 
00036 /* $If: USE_PORTS */
00037 /* $ExtraSources: socketengines/socketengine_ports.cpp */
00038 /* $ExtraObjects: socketengine_ports.o */
00039 /* $EndIf */
00040 
00041 #include "inspircd.h"
00042 #include "socketengine.h"
00043 
00044 int EventHandler::GetFd()
00045 {
00046         return this->fd;
00047 }
00048 
00049 void EventHandler::SetFd(int FD)
00050 {
00051         this->fd = FD;
00052 }
00053 
00054 bool EventHandler::Readable()
00055 {
00056         return true;
00057 }
00058 
00059 bool EventHandler::Writeable()
00060 {
00061         return false;
00062 }
00063 
00064 void SocketEngine::WantWrite(EventHandler* eh)
00065 {
00066 }
00067 
00068 SocketEngine::SocketEngine(InspIRCd* Instance) : ServerInstance(Instance)
00069 {
00070         TotalEvents = WriteEvents = ReadEvents = ErrorEvents = 0;
00071         lastempty = time(NULL);
00072         indata = outdata = 0;
00073 }
00074 
00075 SocketEngine::~SocketEngine()
00076 {
00077 }
00078 
00079 bool SocketEngine::AddFd(EventHandler* eh)
00080 {
00081         return true;
00082 }
00083 
00084 bool SocketEngine::HasFd(int fd)
00085 {
00086         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
00087                 return false;
00088         return ref[fd];
00089 }
00090 
00091 EventHandler* SocketEngine::GetRef(int fd)
00092 {
00093         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
00094                 return 0;
00095         return ref[fd];
00096 }
00097 
00098 bool SocketEngine::DelFd(EventHandler* eh, bool force)
00099 {
00100         return true;
00101 }
00102 
00103 int SocketEngine::GetMaxFds()
00104 {
00105         return 0;
00106 }
00107 
00108 int SocketEngine::GetRemainingFds()
00109 {
00110         return 0;
00111 }
00112 
00113 int SocketEngine::DispatchEvents()
00114 {
00115         return 0;
00116 }
00117 
00118 std::string SocketEngine::GetName()
00119 {
00120         return "misconfigured";
00121 }
00122 
00123 bool SocketEngine::BoundsCheckFd(EventHandler* eh)
00124 {       
00125         if (!eh)
00126                 return false;
00127         if ((eh->GetFd() < 0) || (eh->GetFd() > MAX_DESCRIPTORS))
00128                 return false;
00129         return true;
00130 }
00131 
00132 
00133 int SocketEngine::Accept(EventHandler* fd, sockaddr *addr, socklen_t *addrlen)
00134 {
00135         return accept(fd->GetFd(), addr, addrlen);
00136 }
00137 
00138 int SocketEngine::Close(EventHandler* fd)
00139 {
00140 #ifdef WINDOWS
00141         return closesocket(fd->GetFd());
00142 #else
00143         return close(fd->GetFd());
00144 #endif
00145 }
00146 
00147 int SocketEngine::Close(int fd)
00148 {
00149 #ifdef WINDOWS
00150         return closesocket(fd);
00151 #else
00152         return close(fd);
00153 #endif
00154 }
00155 
00156 int SocketEngine::Blocking(int fd)
00157 {
00158 #ifdef WINDOWS
00159         unsigned long opt = 0;
00160         return ioctlsocket(fd, FIONBIO, &opt);
00161 #else
00162         int flags = fcntl(fd, F_GETFL, 0);
00163         return fcntl(fd, F_SETFL, flags ^ O_NONBLOCK);
00164 #endif
00165 }
00166 
00167 int SocketEngine::NonBlocking(int fd)
00168 {
00169 #ifdef WINDOWS
00170         unsigned long opt = 1;
00171         return ioctlsocket(fd, FIONBIO, &opt);
00172 #else
00173         int flags = fcntl(fd, F_GETFL, 0);
00174         return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
00175 #endif
00176 }
00177 
00178 int SocketEngine::GetSockName(EventHandler* fd, sockaddr *name, socklen_t* namelen)
00179 {
00180         return getsockname(fd->GetFd(), name, namelen);
00181 }
00182 
00183 int SocketEngine::RecvFrom(EventHandler* fd, void *buf, size_t len, int flags, sockaddr *from, socklen_t *fromlen)
00184 {
00185         this->UpdateStats(len, 0);
00186         return recvfrom(fd->GetFd(), (char*)buf, len, flags, from, fromlen);
00187 }
00188 
00189 int SocketEngine::Send(EventHandler* fd, const void *buf, size_t len, int flags)
00190 {
00191         this->UpdateStats(0, len);
00192         return send(fd->GetFd(), (const char*)buf, len, flags);
00193 }
00194 
00195 int SocketEngine::Recv(EventHandler* fd, void *buf, size_t len, int flags)
00196 {
00197         this->UpdateStats(len, 0);
00198         return recv(fd->GetFd(), (char*)buf, len, flags);
00199 }
00200 
00201 int SocketEngine::SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen)
00202 {
00203         this->UpdateStats(0, len);
00204         return sendto(fd->GetFd(), (const char*)buf, len, flags, to, tolen);
00205 }
00206 
00207 int SocketEngine::Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen)
00208 {
00209         return connect(fd->GetFd(), serv_addr, addrlen);
00210 }
00211 
00212 int SocketEngine::Shutdown(EventHandler* fd, int how)
00213 {
00214         return shutdown(fd->GetFd(), how);
00215 }
00216 
00217 int SocketEngine::Bind(int fd, const sockaddr *my_addr, socklen_t addrlen)
00218 {
00219         return bind(fd, my_addr, addrlen);
00220 }
00221 
00222 int SocketEngine::Listen(int sockfd, int backlog)
00223 {
00224         return listen(sockfd, backlog);
00225 }
00226 
00227 int SocketEngine::Shutdown(int fd, int how)
00228 {
00229         return shutdown(fd, how);
00230 }
00231 
00232 void SocketEngine::RecoverFromFork()
00233 {
00234 }
00235 
00236 void SocketEngine::UpdateStats(size_t len_in, size_t len_out)
00237 {
00238         if (lastempty != time(NULL))
00239         {
00240                 lastempty = time(NULL);
00241                 indata = outdata = 0;
00242         }
00243         indata += len_in;
00244         outdata += len_out;
00245 }
00246 
00247 void SocketEngine::GetStats(float &kbitpersec_in, float &kbitpersec_out, float &kbitpersec_total)
00248 {
00249         UpdateStats(0, 0); /* Forces emptying of the values if its been more than a second */
00250         float in_kbit = indata * 8;
00251         float out_kbit = outdata * 8;
00252         kbitpersec_total = ((in_kbit + out_kbit) / 1024);
00253         kbitpersec_in = in_kbit / 1024;
00254         kbitpersec_out = out_kbit / 1024;
00255 }