/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
- * Copyright (C) 2005-2008 Craig Edwards <craigedwards@brainbox.cc>
- * Copyright (C) 2007 Burlex <???@???>
+ * Copyright (C) 2017-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2013-2014 Adam <Adam@anope.org>
+ * Copyright (C) 2012, 2014-2015 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2012 ChrisTX <xpipe@hotmail.de>
+ * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2008, 2017 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2007 burlex <burlex@e03df62e-2008-0410-955e-edbf42e46eb7>
* Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2006-2008, 2010 Craig Edwards <brain@inspircd.org>
*
* 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
event_mask = 0;
}
+void EventHandler::SwapInternals(EventHandler& other)
+{
+ std::swap(fd, other.fd);
+ std::swap(event_mask, other.event_mask);
+}
+
void EventHandler::SetFd(int FD)
{
this->fd = FD;
void SocketEngine::InitError()
{
std::cerr << con_red << "FATAL ERROR!" << con_reset << " Socket engine initialization failed. " << strerror(errno) << '.' << std::endl;
- ServerInstance->QuickExit(EXIT_STATUS_SOCKETENGINE);
+ exit(EXIT_STATUS_SOCKETENGINE);
}
void SocketEngine::LookupMaxFds()
{
+#if defined _WIN32
+ MaxSetSize = FD_SETSIZE;
+#else
struct rlimit limits;
if (!getrlimit(RLIMIT_NOFILE, &limits))
MaxSetSize = limits.rlim_cur;
#endif
if (!setrlimit(RLIMIT_NOFILE, &limits))
MaxSetSize = limits.rlim_cur;
+#endif
}
void SocketEngine::ChangeEventMask(EventHandler* eh, int change)
bool SocketEngine::BoundsCheckFd(EventHandler* eh)
{
- if (!eh)
- return false;
- if (eh->GetFd() < 0)
- return false;
- return true;
+ return eh && eh->HasFd();
}
return nbRecvd;
}
-int SocketEngine::SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen)
+int SocketEngine::SendTo(EventHandler* fd, const void* buf, size_t len, int flags, const irc::sockets::sockaddrs& address)
{
- int nbSent = sendto(fd->GetFd(), (const char*)buf, len, flags, to, tolen);
+ int nbSent = sendto(fd->GetFd(), (const char*)buf, len, flags, &address.sa, address.sa_size());
stats.UpdateWriteCounters(nbSent);
return nbSent;
}
}
#endif
-int SocketEngine::Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen)
+int SocketEngine::Connect(EventHandler* fd, const irc::sockets::sockaddrs& address)
{
- int ret = connect(fd->GetFd(), serv_addr, addrlen);
+ int ret = connect(fd->GetFd(), &address.sa, address.sa_size());
#ifdef _WIN32
if ((ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEWOULDBLOCK))
errno = EINPROGRESS;