diff options
author | Jonas M. Gastal <jgastal@gmail.com> | 2012-06-11 22:27:03 -0300 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-09-26 04:03:51 +0200 |
commit | 4920090da0fc937d171065694d5274221d2747c9 (patch) | |
tree | 8959b519b3ebcf772fee2db640c0b2b4818a6e85 /src/network/socket/qnativesocketengine_unix.cpp | |
parent | aa9728450cc515c66545323646c66d826a1af50a (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.cpp | 40 |
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; } |