summaryrefslogtreecommitdiff
path: root/src/sockets.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2014-02-05 15:26:03 -0500
committerAdam <Adam@anope.org>2014-02-05 15:26:03 -0500
commit66cc965fd736a7785247a6c058c4bfacfe5ea02f (patch)
tree93f38cc6dc1d2e187d027a54b392d168b7626e1d /src/sockets.cpp
parent2440514a7b53a43aa2efe8a0ef45f79d7a3710a8 (diff)
Ignore nonblocking errnors on socket operations
Diffstat (limited to 'src/sockets.cpp')
-rw-r--r--src/sockets.cpp38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/sockets.cpp b/src/sockets.cpp
index e71505d44..948f3e238 100644
--- a/src/sockets.cpp
+++ b/src/sockets.cpp
@@ -348,15 +348,17 @@ size_t cidr::hash::operator()(const cidr &s) const
int SocketIO::Recv(Socket *s, char *buf, size_t sz)
{
- size_t i = recv(s->GetFD(), buf, sz, 0);
- TotalRead += i;
+ int i = recv(s->GetFD(), buf, sz, 0);
+ if (i > 0)
+ TotalRead += i;
return i;
}
int SocketIO::Send(Socket *s, const char *buf, size_t sz)
{
- size_t i = send(s->GetFD(), buf, sz, 0);
- TotalWritten += i;
+ int i = send(s->GetFD(), buf, sz, 0);
+ if (i > 0)
+ TotalWritten += i;
return i;
}
@@ -402,7 +404,7 @@ void SocketIO::Connect(ConnectionSocket *s, const Anope::string &target, int por
int c = connect(s->GetFD(), &s->conaddr.sa, s->conaddr.size());
if (c == -1)
{
- if (Anope::LastErrorCode() != EINPROGRESS)
+ if (!SocketEngine::IgnoreErrno())
s->OnError(Anope::LastError());
else
{
@@ -542,3 +544,29 @@ bool ListenSocket::ProcessRead()
return true;
}
+int SocketEngine::GetLastError()
+{
+#ifndef _WIN32
+ return errno;
+#else
+ return WSAGetLastError();
+#endif
+}
+
+void SocketEngine::SetLastError(int err)
+{
+#ifndef _WIN32
+ errno = err;
+#else
+ WSASetLastError(err);
+#endif
+}
+
+bool SocketEngine::IgnoreErrno()
+{
+ return GetLastError() == EAGAIN
+ || GetLastError() == EWOULDBLOCK
+ || GetLastError() == EINTR
+ || GetLastError() == EINPROGRESS;
+}
+