diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-04-07 16:18:32 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-04-07 16:18:32 +0000 |
commit | 18310fc8b7dbb0dcda3f0fa10d2b37e2b1457c10 (patch) | |
tree | a1129d1cff5ff02d2b4f16dd539f836ca0d66f05 | |
parent | c1c6d3f447185e3b4e90d0bfe379dddcd78253a5 (diff) |
We were lucky this one didnt bring down the whole devnet (see cmd_part.cpp diff)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9400 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | include/socket.h | 9 | ||||
-rw-r--r-- | src/commands/cmd_part.cpp | 2 | ||||
-rw-r--r-- | src/socket.cpp | 39 |
3 files changed, 32 insertions, 18 deletions
diff --git a/include/socket.h b/include/socket.h index 53bad88f0..7ff40794c 100644 --- a/include/socket.h +++ b/include/socket.h @@ -157,6 +157,15 @@ class CoreExport ListenSocket : public EventHandler std::string bind_addr; /** Port socket is bound to */ int bind_port; + + static sockaddr *sock_us; + + static sockaddr *client; + + static sockaddr *raddr; + + static unsigned int socketcount; + public: /** Create a new listening socket */ diff --git a/src/commands/cmd_part.cpp b/src/commands/cmd_part.cpp index 002ae722b..360287c45 100644 --- a/src/commands/cmd_part.cpp +++ b/src/commands/cmd_part.cpp @@ -37,7 +37,7 @@ CmdResult CommandPart::Handle (const char* const* parameters, int pcnt, User *us } else { - reason = pcnt ? parameters[1] : ""; + reason = pcnt > 1 ? parameters[1] : ""; } if (ServerInstance->Parser->LoopCall(user, this, parameters, pcnt, 0)) diff --git a/src/socket.cpp b/src/socket.cpp index e48184694..fc48d219e 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -20,6 +20,12 @@ using namespace irc::sockets; +/* Private static member data must be initialized in this manner */ +unsigned int ListenSocket::socketcount = 0; +sockaddr* ListenSocket::sock_us = NULL; +sockaddr* ListenSocket::client = NULL; +sockaddr* ListenSocket::raddr = NULL; + /* Used when comparing CIDR masks for the modulus bits left over. * A lot of ircd's seem to do this: * ((-1) << (8 - (mask % 8))) @@ -51,6 +57,15 @@ ListenSocket::ListenSocket(InspIRCd* Instance, int port, char* addr) : ServerIns this->family = AF_INET; Instance->SE->AddFd(this); } + /* Saves needless allocations */ + if (socketcount == 0) + { + /* All instances of ListenSocket share these, so reference count it */ + sock_us = new sockaddr[2]; + client = new sockaddr[2]; + raddr = new sockaddr[2]; + } + socketcount++; } ListenSocket::~ListenSocket() @@ -63,26 +78,20 @@ ListenSocket::~ListenSocket() ServerInstance->Logs->Log("SOCKET", DEBUG,"Failed to cancel listener: %s", strerror(errno)); this->fd = -1; } + socketcount--; + if (socketcount == 0) + { + delete[] sock_us; + delete[] client; + delete[] raddr; + } } - -// XXX this is a bit of an untidy way to avoid reallocating this constantly. also, we leak it on shutdown.. but that's kinda minor - w -static sockaddr *sock_us; -static sockaddr *client; -static bool setup_sock = false; - void ListenSocket::HandleEvent(EventType, int) { socklen_t uslen, length; // length of our port number int incomingSockfd, in_port; - if (!setup_sock) - { - sock_us = new sockaddr[2]; - client = new sockaddr[2]; - setup_sock = true; - } - #ifdef IPV6 if (this->family == AF_INET6) { @@ -105,8 +114,6 @@ void ListenSocket::HandleEvent(EventType, int) *target = *buf = '\0'; - sockaddr* raddr = new sockaddr[2]; - #ifdef IPV6 if (this->family == AF_INET6) { @@ -131,8 +138,6 @@ void ListenSocket::HandleEvent(EventType, int) } - delete[] raddr; - ServerInstance->SE->NonBlocking(incomingSockfd); ServerInstance->stats->statsAccept++; |