X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocket.cpp;h=c33eee5a6aee2a352cd4414c5dfcdb4f5075b84d;hb=2b3394855d5adddb16285b905503d9ffe5a1d963;hp=411465ad6fa55fbefc5c83ea5eb045f56c469ad2;hpb=b083bc0b660671c1dd393b4d94989d5e159fabab;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socket.cpp b/src/socket.cpp index 411465ad6..c33eee5a6 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -12,8 +12,6 @@ */ #include "inspircd.h" -#include -#include "configreader.h" #include "socket.h" #include "socketengine.h" #include "wildcard.h" @@ -47,10 +45,8 @@ ListenSocket::ListenSocket(InspIRCd* Instance, int port, char* addr) : ServerIns if ((!*addr) || (strchr(addr,':'))) this->family = AF_INET6; else - this->family = AF_INET; -#else - this->family = AF_INET; #endif + this->family = AF_INET; Instance->SE->AddFd(this); } } @@ -61,7 +57,7 @@ ListenSocket::~ListenSocket() { ServerInstance->SE->DelFd(this); ServerInstance->Log(DEBUG,"Shut down listener on fd %d", this->fd); - if (shutdown(this->fd, 2) || close(this->fd)) + if (ServerInstance->SE->Shutdown(this, 2) || ServerInstance->SE->Close(this)) ServerInstance->Log(DEBUG,"Failed to cancel listener: %s", strerror(errno)); this->fd = -1; } @@ -81,17 +77,15 @@ void ListenSocket::HandleEvent(EventType et, int errornum) length = sizeof(sockaddr_in6); } else +#endif { uslen = sizeof(sockaddr_in); length = sizeof(sockaddr_in); } -#else - uslen = sizeof(sockaddr_in); - length = sizeof(sockaddr_in); -#endif - incomingSockfd = _accept (this->GetFd(), (sockaddr*)client, &length); - if ((incomingSockfd > -1) && (!_getsockname(incomingSockfd, sock_us, &uslen))) + incomingSockfd = ServerInstance->SE->Accept(this, (sockaddr*)client, &length); + + if ((incomingSockfd > -1) && (!ServerInstance->SE->GetSockName(this, sock_us, &uslen))) { char buf[MAXBUF]; #ifdef IPV6 @@ -101,15 +95,14 @@ void ListenSocket::HandleEvent(EventType et, int errornum) in_port = ntohs(((sockaddr_in6*)sock_us)->sin6_port); } else +#endif { inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); } -#else - inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); - in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); -#endif - NonBlocking(incomingSockfd); + + ServerInstance->SE->NonBlocking(incomingSockfd); + if (ServerInstance->Config->GetIOHook(in_port)) { try @@ -126,7 +119,7 @@ void ListenSocket::HandleEvent(EventType et, int errornum) } else { - shutdown(incomingSockfd,2); + ServerInstance->SE->Shutdown(incomingSockfd, 2); close(incomingSockfd); ServerInstance->stats->statsRefused++; } @@ -137,19 +130,19 @@ void ListenSocket::HandleEvent(EventType et, int errornum) /* Match raw bytes using CIDR bit matching, used by higher level MatchCIDR() */ bool irc::sockets::MatchCIDRBits(unsigned char* address, unsigned char* mask, unsigned int mask_bits) { - unsigned int modulus = mask_bits % 8; /* Number of whole bytes in the mask */ - unsigned int divisor = mask_bits / 8; /* Remaining bits in the mask after whole bytes are dealt with */ - - /* First compare the whole bytes, if they dont match, return false */ - if (memcmp(address, mask, divisor)) - return false; + unsigned int divisor = mask_bits / 8; /* Number of whole bytes in the mask */ + unsigned int modulus = mask_bits % 8; /* Remaining bits in the mask after whole bytes are dealt with */ - /* Now if there are any remainder bits, we compare them with logic AND */ + /* First (this is faster) compare the odd bits with logic ops */ if (modulus) if ((address[divisor] & inverted_bits[modulus]) != (mask[divisor] & inverted_bits[modulus])) /* If they dont match, return false */ return false; + /* Secondly (this is slower) compare the whole bytes */ + if (memcmp(address, mask, divisor)) + return false; + /* The address matches the mask, to mask_bits bits of mask */ return true; } @@ -301,28 +294,6 @@ bool irc::sockets::MatchCIDR(const char* address, const char* cidr_mask, bool ma return MatchCIDRBits(addr_raw, mask_raw, bits); } -void irc::sockets::Blocking(int s) -{ -#ifndef WIN32 - int flags = fcntl(s, F_GETFL, 0); - fcntl(s, F_SETFL, flags ^ O_NONBLOCK); -#else - unsigned long opt = 0; - ioctlsocket(s, FIONBIO, &opt); -#endif -} - -void irc::sockets::NonBlocking(int s) -{ -#ifndef WIN32 - int flags = fcntl(s, F_GETFL, 0); - fcntl(s, F_SETFL, flags | O_NONBLOCK); -#else - unsigned long opt = 1; - ioctlsocket(s, FIONBIO, &opt); -#endif -} - /** This will bind a socket to a port. It works for UDP/TCP. * It can only bind to IP addresses, if you wish to bind to hostnames * you should first resolve them using class 'Resolver'. @@ -417,7 +388,7 @@ bool InspIRCd::BindSocket(int sockfd, int port, char* addr, bool dolisten) ((sockaddr_in*)server)->sin_port = htons(port); size = sizeof(sockaddr_in); #endif - ret = bind(sockfd, server, size); + ret = SE->Bind(sockfd, server, size); delete[] server; if (ret < 0) @@ -428,7 +399,7 @@ bool InspIRCd::BindSocket(int sockfd, int port, char* addr, bool dolisten) { if (dolisten) { - if (listen(sockfd, Config->MaxConn) == -1) + if (SE->Listen(sockfd, Config->MaxConn) == -1) { this->Log(DEFAULT,"ERROR in listen(): %s",strerror(errno)); return false; @@ -436,7 +407,7 @@ bool InspIRCd::BindSocket(int sockfd, int port, char* addr, bool dolisten) else { this->Log(DEBUG,"New socket binding for %d with listen: %s:%d", sockfd, addr, port); - NonBlocking(sockfd); + SE->NonBlocking(sockfd); return true; } } @@ -477,7 +448,6 @@ int irc::sockets::OpenTCPSocket(char* addr, int socktype) } } -/* XXX: Probably belongs in class InspIRCd */ int InspIRCd::BindPorts(bool bail, int &ports_found, FailedPortList &failed_ports) { char configToken[MAXBUF], Addr[MAXBUF], Type[MAXBUF];