From 2eb708e5ad8b259876d24d828f7472b77864c256 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 21 Aug 2011 13:38:42 -0400 Subject: Cleaned up some of the socket code, cleaned up the pipe engines, added support for binary sockets, and cleaned up the asynch connect/accept code --- src/socket_clients.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/socket_clients.cpp (limited to 'src/socket_clients.cpp') diff --git a/src/socket_clients.cpp b/src/socket_clients.cpp new file mode 100644 index 000000000..4a43629a4 --- /dev/null +++ b/src/socket_clients.cpp @@ -0,0 +1,96 @@ +/* + * + * (C) 2003-2011 Anope Team + * Contact us at team@anope.org + * + * Please read COPYING and README for further details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + */ + +#include "services.h" + +ConnectionSocket::ConnectionSocket() : Socket() +{ +} + +void ConnectionSocket::Connect(const Anope::string &TargetHost, int Port) +{ + this->IO->Connect(this, TargetHost, Port); +} + +bool ConnectionSocket::Process() +{ + try + { + if (this->HasFlag(SF_CONNECTED)) + return true; + else if (this->HasFlag(SF_CONNECTING)) + this->SetFlag(this->IO->FinishConnect(this)); + else + this->SetFlag(SF_DEAD); + } + catch (const SocketException &ex) + { + Log() << ex.GetReason(); + } + return false; +} + +void ConnectionSocket::ProcessError() +{ + int optval = 0; + socklen_t optlen = sizeof(optval); + getsockopt(this->GetFD(), SOL_SOCKET, SO_ERROR, reinterpret_cast(&optval), &optlen); + errno = optval; + this->OnError(optval ? Anope::LastError() : ""); +} + +void ConnectionSocket::OnConnect() +{ +} + +void ConnectionSocket::OnError(const Anope::string &) +{ +} + +ClientSocket::ClientSocket(ListenSocket *ls, const sockaddrs &addr) : Socket(), LS(ls), clientaddr(addr) +{ +} + +bool ClientSocket::Process() +{ + try + { + if (this->HasFlag(SF_ACCEPTED)) + return true; + else if (this->HasFlag(SF_ACCEPTING)) + this->SetFlag(this->IO->FinishAccept(this)); + else + this->SetFlag(SF_DEAD); + } + catch (const SocketException &ex) + { + Log() << ex.GetReason(); + } + return false; +} + +void ClientSocket::ProcessError() +{ + int optval = 0; + socklen_t optlen = sizeof(optval); + getsockopt(this->GetFD(), SOL_SOCKET, SO_ERROR, reinterpret_cast(&optval), &optlen); + errno = optval; + this->OnError(optval ? Anope::LastError() : ""); +} + +void ClientSocket::OnAccept() +{ +} + +void ClientSocket::OnError(const Anope::string &error) +{ +} + -- cgit