X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocket.cpp;h=0509f4bf35e224025b01b9973fc09a093d80457b;hb=76ebc88ccd6fef0bf2d97b607829fb3466e273af;hp=1821120f462f01ab5762dcf4178cf60ceafee1fc;hpb=552be206b2fbf6f590be4e536bb7cd757f6f29dd;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socket.cpp b/src/socket.cpp index 1821120f4..0509f4bf3 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -22,11 +22,9 @@ #include "helperfuncs.h" #include "socketengine.h" #include "wildcard.h" -#include "message.h" -extern InspIRCd* ServerInstance; -extern ServerConfig* Config; -extern time_t TIME; +using namespace std; +using namespace irc::sockets; /* Used when comparing CIDR masks for the modulus bits left over. * A lot of ircd's seem to do this: @@ -44,7 +42,7 @@ const char inverted_bits[8] = { 0x00, /* 00000000 - 0 bits - never actually used }; /* Match raw bytes using CIDR bit matching, used by higher level MatchCIDR() */ -bool MatchCIDRBits(unsigned char* address, unsigned char* mask, unsigned int mask_bits) +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 */ @@ -64,7 +62,7 @@ bool MatchCIDRBits(unsigned char* address, unsigned char* mask, unsigned int mas } /* Match CIDR, but dont attempt to match() against leading *!*@ sections */ -bool MatchCIDR(const char* address, const char* cidr_mask) +bool irc::sockets::MatchCIDR(const char* address, const char* cidr_mask) { return MatchCIDR(address, cidr_mask, false); } @@ -76,7 +74,7 @@ bool MatchCIDR(const char* address, const char* cidr_mask) * This will also attempt to match any leading usernames or nicknames on the mask, using * match(), when match_with_username is true. */ -bool MatchCIDR(const char* address, const char* cidr_mask, bool match_with_username) +bool irc::sockets::MatchCIDR(const char* address, const char* cidr_mask, bool match_with_username) { unsigned char addr_raw[16]; unsigned char mask_raw[16]; @@ -209,11 +207,24 @@ bool MatchCIDR(const char* address, const char* cidr_mask, bool match_with_usern return MatchCIDRBits(addr_raw, mask_raw, bits); } +inline void irc::sockets::Blocking(int s) +{ + int flags = fcntl(s, F_GETFL, 0); + fcntl(s, F_SETFL, flags ^ O_NONBLOCK); +} + +inline void irc::sockets::NonBlocking(int s) +{ + int flags = fcntl(s, F_GETFL, 0); + fcntl(s, F_SETFL, flags | O_NONBLOCK); +} + + /** 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'. */ -bool BindSocket(int sockfd, insp_sockaddr client, insp_sockaddr server, int port, char* addr) +bool InspIRCd::BindSocket(int sockfd, insp_sockaddr client, insp_sockaddr server, int port, char* addr) { memset(&server,0,sizeof(server)); insp_inaddr addy; @@ -275,7 +286,7 @@ bool BindSocket(int sockfd, insp_sockaddr client, insp_sockaddr server, int port // Open a TCP Socket -int OpenTCPSocket() +int irc::sockets::OpenTCPSocket() { int sockfd; int on = 1; @@ -297,9 +308,10 @@ int OpenTCPSocket() } } -bool HasPort(int port, char* addr) +/* XXX: Probably belongs in class InspIRCd */ +bool InspIRCd::HasPort(int port, char* addr) { - for (unsigned long count = 0; count < ServerInstance->stats->BoundPortCount; count++) + for (unsigned long count = 0; count < stats->BoundPortCount; count++) { if ((port == Config->ports[count]) && (!strcasecmp(Config->addrs[count],addr))) { @@ -309,7 +321,8 @@ bool HasPort(int port, char* addr) return false; } -int BindPorts(bool bail) +/* XXX: Probably belongs in class InspIRCd */ +int InspIRCd::BindPorts(bool bail) { char configToken[MAXBUF], Addr[MAXBUF], Type[MAXBUF]; insp_sockaddr client, server; @@ -318,7 +331,7 @@ int BindPorts(bool bail) if (!bail) { - int InitialPortCount = ServerInstance->stats->BoundPortCount; + int InitialPortCount = stats->BoundPortCount; log(DEBUG,"Initial port count: %d",InitialPortCount); for (int count = 0; count < Config->ConfValueEnum(Config->config_data, "bind"); count++) @@ -347,19 +360,27 @@ int BindPorts(bool bail) if ((Config->openSockfd[count] = OpenTCPSocket()) == ERROR) { log(DEBUG,"Bad fd %d binding port [%s:%d]",Config->openSockfd[count],Config->addrs[count],Config->ports[count]); - return ERROR; - } - if (!BindSocket(Config->openSockfd[count],client,server,Config->ports[count],Config->addrs[count])) - { - log(DEFAULT,"Failed to bind port [%s:%d]: %s",Config->addrs[count],Config->ports[count],strerror(errno)); } else { - /* Associate the new open port with a slot in the socket engine */ - if (Config->openSockfd[count] > -1) + if (!BindSocket(Config->openSockfd[count],client,server,Config->ports[count],Config->addrs[count])) + { + log(DEFAULT,"Failed to bind port [%s:%d]: %s",Config->addrs[count],Config->ports[count],strerror(errno)); + } + else { - ServerInstance->SE->AddFd(Config->openSockfd[count],true,X_LISTEN); - BoundPortCount++; + /* Associate the new open port with a slot in the socket engine */ + if (Config->openSockfd[count] > -1) + { + if (!SE->AddFd(Config->openSockfd[count],true,X_LISTEN)) + { + log(DEFAULT,"ERK! Failed to add listening port to socket engine!"); + shutdown(Config->openSockfd[count],2); + close(Config->openSockfd[count]); + } + else + BoundPortCount++; + } } } } @@ -403,39 +424,31 @@ int BindPorts(bool bail) if ((Config->openSockfd[BoundPortCount] = OpenTCPSocket()) == ERROR) { log(DEBUG,"Bad fd %d binding port [%s:%d]",Config->openSockfd[BoundPortCount],Config->addrs[count],Config->ports[count]); - return ERROR; - } - - if (!BindSocket(Config->openSockfd[BoundPortCount],client,server,Config->ports[count],Config->addrs[count])) - { - log(DEFAULT,"Failed to bind port [%s:%d]: %s",Config->addrs[count],Config->ports[count],strerror(errno)); } else { - /* well we at least bound to one socket so we'll continue */ - BoundPortCount++; + if (!BindSocket(Config->openSockfd[BoundPortCount],client,server,Config->ports[count],Config->addrs[count])) + { + log(DEFAULT,"Failed to bind port [%s:%d]: %s",Config->addrs[count],Config->ports[count],strerror(errno)); + } + else + { + /* well we at least bound to one socket so we'll continue */ + BoundPortCount++; + } } } - - /* if we didn't bind to anything then abort */ - if (!BoundPortCount) - { - log(DEFAULT,"No ports bound, bailing!"); - printf("\nERROR: Could not bind any of %d ports! Please check your configuration.\n\n", PortCount); - return ERROR; - } - return BoundPortCount; } -const char* insp_ntoa(insp_inaddr n) +const char* irc::sockets::insp_ntoa(insp_inaddr n) { static char buf[1024]; inet_ntop(AF_FAMILY, &n, buf, sizeof(buf)); return buf; } -int insp_aton(const char* a, insp_inaddr* n) +int irc::sockets::insp_aton(const char* a, insp_inaddr* n) { return inet_pton(AF_FAMILY, a, n); }