23 #include <config-network.h>
26 #include <sys/types.h>
27 #include <sys/socket.h>
29 #if defined(HAVE_UNISTD_H)
34 #include <QCoreApplication>
36 #define I_KNOW_KSOCKS_ISNT_PUBLIC
38 #undef I_KNOW_KSOCKS_ISNT_PUBLIC
43 using namespace KNetwork;
84 if (errno == EADDRINUSE)
86 else if (errno == EINVAL)
109 setOpenMode(ReadWrite | Unbuffered);
127 if (KSocks::self()->hasWorkingAsyncConnect())
144 if (errno == EISCONN)
146 else if (errno == EALREADY || errno == EINPROGRESS)
151 else if (errno == ECONNREFUSED)
153 else if (errno == ENETDOWN || errno == ENETUNREACH ||
154 errno == ENETRESET || errno == ECONNABORTED ||
155 errno == ECONNRESET || errno == EHOSTDOWN ||
156 errno == EHOSTUNREACH)
164 setOpenMode(ReadWrite | Unbuffered);
178 kde_socklen_t len =
sizeof(sa);
179 int newfd = KSocks::self()->accept(
m_sockfd, &sa, &len);
182 if (errno == EAGAIN || errno == EWOULDBLOCK)
198 retval = KSocks::self()->recvfrom(sockfd, data, maxlen, peek ? MSG_PEEK : 0, from->
address(), &len);
201 retval = KSocks::self()->recvfrom(sockfd, data, maxlen, peek ? MSG_PEEK : 0, NULL, NULL);
205 if (errno == EAGAIN || errno == EWOULDBLOCK)
222 if (maxlen == 0 || data == 0L)
230 setError(static_cast<SocketError>(err));
243 if (data == 0L || maxlen == 0)
251 setError(static_cast<SocketError>(err));
264 if (maxlen == 0 || data == 0L)
272 setError(static_cast<SocketError>(err));
285 if (data == 0L || maxlen == 0)
293 setError(static_cast<SocketError>(err));
311 if (data == 0L || len == 0)
317 if (errno == EAGAIN || errno == EWOULDBLOCK)
335 if (KSocks::self()->getsockname(
m_sockfd, localAddress.
address(), &len) == -1)
339 if (len <= localAddress.
length())
349 if (KSocks::self()->getsockname(
m_sockfd, localAddress.
address(), &len) == -1)
364 if (KSocks::self()->getpeername(
m_sockfd, peerAddress.
address(), &len) == -1)
368 if (len <= peerAddress.
length())
378 if (KSocks::self()->getpeername(
m_sockfd, peerAddress.
address(), &len) == -1)
401 fd_set readfds, writefds, exceptfds;
402 fd_set *preadfds = 0L, *pwritefds = 0L, *pexceptfds = 0L;
413 pwritefds = &writefds;
420 pexceptfds = &exceptfds;
428 retval = KSocks::self()->select(
m_sockfd + 1, preadfds, pwritefds, pexceptfds, 0L);
433 tv.tv_sec = timeout / 1000;
434 tv.tv_usec = timeout % 1000 * 1000;
436 retval = select(
m_sockfd + 1, preadfds, pwritefds, pexceptfds, &tv);
452 if (input && FD_ISSET(
m_sockfd, preadfds))
454 if (output && FD_ISSET(
m_sockfd, pwritefds))
456 if (exception && FD_ISSET(
m_sockfd, pexceptfds))
462 void KSocksSocketDevice::initSocks()
464 static bool init =
false;
469 if (QCoreApplication::instance() == 0L)
475 if (KSocks::self()->hasSocks())
480 static bool register()
485 static bool register = registered();