X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Flistensocket.cpp;h=8ac8babf3a5023580ab77af1acc192e38c49ff89;hb=4e40ee49bba3f7bab05a58516e2039351fb33069;hp=0bd6cb92b69616f46ee0b671d8273e712a5b4849;hpb=8fa7e20b6b47d4de617e1bba2773606df569f11d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/listensocket.cpp b/src/listensocket.cpp index 0bd6cb92b..8ac8babf3 100644 --- a/src/listensocket.cpp +++ b/src/listensocket.cpp @@ -1,16 +1,23 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009-2010 Daniel De Graaf + * Copyright (C) 2008 Robin Burchell * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + #include "inspircd.h" #include "socket.h" #include "socketengine.h" @@ -41,7 +48,7 @@ ListenSocket::ListenSocket(ConfigTag* tag, const irc::sockets::sockaddrs& bind_t if (bind_to.sa.sa_family == AF_INET6) { std::string addr = tag->getString("address"); - int enable = (addr.empty() || addr == "*") ? 0 : 1; + const char enable = (addr.empty() || addr == "*") ? 0 : 1; setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &enable, sizeof(enable)); // errors ignored intentionally } @@ -67,9 +74,10 @@ ListenSocket::~ListenSocket() if (this->GetFd() > -1) { ServerInstance->SE->DelFd(this); - ServerInstance->Logs->Log("SOCKET", DEBUG,"Shut down listener on fd %d", this->fd); - if (ServerInstance->SE->Shutdown(this, 2) || ServerInstance->SE->Close(this)) - ServerInstance->Logs->Log("SOCKET", DEBUG,"Failed to cancel listener: %s", strerror(errno)); + ServerInstance->Logs->Log("SOCKET", LOG_DEBUG,"Shut down listener on fd %d", this->fd); + ServerInstance->SE->Shutdown(this, 2); + if (ServerInstance->SE->Close(this) != 0) + ServerInstance->Logs->Log("SOCKET", LOG_DEBUG,"Failed to cancel listener: %s", strerror(errno)); this->fd = -1; } } @@ -83,7 +91,7 @@ void ListenSocket::AcceptInternal() socklen_t length = sizeof(client); int incomingSockfd = ServerInstance->SE->Accept(this, &client.sa, &length); - ServerInstance->Logs->Log("SOCKET",DEBUG,"HandleEvent for Listensocket %s nfd=%d", bind_desc.c_str(), incomingSockfd); + ServerInstance->Logs->Log("SOCKET",LOG_DEBUG,"HandleEvent for Listensocket %s nfd=%d", bind_desc.c_str(), incomingSockfd); if (incomingSockfd < 0) { ServerInstance->stats->statsRefused++; @@ -93,7 +101,7 @@ void ListenSocket::AcceptInternal() socklen_t sz = sizeof(server); if (getsockname(incomingSockfd, &server.sa, &sz)) { - ServerInstance->Logs->Log("SOCKET", DEBUG, "Can't get peername: %s", strerror(errno)); + ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "Can't get peername: %s", strerror(errno)); irc::sockets::aptosa(bind_addr, bind_port, server); } @@ -109,7 +117,7 @@ void ListenSocket::AcceptInternal() */ if (incomingSockfd >= ServerInstance->SE->GetMaxFds()) { - ServerInstance->Logs->Log("SOCKET", DEBUG, "Server is full"); + ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "Server is full"); ServerInstance->SE->Shutdown(incomingSockfd, 2); ServerInstance->SE->Close(incomingSockfd); ServerInstance->stats->statsRefused++; @@ -135,16 +143,14 @@ void ListenSocket::AcceptInternal() { // recreate as a sockaddr_in using the IPv4 IP uint16_t sport = client.in6.sin6_port; - uint32_t addr = *reinterpret_cast(client.in6.sin6_addr.s6_addr + 12); client.in4.sin_family = AF_INET; client.in4.sin_port = sport; - client.in4.sin_addr.s_addr = addr; + memcpy(&client.in4.sin_addr.s_addr, client.in6.sin6_addr.s6_addr + 12, sizeof(uint32_t)); sport = server.in6.sin6_port; - addr = *reinterpret_cast(server.in6.sin6_addr.s6_addr + 12); server.in4.sin_family = AF_INET; server.in4.sin_port = sport; - server.in4.sin_addr.s_addr = addr; + memcpy(&server.in4.sin_addr.s_addr, server.in6.sin6_addr.s6_addr + 12, sizeof(uint32_t)); } } @@ -168,7 +174,7 @@ void ListenSocket::AcceptInternal() else { ServerInstance->stats->statsRefused++; - ServerInstance->Logs->Log("SOCKET",DEFAULT,"Refusing connection on %s - %s", + ServerInstance->Logs->Log("SOCKET",LOG_DEFAULT,"Refusing connection on %s - %s", bind_desc.c_str(), res == MOD_RES_DENY ? "Connection refused by module" : "Module for this port not found"); ServerInstance->SE->Close(incomingSockfd); } @@ -179,10 +185,10 @@ void ListenSocket::HandleEvent(EventType e, int err) switch (e) { case EVENT_ERROR: - ServerInstance->Logs->Log("SOCKET",DEFAULT,"ListenSocket::HandleEvent() received a socket engine error event! well shit! '%s'", strerror(err)); + ServerInstance->Logs->Log("SOCKET",LOG_DEFAULT,"ListenSocket::HandleEvent() received a socket engine error event! well shit! '%s'", strerror(err)); break; case EVENT_WRITE: - ServerInstance->Logs->Log("SOCKET",DEBUG,"*** BUG *** ListenSocket::HandleEvent() got a WRITE event!!!"); + ServerInstance->Logs->Log("SOCKET",LOG_DEBUG,"*** BUG *** ListenSocket::HandleEvent() got a WRITE event!!!"); break; case EVENT_READ: this->AcceptInternal();