summaryrefslogtreecommitdiffstats
path: root/src/network/socket/qnativesocketengine_unix.cpp
diff options
context:
space:
mode:
authorJonas M. Gastal <jgastal@gmail.com>2012-06-11 22:27:03 -0300
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-09-26 04:03:51 +0200
commit4920090da0fc937d171065694d5274221d2747c9 (patch)
tree8959b519b3ebcf772fee2db640c0b2b4818a6e85 /src/network/socket/qnativesocketengine_unix.cpp
parentaa9728450cc515c66545323646c66d826a1af50a (diff)
If accept fails, stop accepting new connections and emit error signal.
Task-number: QTBUG-24778 Change-Id: I6c5b685b3f861a0fafc1475c41bb35cede17d712 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/socket/qnativesocketengine_unix.cpp')
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 3f6b6b556c..224bee8fd6 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -588,6 +588,46 @@ bool QNativeSocketEnginePrivate::nativeListen(int backlog)
int QNativeSocketEnginePrivate::nativeAccept()
{
int acceptedDescriptor = qt_safe_accept(socketDescriptor, 0, 0);
+ if (acceptedDescriptor == -1) {
+ switch (errno) {
+ case EBADF:
+ case EOPNOTSUPP:
+ setError(QAbstractSocket::UnsupportedSocketOperationError, InvalidSocketErrorString);
+ break;
+ case ECONNABORTED:
+ setError(QAbstractSocket::NetworkError, RemoteHostClosedErrorString);
+ break;
+ case EFAULT:
+ case ENOTSOCK:
+ setError(QAbstractSocket::SocketResourceError, NotSocketErrorString);
+ break;
+ case EPROTONOSUPPORT:
+ case EPROTO:
+ case EAFNOSUPPORT:
+ case EINVAL:
+ setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString);
+ break;
+ case ENFILE:
+ case EMFILE:
+ case ENOBUFS:
+ case ENOMEM:
+ setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
+ break;
+ case EACCES:
+ case EPERM:
+ setError(QAbstractSocket::SocketAccessError, AccessErrorString);
+ break;
+#if EAGAIN != EWOULDBLOCK
+ case EWOULDBLOCK:
+#endif
+ case EAGAIN:
+ setError(QAbstractSocket::TemporaryError, TemporaryErrorString);
+ break;
+ default:
+ setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString);
+ break;
+ }
+ }
return acceptedDescriptor;
}