summaryrefslogtreecommitdiff
path: root/src/socket_clients.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket_clients.cpp')
-rw-r--r--src/socket_clients.cpp96
1 files changed, 96 insertions, 0 deletions
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<char *>(&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<char *>(&optval), &optlen);
+ errno = optval;
+ this->OnError(optval ? Anope::LastError() : "");
+}
+
+void ClientSocket::OnAccept()
+{
+}
+
+void ClientSocket::OnError(const Anope::string &error)
+{
+}
+